最近在依照毛新雲的OpenCV3編程入門,在Windows下用CMake編譯OpenCV 3.1.0的源代碼,由於是第一次接觸這些,在學習編譯過程中遇到了很多問題,也耗費了大量的時間,現在將其中一個問題記錄下來,希望可以幫組別人少走彎路。感覺編譯后主要的好處是可以看源代碼。網上傳言OpenCV官方提供的編譯庫一般只是標准版本,可能與某些庫並不兼容,比如官方提供的編譯好的版本與opengl就不兼容,這時就只能自己構建項目后編譯。
首先在CMake官網https://cmake.org/下載了cmake-3.6.2-win64-x64,在編譯過程中,估計是因為CMake的服務器在外國的原因,跨越不了GREATWALL,一直出現下面錯誤提示:
Downloading opencv_ffmpeg_64.dll...
CMake Error at cmake/OpenCVUtils.cmake:895 (file):
file DOWNLOAD HASH mismatch
for file: [D:/Program Files (x86)/opencv/sources/3rdparty/ffmpeg/downloads/35fe6ccdda6d7a04e9056b0d73b98e76/opencv_ffmpeg_64.dll]
expected hash: [35fe6ccdda6d7a04e9056b0d73b98e76]
actual hash: [f112aef8bcfad76757e2ebf06c7cf6e5]
status: [28;"Timeout was reached"]
Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:15 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:206 (include)
CMakeLists.txt:536 (include)
CMake Error at cmake/OpenCVUtils.cmake:899 (message):
Failed to download opencv_ffmpeg_64.dll. Status=28;"Timeout was reached"
Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:15 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:206 (include)
CMakeLists.txt:536 (include)
讀一下這幾行,可以大致了解如下,在編譯過程中,程序下載了一個文件,它的hash值與所期待的不一致,所以導致了錯誤,接下來到CMakeLists.txt文件(在…...\opencv\sources)中去定位,然而看不懂。。。。。。於是去網上搜索opencv_ffmpeg_64.dll,下載至....../opencv/sources/3rdparty/ffmpeg/downloads/35fe6ccdda6d7a04e9056b0d73b98e76/ 下載鏈接:http://pan.baidu.com/s/1gfE3gHl
還是錯誤,不過錯誤提示變了:
Downloading opencv_ffmpeg.dll...
CMake Error at cmake/OpenCVUtils.cmake:895 (file):
file DOWNLOAD HASH mismatch
for file: [D:/Program Files (x86)/opencv/sources/3rdparty/ffmpeg/downloads/89c783eee1c47bfc733f08334ec2e31c/opencv_ffmpeg.dll]
expected hash: [89c783eee1c47bfc733f08334ec2e31c]
actual hash: [3de6314883587d538b4864070e0a749d]
status: [28;"Timeout was reached"]
Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:206 (include)
CMakeLists.txt:536 (include)
CMake Error at cmake/OpenCVUtils.cmake:899 (message):
Failed to download opencv_ffmpeg.dll. Status=28;"Timeout was reached"
Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:206 (include)
CMakeLists.txt:536 (include)
繼續下載了一個opencv_ffmpeg.dll,替換至.../opencv/sources/3rdparty/ffmpeg/downloads/89c783eee1c47bfc733f08334ec2e31c/下載鏈接:http://pan.baidu.com/s/1dEAnopN
然后開始Downloading ippicv_windows_20151201.zip,我知道肯定下載不了,繼續自己下載,http://pan.baidu.com/s/1c27hCT6
放到/opencv/sources/3rdparty/ippicv/downloads/windows-04e81ce5d0e329c3fbc606ae32cad44d/繼續configure。。。。。。如下圖,Configuring done
然后進行第二次Configure(配置),直接點擊Configure,幾秒鍾后,Configuring done
最后,單機Generate,成功生成項目,幾秒鍾完成,顯示Generating done。大功告成也!
在CMake是自己設定build的路徑下,可以打開OpenCV.sln工程,按F5啟動調試,5分鍾編譯完成,
但提示如下錯誤:
原因是OpenCV的源代碼工程默認將"ALL_BUILD"這個項目設置為了啟動項,編譯后就會默認運行它。而"ALL_BUILD"是一個項目生成周邊的雜項,不是exe文件,本生不可以運行,所以自然就會彈出這樣的錯誤提示。若想讓此報錯的對話框不像是,指定一個另外的啟動項即可。我們在解決方案資源管理器里,對需要設置為啟動項的那個項目右鍵點擊,在彈出的菜單項中單擊【設為啟動項(J)】進行設定。如下圖:
總結解決辦法是:自己根據上述地址手動下載該文件,然后將編譯時下載的文件替換掉。根據上述代碼可知,如果該文件存在,就不會再去下載。