OpenCVをC言語から使うための環境構築メモ。
環境
- WindowsXP Pro SP3 32bit
- Microsoft Visual C++ 2010 Express(Version 10.0.30319.1 RTMRel)
- Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80×86
- OpenCV ver.2.3.1(OpenCV-2.3.1-win-superpack.exe)
- CMake ver.2.8.7
- TBB ver.4.0 update 3(tbb40_20120201oss_win.zip)
共通設定
環境変数を設定する。
動的ライブラリを使う場合は必要。
「マイコンピュータを右クリック」→「プロパティ」→「詳細設定」→「環境変数」→「システム環境変数」の「Path」の末尾にパスを追加する。
以下は「C:\opencv\bin」にOpenCVのDLLファイルを配置した場合。
%SystemRoot%\system32;%SystemRoot%;C:\opencv\bin
配布されているライブラリを使う場合
・「OpenCV-2.3.1-win-superpack.exe」を解凍して、例えば「C:\OpenCV231」に配置する。
・OpenCVのファイルを適当な場所にコピーする。
・なお、配布されている静的ライブラリは不完全。
xcopy C:\OpenCV231\opencv\build\x86\vc10\staticlib C:\opencv\staticlib\ /E xcopy C:\OpenCV231\opencv\build\x86\vc10\lib C:\opencv\lib\ /E xcopy C:\OpenCV231\build\include\opencv2 C:\opencv\include\opencv2\ /E xcopy C:\OpenCV231\opencv\build\x86\vc10\bin C:\opencv\bin\ /E copy C:\OpenCV231\opencv\build\common\tbb\ia32\vc10\*.* C:\opencv\bin\
自前でライブラリをコンパイルする場合
今回はTBBを使って、CUDAは使わない。
また、静的ライブラリ、動的ライブラリの両方を作成する場合は「OpenCV-2.3.1-win-superpack.exe」の解凍先を変更して下記の手順を繰り返す。
・OpenCV「OpenCV-2.3.1-win-superpack.exe」を解凍して、例えば「C:\OpenCV231」に配置する。
・TBB(tbb40_20120201oss_win.zip)を解凍して「C:\TBB」に配置する。
・CMakeをダウンロードしてインストールする。
・CMakeを起動する。
・「Where is source code」に「C:\OpenCV231」を入力。
・「Where to build the binaries」に「C:\OpenCV231」を入力。
・「Configure」を押す。
・静的ライブラリを作成する場合は「BUILD_SHARED_LIBS」のチェックを外す。
・TBBを使うので「WITH_TBB」にチェックする。
・CUDAを使う場合は「WITH_CUDA」にチェックする。
・「Configure」を押す。
・「BUILD_WITH_STATIC_CRT」をチェックする。
・「TBB_INCLUDE_DIR」に「C:\TBB\include」を設定して「Configure」を押す。
・「TBB_LIB_DIR」に「C:\TBB\lib\ia32\vc10」を設定して「Configure」を押す。
・赤い項目がなくなったら「Generate」を押す。
・CMakeを終了する。
・「C:\OpenCV231」に「OpenCV.sln」があるので、ダブルクリックする、
・「Visual C++ Express 10」を選択する。(2010でも良い。)
・「Visual C++ Express」のツールバー(プルダウンメニュー)から「構成マネージャ」を選択する。
・「Debug」と「Release」ともに「INSTALL」にチェックする。
・ツールバーのプルダウンメニュー項目が「Debug」であることを確認する。
・「デバッグ→」「ソリューションのビルド」を選択してライブラリをコンパイルする。
・「C:\OpenCV231\install」以下にライブラリなどがある。
・ツールバーのプルダウンメニュー項目が「Release」であることを確認する。
・「デバッグ→」「ソリューションのビルド」を選択してライブラリをコンパイルする。
・「C:\OpenCV231\install」以下にライブラリなどある。
静的ライブラリ
xcopy C:\OpenCV231\install\lib C:\opencv\staticlib\ /E xcopy C:\OpenCV231\install\share\OpenCV\3rdparty\lib\ C:\opencv\staticlib\3rdparty\ /E xcopy C:\OpenCV231\install\include\opencv2 C:\opencv\include\opencv2\ /E copy C:\TBB\bin\ia32\vc10\*.dll C:\opencv\bin\ copy C:\TBB\lib\ia32\vc10\*.lib C:\opencv\staticlib\
動的ライブラリ
xcopy C:\OpenCV231\install\lib C:\opencv\lib\ /E xcopy C:\OpenCV231\install\include\opencv2 C:\opencv\include\opencv2\ /E xcopy C:\OpenCV231\install\bin C:\opencv\bin\ /E copy C:\TBB\bin\ia32\vc10\*.dll C:\opencv\bin\ copy C:\TBB\lib\ia32\vc10\*.lib C:\opencv\lib\
メモ
・動的、静的ライブラリは自前でコンパイルした方が良い。
・「OpenCV-2.3.1-win-superpack.exe」には「tbb_debug.dll」が含まれていないので、ダウンロードして配置する必要がある。
・「opencv.hpp」に必要なincludeファイルが記述されているが、全て「opencv2」ディレクトリで始まるパスで書かれているので、includeファイルのコピー先にも「opencv2」ディレクトリを作成しておく。
・プログラムで「opencv.hpp」を指定する場合は「opencv2」ディレクトリから始まるように記述する。
・配布されているライブラリはTBB(Intel Threading Building Block)を有効にして作られているので、TBBもコピーしておく。
OpenCV JP
OpenCVダウンロード
OpenCVのコンパイル(静的ライブラリ)
OpenCVのコンパイル(動的ライブラリ)
Microsoft Visual C++ Express
とりあえずコマンドラインのコンパイラだけ必要。
「Visual C++ 2010 Express」で検索する。
マニフェストをC/C++アプリケーションに埋め込む
OpenCVとTBB
TBB(Intel Threading Building Block)
・http://threadingbuildingblocks.org/
・http://codezine.jp/article/detail/4522
コンパイルについて
動的ライブラリはコマンドラインで、静的ライブラリはVisual Studioで行う。
私の環境では「#pragma」を使って必要なライブラリと無視するライブラリを指定しても静的ライブラリをコマンドラインでコンパイル出来ない。
例えば以下でも×。
Visual Studioで設定したコマンドラインの引数を見ても、下記とそんなに変わらないのだが・・・。
cl -I C:\opencv\include -Wall /MTd /NODEFAULTLIB:LIBCMTD.lib /NODEFAULTLIB:msvcprtd.lib hoge.cpp cl -I C:\opencv\include -Wall /MT /NODEFAULTLIB:LIBCMT.lib /NODEFAULTLIB:msvcprt.lib hoge.cpp
コンパイル(動的ライブラリ)
「Visual Studio 2010 コマンドプロンプト」を起動して行う。
ヘッダファイルは引数で指定する。
Debugの場合
配布されているライブラリで使うには、TBBをダウンロードして「tbb_debug.dll」をコピーする必要がある。
「tbb_debug.dll」がないとコンパイルは出来るが、実行できない。
cl -I C:\opencv\include -Wall /MTd hoge.cpp
Releaseの場合
配布されているライブラリでコンパイル、実行出来るのは、これのみ。
cl -I C:\opencv\include -Wall /MT hoge.cpp
コンパイル(静的ライブラリ)
Visual Studioを起動して行う。
・「ファイル」→「新規作成」→「プロジェクト」
・「Win32コンソールアプリケーション」で「名前」を入力してO.K.を押す。
・「次へ」を押す。
・「コンソールアプリケーション」をチェックする。
・「プリコンパイル済みヘッダー」のチェックをはずす。
・「空のプロジェクト」をチェックする。
・「完了」を押す。
・「ソリューションエクスプローラー」の「ソース」を右クリックする。
・「追加」→「既存の項目」で作成したcppファイルを指定する。
Debugの場合
・「プロジェクト」→「プロパティ」→「C/C++」→「全般」→「追加のインクルードディレクトリ」に「C:\opencv\include」を追加する。
・「プロジェクト」→「プロパティ」→「リンカー」→「入力」→「特定の既定のライブラリの無視」に「LIBCMTD.lib;msvcprtd.lib」を追加する。
Releaseの場合
・「プロジェクト」→「プロパティ」→「C/C++」→「全般」→「追加のインクルードディレクトリ」に「C:\opencv\include」を追加する。
・「プロジェクト」→「プロパティ」→「リンカー」→「入力」→「特定の既定のライブラリの無視」に「LIBCMT.lib;msvcprt.lib」を追加する。
ソース
正しく環境を構築できたかどうかテストする。
ファイル名の拡張子は「cpp」にする。
#include <opencv2/opencv.hpp> // 静的ライブラリを使う場合はコメントをとる //今のところ私の環境ではコマンドラインでコンパイル出来ない。 //#define OPENCV_STATICLIB #ifdef OPENCV_STATICLIB #pragma comment(lib, "comctl32.Lib") #pragma comment(lib, "vfw32.lib") #ifdef _DEBUG #pragma comment(linker, "/nodefaultlib:\"LIBCMTD.lib\"") #pragma comment(linker, "/nodefaultlib:\"msvcprtd.lib\"") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_core231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_highgui231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_imgproc231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_calib3d231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_contrib231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_features2d231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_flann231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_gpu231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_legacy231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_ml231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_objdetect231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_ts231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_video231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\zlibd.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\libtiffd.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\libpngd.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\libjpegd.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\libjasperd.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\tbb_debug.lib") #else #pragma comment(linker, "/nodefaultlib:\"LIBCMT.lib\"") #pragma comment(linker, "/nodefaultlib:\"msvcprt.lib\"") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_core231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_highgui231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_imgproc231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_calib3d231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_contrib231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_features2d231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_flann231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_gpu231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_legacy231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_ml231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_objdetect231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_ts231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\opencv_video231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\zlib.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\libtiff.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\libpng.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\libjpeg.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\3rdparty\\libjasper.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\tbb.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "C:\\opencv\\lib\\opencv_core231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_highgui231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_imgproc231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_calib3d231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_contrib231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_features2d231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_flann231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_gpu231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_legacy231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_ml231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_objdetect231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_ts231d.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_video231d.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\tbb_debug.lib") #else #pragma comment(lib, "C:\\opencv\\lib\\opencv_core231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_highgui231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_imgproc231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_calib3d231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_contrib231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_features2d231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_flann231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_gpu231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_legacy231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_ml231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_objdetect231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_ts231.lib") #pragma comment(lib, "C:\\opencv\\lib\\opencv_video231.lib") #pragma comment(lib, "C:\\opencv\\staticlib\\tbb.lib") #endif #endif int main( int argc, char **argv ) { IplImage *img_src, *img_dst; // Windowの識別名 char *wn_src = "src1"; char *wn_dst = "dst1"; // OpenCVの初期化 cvInitSystem(argc, argv); // 画像読込み img_src = cvLoadImage("test.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if ( img_src == NULL ) { printf("Can not read image file. \n"); return EXIT_FAILURE; } //処理用の画像データの確保 img_dst = cvCreateImage(cvGetSize( img_src ), img_src->depth, img_src->nChannels); //画像処理(Gaussian Filter) cvSmooth(img_src, img_dst, CV_GAUSSIAN, 7); // Window作成 cvNamedWindow(wn_src, CV_WINDOW_AUTOSIZE); cvNamedWindow(wn_dst, CV_WINDOW_AUTOSIZE); // Windowサイズの変更 //cvResizeWindow(wn_src, 600, 400); //cvResizeWindow(wn_dst, 600, 400); // 画像の表示 cvShowImage(wn_src, img_src); cvShowImage(wn_dst, img_dst); // キー入力を待つ cvWaitKey( 0 ); // 全Windowを破棄 //cvDestroyWindow( wn_src ); //cvDestroyWindow( wn_dst ); cvDestroyAllWindows(); // 画像メモリの解放 cvReleaseImage( &img_src ); cvReleaseImage( &img_dst ); return EXIT_SUCCESS; }
Comments