60652


Visual Studio2017で特徴点を抽出するプログラムを作成しているのですがリンカエラーでうまいこと行きません。  
ソースコードは [Facemark : Facial Landmark Detection using
OpenCV](https://www.learnopencv.com/facemark-facial-landmark-detection-using-
opencv/) にあるものを使用しています。ただし、少しだけ変えていますがおおむね同じです。

**変更点**

変更前: `Ptr<Facemark>facemark= FacemarkLBF::create();`  
変更後: `Ptr<Facemark>facemark= 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を使用しています。  
どのようにすれば解決できるか教えてください。


CC BY-SA 4.0
2019-11-19T03:41:27.540
60651
2019-11-19T19:39:24.123
2019-11-19T04:06:04.113
3060
36685
question
c++ opencv
OpenCV のリンカエラー 2019 facemarkを使って顔の特徴点を抽出するプログラム


k
systemさんの調査によるとcontribパッケージに含まれており、配布されているバイナリには含まれていないとのこと。そしてcontribの自前でのビルド方法についてコメントされていますが…もっと簡単にビルドできます。

Visual
Studioでは[vcpkg](https://github.com/microsoft/vcpkg)というパッケージマネージャーが提供されています。vcpkgではOpenCVも提供されています。

## vcpkgの導入方法

Visual Studioおよびgitが使用可能なコマンドプロンプトで

[code]

    git clone https://github.com/Microsoft/vcpkg.git
    cd vcpkg
    bootstrap-vcpkg.bat
    vcpkg integrate install
    
[/code]

まで実行するとvcpkgが導入され、vcpkgでインストールされたパッケージをプロジェクトから参照できます。

## OpenCVの導入方法

[code]

    vcpkg install opencv[world,contrib]
    
[/code]

でOpenCVのworld機能とcontrib機能をビルド・インストールできます。


CC BY-SA 4.0
2019-11-19T05:53:10.187
60652
2019-11-19T19:39:24.123
2019-11-19T19:39:24.123
4236
4236
60651
answer


OpenCV を久しぶりに使いたくなったので調べてみました。  
ネットにある日本語での解説内容では、いまいち 動作しない点があったので  
本家サイトの情報を見ながら試してみました。

> opencv_face*.lib のライブラリが存在しない。

<https://answers.opencv.org/question/217298/opencvjs-building-wasm-
cvfacecreatefacemarklbf/>  
に書かれている内容だと まだ不安定なので contrib パッケージに入っているそうです。

contrib パッケージは ソースからビルドするしか入手する方法がありません。

<https://github.com/opencv/opencv_contrib> に書いている ビルド手順を参考にビルドします。

## ダウンロードとインストール

<https://github.com/opencv/opencv/releases>  
から  
opencv-4.1.2-vc14_vc15.exe  
をダウンロードして  
`c:\` に展開  
`c:\OpenCV` ディレクトリ が作成されその中に

[code]

    C:\opencv\build
    C:\opencv\sources
    
[/code]

のように展開されました。

<https://cmake.org/download/>

から cmake-3.16.0-rc4-win64-x64.msi をダウンロードしてインストールします。

<https://github.com/opencv/opencv_contrib/releases>

から openCV と同じバージョンのリリースソースをダウンロードして

`C:\opencv\contrib`

フォルダに展開

[code]

    C:\opencv\contrib\doc
    C:\opencv\contrib\modules
    C:\opencv\contrib\samples
    
[/code]

のように展開しました。

## ビルド

  1. cmake-gui を起動する。

  2. opencv ソースフォルダとビルド フォルダを選択する。

今回は `C:/opencv/sources` と `C:/opencv/build`

  3. `configure` ボタンをクリックする。 OpenCV のビルドパラメータが 画面の中ほどに表示される。

  4. パラメータの中から `OPENCV_EXTRA_MODULES_PATH` を探す。

  5. `OPENCV_EXTRA_MODULES_PATH` のパス名を ファイルを開くボタン [...] を使って `<opencv_contrib>/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用 をビルドしてそちらを参照するように設定してもいいかもしれません。


CC BY-SA 4.0
2019-11-19T18:07:44.847
60667
2019-11-19T18:07:44.847
18851
60651
answer