OpenCV

なぜかOpenCVがビルドできなかったので泥臭い方法でできるようにした話

結論

こちらの記事の方法でVisual Studio2017でOpenCVビルドするの楽勝やんけ!と思ったら全然できなかったので、こちらの記事の方法をちょちょっと変えて試したらできたという話。1日潰しました。なかなか有意義でしたね!

方法

プロジェクトの作成

もう先のサイト見てよ!といったらこの記事の意味がないのでちゃんと1から手順を書きます。

まずOpenCV3.3.0をダウンロードします。理由は私が悪戦苦闘していたバージョンだからです。他のバージョンを使う場合は適宜読み替えてくださいね。
ここから3.3.0のWin packを適当な場所にダウンロードして解凍してください。場所はどこでもいいです。使わないしそこがおそらく元凶なので。

次に、Visual Studio 2017を起動し、新しいプロジェクトを作成します。2017_11_21_01_新規作成.png

デフォルトでWindows コンソール アプリケーションになっていれば、ここで設定するようなことは特にありません。したければすれば良いです。

次に、エクスプローラーを開いて、プロジェクトフォルダの一番上で(ルートフォルダっていうんでしょうか)Libraryフォルダを作ります。目印はプロジェクトファイルの*.slnファイルです。
プロジェクトフォルダがどこにあるのかわからないときはVisual Studio 2017に戻って適当なファイルをクリックして左下のプロパティをみるとプロジェクトパスとか完全パスとかいう項目が出てくるのでそれを参照なさってください。
2017_11_21_02.png

次に、Libraryフォルダの中にopencvフォルダを作ります。
2017_11_21_03.png

次に、opencvフォルダの中に冒頭で解凍したOpenCVのファイルのうちのbuildの中身のファイルをまるごと先のフォルダに移動してしまいます。6GBくらいあるのでびっくりしますね。
2017_11_21_04.png

次からはVisual Studio 2017の作業です。ソリューションプラットフォーム(たぶんx86になってるやつ)をx64にします。
ソリューションエクスプローラーの自分が作ったプロジェクトを右クリックしてプロパティを表示します。
2017_11_21_05.png

プラットフォームをx64にし、構成プロパティ→VC++ディレクトリにすると、この画面になるはずです。順番に処理していきましょう。
2017_11_21_06.png

インクルードディレクトリに $(SolutionDir)Library\opencv\includeを設定してください。設定画面を使うほうがやりやすいですが、別段プロパティページで描いても問題はないです。(書き損じとかはあるかも)
2017_11_21_7.png

ライブラリディレクトリも同様に、$(SolutionDir)Library\opencv\x64\vc14\lib と記述してください。
2017_11_21_08.png

左の項目のリンカー→入力で追加の依存ファイルに下記の項目をズラッと入力します。これは編集画面でやると苦行ですね。
zlibd.lib;IlmImfd.lib;ittnotifyd.lib;libjasperd.lib;libjpegd.lib;libpngd.lib;libprotobufd.lib;libtiffd.lib;libwebpd.lib;opencv_calib3d330d.lib;opencv_core330d.lib;opencv_dnn330d.lib;opencv_features2d330d.lib;opencv_flann330d.lib;opencv_highgui330d.lib;opencv_imgcodecs330d.lib;opencv_imgproc330d.lib;opencv_ml330d.lib;opencv_objdetect330d.lib;opencv_photo330d.lib;opencv_shape330d.lib;opencv_stitching330d.lib;opencv_superres330d.lib;opencv_ts330d.lib;opencv_video330d.lib;opencv_videoio330d.lib;opencv_videostab330d.lib;opencv_world330.lib;opencv_world330d.lib;

次はまたエクスプローラーでの作業に戻ります。
プロジェクトフォルダ直下に \x64\Debugといった構成でフォルダを作ってください。要するにx64の中にDebugを入れると言うわけです。
2017_11_21_09.png

ここには実行ファイルやdllファイルが入るのでdllファイルを入れるわけです。プロジェクトフォルダの中のLibraryの中で *.dll で検索するとdllを地引きできるのでそのようにするといいです。同じファイルがあるかもしれませんが、どのように処理しても差し支えないでしょう。
2017_11_21_10.png

ライブラリも同じように *.lib で検索して設定したライブラリフォルダに集めてしまいます(これ明らかに無駄だと思うけどやらないと動かない)。ファイルはLibrary\opencv\x64\vc14\libに置きます。
2017_11_21_11.png

最初のh-adachiこちらの記事のさんのこのサンプルが動けばOK!お疲れ様でした!

main.cpp
#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
    Mat image = Mat::zeros(100, 100, CV_8UC3);
    imshow("", image);
    waitKey(0);
}