OpenCVをスタティックリンクライブラリでビルドする方法

シェアする

  • このエントリーをはてなブックマークに追加
最近の記事
  • 10/21 【C#】寸法線の描画
  • 10/21 【C#】GraphicsPathの領域取得
  • 10/20 【C#】GraphicsPathの描画
  • 10/18 【C#】GraphicsPath
  • 10/17 【C#】Bitmap画像データの拡大縮小
  • 10/15 【C#】画像の座標系
  • 10/14 【C#】画像の上下左右反転、90,180,270度回転
  • 10/3 【C#】SplitContainerのPanel固定方法
  • 9/7 【Neural Network Console】学習データの出力方法
  • 9/3 Deep Learning向け学習画像撮り込みソフト公開
  • 9/1 【Neural Network Console】新規画像のDataset作成方法
  • 8/28 【Neural Network Console】GUI表示スケールの変更
  • 8/22 【Neural Network Console】CPU/GPU処理の設定切替
  • 8/21 【Neural Network Console】Learning Rate(学習率)の設定
  • 8/20 ソニーの無償AIソフト Neural Network Consoleの入手ダウンロード、インストール
  • 8/20 Deep Learning
  • 8/20
  • 8/19 古いバージョンのVisual Studio Community/Expressの入手ダウンロード
  • 8/19 CUDAの入手、ダウンロード、インストール方法
  • 8/17 【C#.NET】マイクロソフト仕様のアフィン変換
  • 8/5 【C#】ファイルを開くダイアログボックスの表示
  • 8/2 キャノンプリンターのCDトレイはどこ?!
  • 7/6 【参考書籍】画像処理・機械学習プログラミング OpenCV 3対応
  • 6/20 【Python,matplotlib】動くグラフをAnimationGifに保存する方法
  • 6/17 シグモイド関数の微分
  • 6/15 シグモイド関数
  • 6/13 合成関数の微分
  • 6/12 WordPressで数式エディタ風に数式を入力したい
  • 6/11 PythonをVisual Studioでインストールする方法
  • 6/9 【Python】OpenCVをAnacondaでインストール(Windows編)
  • 6/6 【Python】Anacondaで複数バージョンの環境切り替え
  • 6/6 画像センシング展2017に出展します。
  • 6/1 【Office365】Web版Outlookのフォントサイズ変更
  • 6/1 【Anaconda】モジュールのアップデートでエラー発生
  • 6/1 【Anaconda】コマンドリストの表示
  • 5/29 Windows10パソコン購入
  • 5/24 Anacondaのアンインストール
  • 5/24 【Jupyter Notebook】新規プログラムの作成
  • 5/23 【Python】開発環境の構築
  • 5/23 Pythonはじめました
  • 4/6 【Office365】Web版Outlookのスレッド表示を解除する方法
  • 4/5 【Excel】フーリエ解析(FFT)
  • 3/20 Canny edge detection
  • 3/20 【Excel2016】分析ツールの表示
  • 3/5 【Visual Studio】黒い背景色を白に変更する方法
  • 2/8 【Windows10】拡張モニタに表示されたウィンドウを元に戻す
  • 2/7 複素数の計算
  • 1/18 【Excel】棒グラフの横軸の目盛を0始まりにする
  • 1/16 【Excel】フーリエ変換
  • 1/6 【OpenCV】疑似カラー(カラーマップ)

  • スタティックリンクライブラリを使うと他のPCへ作成した実行ファイルを移植する時にexeファイルをコピーすればOpenCVをインストールする事なく実行できるので、メリットはあるので、使ってみたいのですが、これが、なかなか分かりづらい。

    OpenCV2.3.1ではファイル(OpenCV-2.3.1-win-superpack.exe)をダウンロードし、解凍するとスタティックリンクライブラリらしきフォルダ(staticlib)があるのですが、*.libファイルが不足しているらしく、未解決のシンボルのエラーが出て使う事が出来なさそうです。

    そのため、OpenCV-2.3.1-win-superpack.exeのソースからCMakeを使ってスタティックリンクライブラリをビルドしてみました。

    CMakeでビルドする方法はOpenCV2.3の入手、ダウンロード、インストール、環境設定のページを参考にして頂きたいのですが、上記のページから異なるポイントを示したいと思います。

    今回OpenCV-2.3.1-win-superpack.exeを c:\ に解凍している事を想定しています。

    まずCMakeで作成するプロジェクトの保存先のフォルダを作成しておきます。

    今回は C:\opencv\userbuild というフォルダを作成するとします。

    CMakeを起動し

    Where is the source codeに C:/opencv

    Where is the source codeに C:/opencv/userbuid

    を指定します。

    Make_Static_OpenCV_Library

    次にConfigureボタンをクリックします。

    すると下図のようなウィンドウが開くので、使用するVisual Studioのバージョンを選択します。

    Make_Static_OpenCV_Library

    Finishボタンをクリックすると下図のように表示されるので、BUILD_SHARED_LIBSのチェックを外します。CUDAに対応していないPCの場合はWHITH_CUDAのチェックも外して下さい。

    Make_Static_OpenCV_Library

    次にConfigureボタンをクリックするとBUILD_WITH_STATIC_CRTという項目が表示されるので、チェックを入れたまま、Configureボタンをクリックします。

    Make_Static_OpenCV_Library

    すると赤く表示された部分が無くなるので、Generateボタンをクリックします。

    Make_Static_OpenCV_Library

    するとWhere is the source codeで指定したフォルダ(\userbuild)にソリューションファイル(OpenCV.sln)が作成されるので、このファイルをダブルクリックし、VisualStudioを開きます。

    開いたVisualStudioのメニューからビルド→構成マネージャーを選択します。

    次にINSTALLの項目にあるビルドの部分にチェックを入れます。

    左上のアクティブソリューション構成の部分のDebugReleaseを選択しそれぞれにチェックを入れます。

    Make_Static_OpenCV_Library

    この状態で、Visual Studioのメニューのビルド→ソリューションのビルドを選択し、OpenCVをビルドします。このビルドには、かなり時間がかかりますが、ReleaseDebugの両方でビルドを行って下さい。

    これでWhere is the source codeで指定したフォルダ(\userbuild)内に必要なヘッダファイルとライブラリファイルが作成されます。

    スタティックリンクライブラリを使用する方法

    まず、Visual Studioを起動し、ファイル⇒新規作成と選択し、Visual C++⇒Win32内のWin32コンソールアプリケーションを選択し、ウィンドウの下の方にある名前をプロジェクトを作成する場所を指定します。

    次に表示されたウィンドウで完了をクリックするとスケルトンプログラムが作成されます。

    次にVisual Studioのメニューのプロジェクト⇒(プロジェクト名)のプロパティを選択し、構成のプロパティ⇒C/C++⇒全般と選択し、追加のインクルードディレクトリの部分に先程作成したOpenCVのopencv2のあるフォルダを指定します。(右上の構成の部分でDebugとReleaseを切り替えて同じ設定をして下さい。)

    C:\opencv\userbuild\install\include

    Make_Static_OpenCV_Library

    同じウィンドウで構成のプロパティ⇒リンカー⇒入力と選択し特性の指定のライブラリの無視の部分で

    (Debugの場合)

    LIBCMTD.lib;msvcprtd.lib

    (Releaseの場合)

    LIBCMT.lib;msvcprt.lib

    を指定します。

    これで、ソースコード上に下記のようにヘッダファイル(*.hpp)とライブラリファイル(*.lib)の設定を行うと、OpenCVをスタティックリンクライブラリとして使用する事が可能になります。

    下記はWebカメラを撮影する簡単なコードです。

    // OpenCVStaticSample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
    //
    
    #include "stdafx.h"
    
    //*******************************************************************************
    // プロジェクトの設定
    // ①プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
    //      C:\opencv\userbuild\install\include
    //   を追加
    // ②プロジェクトのプロパティ⇒リンカー⇒入力 の特定の規定のライブラリの無視に
    //    Debugのとき
    //        LIBCMTD.lib;msvcprtd.lib
    //    Releaseのとき
    //        LIBCMT.lib;msvcprt.lib
    //    を追加
    //*******************************************************************************
    
    #include "opencv2\\opencv.hpp"
    
    #pragma comment(lib,"comctl32.lib")
    #pragma comment(lib,"vfw32.lib")	// Video for Windows
    
    #ifdef _DEBUG
        //Debugモードの場合
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_core231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_imgproc231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_highgui231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_objdetect231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_contrib231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_features2d231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_flann231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_gpu231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_legacy231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_ts231d.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_video231d.lib")
    
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\zlibd.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libtiffd.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libpngd.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjpegd.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjasperd.lib")
    
    #else
        //Releaseモードの場合
    	#pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_core231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_imgproc231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_highgui231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_objdetect231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_contrib231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_features2d231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_flann231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_gpu231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_legacy231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_ts231.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_video231.lib")
    
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\zlib.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libtiff.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libpng.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjpeg.lib")
        #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjasper.lib")
    
    #endif
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	// カメラオープン
    	cv::VideoCapture cap(0);
    
    	// カメラがオープンできたかの確認
    	if(!cap.isOpened()) return -1;
    
    	cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
    	while(1) {
    		cv::Mat frame;
    		cap >> frame;  // キャプチャ
    		// 様々な処理
    		// ...
    		cv::imshow("Capture", frame); // 表示
    		if(cv::waitKey(30) >= 0)
    		{
    			cv::imwrite("cap.png", frame);
    			break;
    		}
    	}
    
    	return 0;
    }
    
    

    ※実際に開発したPCとは別のPCへ実行ファイル(*.exe)を移植する場合、別途、C++のランタイムが必要となります。

    移植先のPCに開発したPCで使用したVisual Studioと同じバージョンがインストールされていない場合、C++の再頒布パッケージというものをインストールします。

    Visual Studio 2010 C++(32bit)の場合、以下の場所よりダウンロードして下さい。

    Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86)

    これで、OpenCVをスタティックリンクライブラリで使えていると思うのですが、この特定のライブラリの無視する部分と、comctl32.libとvfw32.libを追加しないといけない部分が分かりづらかった...

    ただ、warning LNK4049のワーニングが幾つか出てしまい、いまいち、このwarningの消し方は分かりませんでした...

    OpenCVへ戻る

    コメント