經常需要把用opencv寫的程序拿到沒有裝opencv的電腦上去運行和演示,要讓opencv程序脫離opencv環境,一般有兩種方法:
一種是動態鏈接opencv,即把相應的dll拷貝到exe所在目錄,然后一起拿到目標電腦上去運行;另一種是將相應dll中的函數打包進exe,然后直接拷貝exe到目標電腦上去運行,即靜態編譯。
這里以VS2008+opencv2.4.6編寫的win32控制台程序為例介紹靜態編譯的步驟:
1. 將opencv安裝目錄\build下的include文件夾拷貝到當前工程目錄下,重命名為opencv_include;
2. 將opencv安裝目錄\build\x86\vc9下的staticlib文件夾拷貝到當前工程目錄下,重命名為opencv_lib;
3. 在VS左側的目錄樹中右鍵項目名稱,選擇“屬性”,在“配置屬性”->“C/C++”->“常規”->“附加包含目錄”中添加opencv_include目錄。
4. 在“連接器”->“輸入”->“附加依賴項”里添加相應的lib文件,debug版添加帶d的lib,release版添加不帶d的lib。
//win32控制台程序需要的lib
vfw32.lib
comctl32.lib
//opencv用到的第三方lib
.\opencv_lib\libjasperd.lib
.\opencv_lib\libjpegd.lib
.\opencv_lib\libpngd.lib
.\opencv_lib\libtiffd.lib
.\opencv_lib\zlibd.lib
//opencv各模塊的lib
.\opencv_lib\opencv_calib3d246d.lib
.\opencv_lib\opencv_contrib246d.lib
.\opencv_lib\opencv_core246d.lib
.\opencv_lib\opencv_features2d246d.lib
.\opencv_lib\opencv_flann246d.lib
.\opencv_lib\opencv_gpu246d.lib
.\opencv_lib\opencv_haartraining_engined.lib
.\opencv_lib\opencv_highgui246d.lib
.\opencv_lib\opencv_imgproc246d.lib
.\opencv_lib\opencv_legacy246d.lib
.\opencv_lib\opencv_ml246d.lib
.\opencv_lib\opencv_nonfree246d.lib
.\opencv_lib\opencv_objdetect246d.lib
.\opencv_lib\opencv_photo246d.lib
.\opencv_lib\opencv_stitching246d.lib
.\opencv_lib\opencv_ts246d.lib
.\opencv_lib\opencv_video246d.lib
.\opencv_lib\opencv_videostab246d.lib
5. 在“C/C++”->“代碼生成”->“運行時庫”中,debug版選擇MTd,release版選擇MT。
以上設置完成后,編譯即可。
PS:
1. 通常include和lib還可以在VS2008的“工具”->“選項”->“項目和解決方案”->“VC++目錄”的“包含文件”中進行設置,但這樣的設置是保存在VS2008中,而不是當前工程中,如果將整個工程拷貝到別的電腦上,還需要再次設置才能正確編譯。而這里介紹的方式則不用再配置,可以直接修改和編譯。
2. 這里使用了相對路徑,其中“.”表示當前目錄,“..”表示當前目錄的上級目錄。
3. opencv早一點的版本中可能並沒有包含已經編譯好的lib,所以需要自己編譯。
4. 在使用opencv讀avi文件時,發現cvCreateFileCapture總是返回空指針,研究半天才發現是因為opencv_ffmpeg.dll沒有正確加載。opencv_ffmpeg.dll並沒有相應的lib,所以仍然需要將該dll拷貝至工程目錄下編譯和運行。