1. 程式人生 > 實用技巧 >CMake編譯OpenCV

CMake編譯OpenCV

使用CMake來編譯OpenCV,以匹配自己使用的VS版本。

主要有兩步:

  1. CMake編譯OpenCV原始碼得到OpenCV.sln工程檔案。
  2. VS編譯OpenCV.sln。

以最新的cmake-3.16.0-rc1-win64-x64、opencv-3.4.8、opencv_contrib-3.4.8為例,編譯適合VS2013的x64版本。

【下載軟體】解壓後我都放到了D盤根目錄

1、cmake-3.16.0-rc1-win64-x64.zip,解壓直接可用

2、opencv-3.4.8原始碼檔案Sources,解壓即可

3、contrib庫(下載opencv同版本,注意下邊要點選選項卡選版本,別直接下載)

4.1、安裝python(參考此連結1、2步),即便純使用C++,也建議把python裝上,深度學習必不可少。

4.2、安裝numpy,開啟cmd,輸入 pip install numpy

【編譯步驟】

1、cmake編譯opencv原始檔,生成OpenCV.sln。

以管理員身份執行D:\cmake-3.16.0-rc1-win64-x64cmake-gui.exe

單擊一次Configure後,Search裡篩選資訊,帶test的都不勾選,帶java的都不勾選,其他參考上圖紅字。

留意下是否有BUILD_opencv_python3,如果沒有說明此版本的opencv不支援python,如opencv4.2。

多次Configure後,開啟D:\1\CMakeDownloadLog.txt,如果裡邊有https開頭的東西,說明有檔案下載失敗。那麼需要自己複製連結到迅雷下載。

定位CMakeDownloadLog.txt中出現copy的地方,把下載的檔案放到對應的緊挨著copy的那個目錄中,它會自動把檔案重新命名(MD5碼-原名)放到相應的地方的。

如果沒有出現copy,那麼根據提示如D:/source/opencv-3.4.9/.cache/ippicv/1d222685246896fe089f88b8858e4b2f-ippicv_2019_win_intel64_20180723_general.zip,就把下載的ippicv檔案放到它指定的目錄,檔名用它指定的。

刪掉D:\1\CMakeDownloadLog.txt,再次Configure,檢視自動生成的CMakeDownloadLog.txt內容,沒有https開頭的東西,說明所有檔案全部成功。單擊Generate

2、VS開啟OpenCV.sln,選單欄:生成——批生成,勾選下圖四個,生成,等待完成即可。

最終編譯的結果在自動生成的D:\1\install資料夾中(適用於C++)。把install資料夾中include、x64資料夾拷貝到在D盤新建的資料夾opencv中,其他檔案可以統統刪除。

之後參考博文一次配置永久使用vs2013配置opencv2.4.13(txt中複製貼上即可,一次配置永久使用),注意沒有build目錄了,找自己對應的目錄即可。

【python說明】適用於python的檔案cv2.cp37-win_amd64.pyd,會自動出現在你安裝的python目錄中D:\Python\Python37\Lib\site-packages\cv2\python-3.7。

注意會提醒——無法開啟檔案“python37_d.lib”,debug都會出現此問題,無關緊要,因為成功生成了release版(cmake生成目錄D:\1\lib\python3\Release,若*.pyd沒有出現在你的python目錄中,就自己拷貝過去)。

【實戰】https://blog.csdn.net/nnnnnnnnnnnny/article/details/52182091

【可能出現的問題解決方案】

問題都出現在VS編譯OpenCV.sln階段,而且都是quirc.c、quirc.h引起的。

1、如果出現下圖inline相關的錯誤,在解決方案資源管理器中開啟quirc.h,在最頂部加入如下程式碼後,重新第2步。

1 #if defined(WIN32) && !defined(__cplusplus)
2 #define inline __inline
3 #endif

2、出現size_t(quirc.c中)有關的錯誤,開啟quirc.c(上圖箭頭下方的Source Files中能找到),把size_t改成如下unsigned long long。重新第2步。

1 unsigned long long olddim = q->w * q->h;
2 unsigned long long newdim = w * h;
3 unsigned long long min = (olddim < newdim ? olddim : newdim);