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步。

 

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM