OpenCVをCMakeとVsiaulStudiio2019でビルドする

ダウンロードした OpenCV の bin フォルダに DLL 入ってなくね?Lib はどこ…?

え、自分でビルドするんだよ、え、マジで?

まぁ、C++er なら普通のことですが…

…という事でまぁこういった事はプロジェクト初期には割と毎回発生する、というか、Windows民は大抵のライブラリは自分でビルドしてLibとDLLを作成することになるので手順をまとめてみました。

実行環境

今回の実験環境は以下の通りです。

  • Windows10
  • VisualStudio2019
  • OpenCV 4.5.2
  • CMake 3.20.3が導入済みで環境変数にパスが通っている事

CMakeあたりの手順なほかのプロジェクトにも汎用で使えるので、OpenCVじゃなくて大体イケます。

OpenCVの準備

まず、OpenCV のサイトからパッケージをダウンロードしてきます。

https://opencv.org/

Library > Releases を選択して OpenCV 4.5.2 の Windows をクリックしてパッケージをダウンロードします。

f:id:Takachan:20210603214536p:plain

通常、SourceForge にリダイレクトされダウンロードが自動で始まるので終わるまで待ちます。

自己解凍形式の実行形式ファイル「opencv-4.5.2-vc14_vc15.exe」がダウンロードされているのでこれを実行します。

解答場所は適当ですが今回は「C:\temp」を指定します。なんか解凍がかなり遅いので7zipとかで展開しても良いです。(exeですがzipのように解凍できます)

CMakeでVisualStudio用のソリューションを作成する

CMake の GUI を使って VisualStudio 用のソリューションを作成します。

CMakeのフォルダに cmake-gui.exe というツールが入っているので起動します。

ツールを起動したら以下のように入力し「Configure」ボタンを押します。

f:id:Takachan:20210603214552p:plain

「Where is the source code」に「C:/temp/opencv/sources」を指定します。これは「CMakeLists.txt」がある場所です。

次に「Where to build the binaries」に「C:/temp/opencv/build-self」を指定します。慣例で「build」とする事が多いですが OpenCV の場合既に存在するため新しい別のフォルダを用意します。

f:id:Takachan:20210603214559p:plain

ボタンを押すと以下のような次に生成するプロジェクトの種類を選ぶダイアログが表示されるので次のように入力します。

f:id:Takachan:20210603214608p:plain

「Specify the generator for this project」は「Visual Studio 16 2019」を選択します。

次に64bit版にしたいので「Optional platform for generator」に「x64」を指定します。空白で何も指定しないと「Win32」で32bit版となります。

で「Finish」を押すとツールが動き始めますが、少し時間がかかるので終わるまで待ちます。

完了すると以下のように表示が変わりますがオプションを変更したい場合チェックボックスの ON/OFF で指定できますが今回はそのまま「Generate」をクリックします。

f:id:Takachan:20210603214616p:plain

VisualStudio2019からビルドする

上記の手順で「C:\temp\opencv\build-self」に「OpenCV.sln」が作成されているのでこれを開くと VS2019 でソリューションが開くのでそのまま Debug/Release でビルドします。

割と時間がかかるの opencv_test とか opencv_perf はビルドしないでも良いです。

ビルドが完了すると

「bin」の中にDLL、「lib」の中にLibファイルがそれぞれ生成されるのでパスを通したり環境に配置したりすればOKです。

デバッグビルドには末尾にdがついているものが生成されていると思います。

ソリューションからコードがプロジェクトごとに整理されて閲覧できるので何かあったときは参照することになります。(API呼び出しエラーとか起きると割と見たりします)

CMakeのGUIツールについて

CMake の GUI ツールは CMakeList.txt があるものには大抵の場合適用できるので Win だとビルドがすごく簡単。

参考サイト

第8回 初めてのOpenCV開発 ― CMakeを使ったOpenCVのカスタマイズ【OpenCV 3.1.0】

生成されるファイル

以下自分用メモ。

opencv_coreXXX.dllが無い…無い…みたいなゾンビにならないように。

XXXはバージョンが入る。ソリューションと同じ階層に生成される。

binフォルダ内

DLLとかEXEが入っている

Debug

opencv_calib3d452d.dll
opencv_core452d.dll
opencv_dnn452d.dll
opencv_features2d452d.dll
opencv_flann452d.dll
opencv_gapi452d.dll
opencv_highgui452d.dll
opencv_imgcodecs452d.dll
opencv_imgproc452d.dll
opencv_ml452d.dll
opencv_objdetect452d.dll
opencv_photo452d.dll
opencv_stitching452d.dll
opencv_video452d.dll
opencv_videoio_ffmpeg452_64.dll
opencv_videoio452d.dll
opencv_annotationd.exe
opencv_interactive-calibrationd.exe
opencv_model_diagnosticsd.exe
opencv_version_win32d.exe
opencv_versiond.exe
opencv_visualisationd.exe

Release

opencv_calib3d452.dll
opencv_core452.dll
opencv_dnn452.dll
opencv_flann452.dll
opencv_gapi452.dll
opencv_highgui452.dll
opencv_imgcodecs452.dll
opencv_imgproc452.dll
opencv_ml452.dll
opencv_objdetect452.dll
opencv_photo452.dll
opencv_stitching452.dll
opencv_video452.dll
opencv_videoio452.dll
opencv_videoio_ffmpeg452_64.dll
opencv_features2d452.dll
opencv_annotation.exe
opencv_interactive-calibration.exe
opencv_model_diagnostics.exe
opencv_version.exe
opencv_version_win32.exe
opencv_visualisation.exe

libフォルダ内

ソリューションと同じ階層にある。LibファイルとExpファイルが入っている。

Debug

opencv_calib3d452d.lib
opencv_core452d.lib
opencv_dnn452d.lib
opencv_features2d452d.lib
opencv_flann452d.lib
opencv_gapi452d.lib
opencv_highgui452d.lib
opencv_imgcodecs452d.lib
opencv_imgproc452d.lib
opencv_ml452d.lib
opencv_objdetect452d.lib
opencv_photo452d.lib
opencv_stitching452d.lib
opencv_ts452d.lib
opencv_video452d.lib
opencv_videoio452d.lib

Release

opencv_calib3d452.lib
opencv_core452.lib
opencv_dnn452.lib
opencv_features2d452.lib
opencv_flann452.lib
opencv_gapi452.lib
opencv_highgui452.lib
opencv_imgcodecs452.lib
opencv_imgproc452.lib
opencv_ml452.lib
opencv_objdetect452.lib
opencv_photo452.lib
opencv_stitching452.lib
opencv_ts452.lib
opencv_video452.lib
opencv_videoio452.lib