質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

受付中

Visual Studio 2017 C++ Tesseract 4.1.0 OpenCV 4.0.1 ビルド後のサンプルコードのエラーについて

omednan118
omednan118

総合スコア10

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0評価

1クリップ

7471閲覧

投稿2019/03/11 10:10

前提・実現したいこと

Tesseract OCRをインストールして、OpenCVでサンプルコードを動かしたいです。

環境
・Windows 10 64bit
・Visual Studio 2017
・Tesseract 4.1.0
・OpenCV 4.0.1
・OpenCV_contrib 4.0.1
・CMake 3.14.0-rc3
・vcpkg

Visual StudioとOpenCVをインストールして、
OpenCVの動作確認はできています。

また、コマンドプロンプトを使い、vcpkgでTesseractをインストールし、
CMakeでOpenCV_contribを"Configure"し、
Tesseractも"Configure"した後、"Gnerate"しました。
OpenCV.slnをVS2017で開き、x64のreleaseで、
バッチビルドにより、INSTALLとALL_BUILDのビルドに成功しています。

この方法は、以下のサイトを参考にしています。
https://qiita.com/lilac0011/items/9fe6e061c3a036689a36

発生している問題・エラーメッセージ

問題はここからです。

無事ビルドが完了し、下記のサンプルコードをデバッグしたところ、
以下2つのエラーが発生してサンプルコードが動きません。

プロジェクトのプロパティは以下の通り設定しました。

■ 追加のインクルードディレクトリ
C:\opencv\vcpkg-master\installed\x64-windows\include;
C:\opencv\build\include;%(AdditionalIncludeDirectories)
■ 追加のライブラリディレクトリ
C:\opencv\build\x64\vc15\lib;%(AdditionalLibraryDirectories)
■ 追加の依存ファイル
opencv_world401d.lib;%(AdditionalDependencies)
(その他インストール直後の初期ファイル)

ググっても情報が少ないため自己解決できません。
Tesseractの導入に詳しい方、ご教授お願いします。

LNK2019 未解決の外部シンボル "public: static struct cv::Ptr<class cv::text::OCRTesseract> __cdecl cv::text::OCRTesseract::create(char const *,char const *,char const *,int,int)" (?create@OCRTesseract@text@cv@@SA?AU?$Ptr@VOCRTesseract@text@cv@@@3@PEBD00HH@Z) が関数 main で参照されました。 TesseractTest C:\Users\Taro\source\repos\TesseractTest\TesseractTest\TesseractTest.obj LNK1120 1件の未解決の外部参照 TesseractTest C:\Users\Taro\source\repos\TesseractTest\x64\Debug\TesseractTest.exe

該当のソースコード

C++

ソースコード #include <opencv2/opencv.hpp> #include <opencv2/text.hpp> using namespace cv; using namespace cv::dnn; using namespace std; void main() { // 画像読み込み auto image = cv::imread("moji.jpg"); // グレースケール化 cv::Mat gray; cv::cvtColor(image, gray, COLOR_RGB2GRAY); // 文字認識クラスのインスタンス生成 auto ocr = cv::text::OCRTesseract::create("C:\opencv\tesseract\tessdata", "jpn"); std::string text; std::vector<cv::Rect> boxes; std::vector<std::string> words; vector<float> confidences; // 文字認識の実行 ocr->run(gray, text, &boxes, &words, &confidences); // 結果出力 printf("%s\n", text.c_str()); // 文字のかたまりごとに出力 printf(" 文字 | 位置 | 大きさ | 信頼度\n"); printf("-----------+------------+------------+----------\n"); for (int i = 0; i < boxes.size(); i++) { printf("%-10s | (%3d, %3d) | (%3d, %3d) | %f\n", words[i].c_str(), boxes[i].x, boxes[i].y, boxes[i].width, boxes[i].height, confidences[i]); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

omednan118

2019/03/11 11:02

コメントありがとうございます。 上記URLの質問者は、ビルドまでたどり着いていないので、私の問題とは少し違いますね。
iwanote

2019/03/12 08:26

環境変数大丈夫ですか?
iwanote

2019/03/14 12:39

tesseractを使用するには、vcpkgの「\installed\x64-windows\bin」以下にあるdllも必要。環境変数にここも含めるか、丸々コピーして使ってください。当然opencv_world400.dllも。 らしいですが大丈夫ですか?
omednan118

2019/03/14 13:27

環境変数も含めることも丸々コピーも両方やりましたが、ダメでした。 参考サイトに書いてあることは一通り試したはずです。
iwanote

2019/03/14 14:01

全然的外れかもしれないですけどreleaseビルドしてるのになんで401d.libなんだろうかと疑問があります
omednan118

2019/03/14 14:17

書き忘れましたが、追加の依存ファイルには「opencv_world401d.lib」と「opencv_world401.lib」を両方入れてあります。 確かに、ビルドするときにReleaseしかしていなかったと思うので、Debugもビルドしてみます。
omednan118

2019/03/16 09:00

Debugでビルドするとエラーが大量に発生します。 Debugで実行しても2つのエラーは残ったままです。 まだ解決していないので、回答募集中です。
t_obara

2019/03/25 01:31

未解決の外部シンボルということは、利用したいライブラリのリンクをしようとしているが、シンボルが見当たらないという意味です。インポートライブラリが適切に指定されていないあるいは、ライブラリパスの指定が適切でない可能性が高いです。特にTesseract_LIBRARYに関する環境変数が適切かよくご確認ください。
omednan118

2019/03/25 12:56

Cmakeの「Tesseract_LIBRARY」は C:\opencv-4.0.1\vcpkg-master\installed\x64-windows\lib を設定しています。このフォルダには、 pkgconfig, gif.lib, icudt.lib, icuin.lib, icuio.lib, icutu.lib, icuuc.lib, jpeg.lib, leptonica-1.76.0.lib, libpng16.lib, lzma.lib, pkgconfig, tesseract40.lib, tiff.lib, tiffxx.lib, turbojpeg.lib, zlib.lib の1個のフォルダと15個のファイルがあります。 Tesseract_LIBRARYに関する環境変数とは、具体的に何を指すのでしょうか?
omednan118

2019/03/25 13:06

ちなみに、CMake 3.14.0-rc3は使用できなくなり、現在はCMake 3.14.0を使用しています。 vcpkgは1週間程度で更新され、常に最新版をダウンロードしてインストールしないと、エラーになります。 C#のTesseractSharp(Nuget)とAndroid StudioのTess-Twoは、インストールに成功しましたが、C++では未だにTesseractのインストールに成功していません。 まだまだ回答募集中です。
t_obara

2019/03/26 01:49

Tesseract_LIBRARYはパスではなくインポートライブラリtesseract40.libをフルパスで設定する様です。
omednan118

2019/03/26 03:45

コメントありがとうございます。 すみません、上記は書き間違えで、 Cmakeの「Tesseract_LIBRARY」は C:\opencv\vcpkg-master\installed\x64-windows\lib\tesseract40.lib で設定していましたので、別の原因があるようです。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。