OpenCVをダウンロードすると、ビルド済みのスタティックリンクライブラリがstaticlibというフォルダ内に格納されているのですが、以前、試した時には、うまく利用する事ができずに、CMakeでビルドしていました。
OpenCVをスタティックリンクライブラリでビルドする方法
再度、OpenCV2.4.6で試してみたところ、以下の方法でスタティックリンクライブラリを使用する事ができました。
まず、こちら↓
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/
よりOpenCVをダウンロードします。
WindowsのVer.2.4.6の場合はOpenCV-2.4.6.0.exeのファイルをダウンロードします。
ダウンロードしたファイルをダブルクリックすると自己解凍されますが、以下、ルートディレクトリ(c:\ )に解凍した場合を想定して説明します。
目的のスタティックリンクライブラリは下記フォルダに格納されています。
opencv
├build
├x86
│ ├vc9
│ ├vc10
│ │ ├staticlib
│ ├vc11
├x64
x86やx64、vc9,vc10,vc11は使用する環境に合わせて使用するフォルダを選択します。
まず、C++のプロジェクトを作成し、プロジェクトのプロパティで、構成をすべての構成にし、構成のプロパティ→C/C++→全般→追加のインクルードディレクトリにopencv2のあるフォルダ
c:\opencv\build\include
などを指定します。(ファイルの解凍先によりディレクトリが異なります。)
次にスタティックリンクライブラリのあるフォルダの設定を行います。
こちらもプロジェクトのプロパティで、構成をすべての構成にし、構成のプロパティ→リンカー→全般→追加のライブラリディレクトリに
c:\opencv\build\x86\vc10\staticlib
などを指定します。(ファイルの解凍先や開発環境によりディレクトリが異なります。)
x86・・・32bitプログラムを作成する場合(OSが64bitでも32bitプログラムは作成可能です。)
x64・・・64bitプログラムを作成する場合
(構成マネージャでプラットフォームをx64にするのをお忘れなく。
分からなければ、64bitOSであっても、まずはx86を使用して下さい。)
vc9・・・Visual Studio 2008で開発する場合
vc10・・・Visual Studio 2010で開発する場合
vc11・・・Visual Studio 2012で開発する場合
次に特定の規定のライブラリの無視というのを設定するのですが、これはDebugとReleaseで設定が違うので、構成のプロパティ→リンカー→入力→特定の規定のライブラリの無視の設定に
構成がDebugの場合
Libcmtd.lib;msvcprtd.lib
構成がReleaseの場合
Libcmt.lib;msvcprt.lib
と入力します。
これで、OpenCVを使う準備ができたので、コードを下記のように書きます。
ここでのポイントはcomclt32.libファイルを追加している部分ぐらい。
以下、Canny Edge Detectorのサンプルコードです。
#include "stdafx.h" //プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに // opencv2のあるフォルダ(C:\opencv\build\includeなど)を追加のこと #include "opencv2\opencv.hpp" #pragma comment(lib,"comctl32.lib") // バージョン名の取得 #define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION) // libファイル名の最後の部分をReleaseとDebugで分ける #ifdef _DEBUG #define CV_EXT_STR "d.lib" #else #define CV_EXT_STR ".lib" #endif //プロジェクトのプロパティ⇒リンカー⇒全般 の追加のライブラリディレクトリに // libファイルのあるフォルダ(C:\opencv\build\x86\vc10\libなど)を追加のこと #pragma comment(lib, "opencv_core" CV_VERSION_STR CV_EXT_STR) #pragma comment(lib, "opencv_imgproc" CV_VERSION_STR CV_EXT_STR) #pragma comment(lib, "opencv_highgui" CV_VERSION_STR CV_EXT_STR) #pragma comment(lib, "zlib" CV_EXT_STR) #pragma comment(lib, "IlmImf" CV_EXT_STR) #pragma comment(lib, "libjasper"CV_EXT_STR) #pragma comment(lib, "libjpeg" CV_EXT_STR) #pragma comment(lib, "libpng" CV_EXT_STR) #pragma comment(lib, "libtiff" CV_EXT_STR) int _tmain(int argc, _TCHAR* argv[]) { //画像データの読込 cv::Mat src_img = cv::imread("lena.jpg", -1); if (src_img.empty()){ return -1; } //表示ウィンドウの作成 cv::namedWindow("src"); cv::namedWindow("dst"); //処理後画像データ格納用 cv::Mat dst_img; //画像処理例(Canny Edge Detector) cv::Canny(src_img, dst_img, 100.0, 150.0); //画像の表示 cv::imshow("src", src_img); cv::imshow("dst", dst_img); //キー入力待ち cv::waitKey (0); return 0; }
(実行結果)
サンプルプロジェクトファイルはこちら↓
(OpenCV2.4.6 + Visual Studio 2010 C++ Expressのサンプルです)
スタティックリンクライブラリを使うと、Pathの設定が無いので、ちょっと楽!