質問: Visual Studio2017で特徴点を抽出するプログラムを作成しているのですがリンカエラーでうまいこと行きません。 ソースコードは Facemark : Facial Landmark Detection using OpenCV にあるものを使用しています。ただし、少しだけ変えていますがおおむね同じです。 **変更点** 変更前: `Ptrfacemark= FacemarkLBF::create();` 変更後: `Ptrfacemark= createFacemarkLBF();` しかし、ビルドしても以下のようなエラーが出てうまくいきません。 "エラー LNK2019 未解決の外部シンボル "struct cv::Ptr __cdecl cv::face::createFacemarkLBF(void)" (?createFacemarkLBF@face@cv@@YA?AU?$Ptr@VFacemark@face@cv@@@2@XZ) が関数 main で参照されました。" ライブラリファイルを追加したり、OpenCVを一度入れ直したりしましたが駄目でした。 ちなみに、変更する前でも似たよう部分でリンカエラーが出ます。 OpenCVは4.1.1を使用しています。 どのようにすれば解決できるか教えてください。
回答: OpenCV を久しぶりに使いたくなったので調べてみました。 ネットにある日本語での解説内容では、いまいち 動作しない点があったので 本家サイトの情報を見ながら試してみました。 > > opencv_face*.lib のライブラリが存在しない。 > > > に書かれている内容だと まだ不安定なので contrib パッケージに入っているそうです。 contrib パッケージは ソースからビルドするしか入手する方法がありません。 に書いている ビルド手順を参考にビルドします。 ダウンロードとインストール から opencv-4.1.2-vc14_vc15.exe をダウンロードして `c:\` に展開 `c:\OpenCV` ディレクトリ が作成されその中に ``` C:\opencv\build C:\opencv\sources ``` のように展開されました。 から cmake-3.16.0-rc4-win64-x64.msi をダウンロードしてインストールします。 から openCV と同じバージョンのリリースソースをダウンロードして `C:\opencv\contrib` フォルダに展開 ``` C:\opencv\contrib\doc C:\opencv\contrib\modules C:\opencv\contrib\samples ``` のように展開しました。 ビルド 1. cmake-gui を起動する。 2. opencv ソースフォルダとビルド フォルダを選択する。 今回は `C:/opencv/sources` と `C:/opencv/build` 3. `configure` ボタンをクリックする。 OpenCV のビルドパラメータが 画面の中ほどに表示される。 4. パラメータの中から `OPENCV_EXTRA_MODULES_PATH` を探す。 5. `OPENCV_EXTRA_MODULES_PATH` のパス名を ファイルを開くボタン [...] を使って `/modules` に選択する。 ※ **重要**。 パス名が `C:/opencv/build/install` の形式 (バックスラッシュではなく スラッシュ)で 指定されていないと CMake の `configure` でエラーとなります。必ず [...] ボタンを使ってディレクトリを選択してください。 6. `configure` ボタンを押して 次に、 `generate` ボタンを押す。 (最初にどの種類の Makefile にするか聞かれます。) ※ 私は Visual Studio 2019 Community Edition だったので Visual Studio 2019 形式を選択しました。 7. `Open Project` ボタンをクリックして Visual Studio を起動して ソリューションエクスプローラーの `CMakeTargets` フォルダの中にある `ALL_BUILD` を選択して ビルドします。 ※ ビルドが完了するまでしばらく待ちます。 ※ `C:\opencv\build\include` に include ファイルが作成され `C:\opencv\build\lib\Debug` に *.lib ファイルが `C:\opencv\build\bin\Debug` に *.dll ファイルが作成されます。 8. プロジェクトの リンク設定で ライブラリパスや リンクする .lib ファイル、 実行時に 参照する DLL のパス等を設定してビルドします。 ビルドする *.lib , *.dll の X86 と X64 の選択をやり直すには cmake-gui で `Delete Cache` をしてから `configure` をします。 OpenCV のアプリのビルドと実行 include 設定 `C:\opencv\build\include` を指定します。 contrib なモジュールを利用する時は その モジュールの フォルダにある include ファイルを include します。例: `C:\opencv\contrib\modules\face\include` ライブラリディレクトリは `C:\opencv\build\lib\Debug` を指定して デバッグの設定で 環境に `PATH=C:\opencv\build\bin\Debug;$(Path)` と書くと そこにある OpenCV の DLL を見に行ってくれます。 また、x86 設定と x64 設定の それぞれで 別の *.lib , *.dll を指定する必要があるので x86 用と x64用 をビルドしてそちらを参照するように設定してもいいかもしれません。