【OpenCV】opencv4.0.1+opencv_contrib4.0.1+VS2015的編譯

opencv4.0.1+opencv_contrib4.0.1+VS2015的編譯

注意:如果不需要使用SIFT和SURF等特殊的方法,直接安裝opencv編譯好的版本即可。

opencv都到4.x版本了,感覺還在使用2.x版本有些落後了,於是去試了試4.0.1,發現改動確實不少,並且一些算法因爲專利或者未成熟的原因,不在發佈的release版本中了,其中就包括SIFT和SURF,他們因爲專利的原因不能用於商業,在2.x版本中,放在在nofree中,而3.x版本開始,這些方法被放入了opencv_contrib中,如果想使用需要自己編譯到opencv中。 (當然VS2015也已經落後了,但是項目需要,不好去換啊,他們的編譯方法差不多,可參考)

1.下載源碼

opencv開源項目在GitHub中,其中有各個版本的源碼,地址是:
https://github.com/opencv

https://github.com/opencv

opencv的下載:
https://github.com/opencv/opencv
opencv_contrib的下載:
https://github.com/opencv/opencv_contrib

以下載opencv爲例:

Sample

https://github.com/opencv/opencv

進入後,
第一步,選擇左側 Branch:Master,選擇下面的Tags頁面;
第二步,選擇想要編譯的版本,我這裏選擇 4.0.1;
第三步,選擇 Clone or download 下載壓縮包;

以相同方法下載 opencv_contrib 的壓縮包(注意他們的版本應該相同,opencv 選了 4.0.1那麼 opencv_contrib 也選 4.0.1)

GitHub 是外網下載起來很費勁,幸好不是很大,大家看人品,有可能中斷,注意觀察。。。

2. CMake

opencv 在利用 vs 進行編譯前需要使用 CMake 進行配置和生成 opencv 工程,然後在打開生成的工程進行 opencv 的 lib 和 dll 的生成。(要是已經有 CMake 了,版本不是太低的話可以用,要是版本低那最好先卸載低版本的,然後安裝最新的 CMake)

CMake的下載:
https://cmake.org/download/

Sample

如上圖,找個最新版本的安裝包進行下載安裝,我的系統是64位選擇win64,安裝沒啥可說的運行後下一步…

3. 利用 CMake 配置生成 opencv 工程

第一步:
新建一個文件夾(最好別在C盤)命名你想要的名字,不要帶中文,例如:opencv401,將 opencv 和 opencv_contrib 解壓到該文件夾,注意解壓後的文件夾點開後就是一系列子文件了,之後在opencv401中,新建文件夾,命名爲opencv-build(當然你可以叫別的)如圖:

(壓縮包如果在這個文件夾下,用右鍵,解壓到當前文件夾下)

第二步:
1.打開 CMake 首先選擇源碼路徑,然後選擇生成文件路徑,源碼路徑就是剛解壓好的opencv 源碼文件夾 opencv-4.0.1 ,生成文件路徑就是我們新建的 opencv-build 文件夾。

2.然後,點擊Configure,進行配置;第一次配置會讓我們選擇編譯項目所用的編譯器,我是VS2015 64位 。然後就等他配置吧,時間還挺長,期間需要下載一部分東西,所以保持網絡暢通。默默的等他配置完,下方會顯示配置的結果,如果有紅色的字,說明配置出現了錯誤,我配置時一個是關於Python,另外的錯誤是需要的文件沒有下載成功(國內很容易不成功),這就需要你手動去下載其中需要的文件,後邊說。

Sample

第三步:
第一次配置完會如下圖,全是紅色,下邊的配置結果各位需要看好,是不是有什麼別的錯誤,沒有錯誤的話,字體是黑色,有錯誤的地方字體爲紅色,需要解決其錯誤,他會有描述,安描述尋找方法解決,如果是下載文件失敗的問題,請看;
若沒有錯誤 再次點擊Configure;這時紅色全變爲白色,說明配置成功。

Sample

Sample

第四步:
到這裏我們只加入了 opencv 的源碼,還沒有添加 opencv_contrib。現在進行添加,在OPENCV 中找到 OPENCV_EXTRA_MODULES_PATH 項,添加他的路徑,他的路徑是我們解壓 opencv_contrib 夾下的 module 文件夾的路徑。
在這如果想之後生成的opencv的lib和dll包含在一個文件opencv_world.lib和opencv_world.dll內,需要找到 BUILD 將其下的 BUILD_opencv_world 選擇上。
OK,現在再次點擊 Configure

Sample

Sample

Sample

Sample

第五步:
第四步Configure結束後會如下圖,再次點擊Configure,如果全變成白色且輸出欄沒有錯誤,那麼點擊Generate,
結果顯示
Configuring done
Generation done
則CMake部分結束,這時打開生成的項目,在我們自己建的opencv-build中有,opencv.sln,也可通過CMake 中的 Generate 按鈕邊上的 Open Project打開。

Sample

Sample

4. 在VS2015中編譯生成opencv庫文件

當打開了生成的opencv項目,可以選擇想要生成的庫文件的Debug版本或Release版本
默認是Debug版本

第一步:選擇 CMakeTargets 中的 ALL_BUILD 或者 解決方案 Solution ‘OpenCV’,右鍵 ->生成,
第二步:生成結束如果沒有失敗的,在選擇 INSTALL -> 右鍵 -> 僅當前項目 -> 只生成 INSTALL。
如果需要release版本,選擇release版後 重複 第一步和第二步

Sample

Sample

Sample

5. 錯誤及解決方法

5.1 CMake Configure 時 opencv_ffmpeg.dll 等文件下載失敗

CMake Warning at cmake/OpenCVDownload.cmake:193 (message):
FFMPEG: Download failed: 7;“Couldn’t connect to server”

For details please refer to the download log file:

D:/CPP_Library/opencv401/opencv-build/CMakeDownloadLog.txt

Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:20 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:200 (download_win_ffmpeg)
CMakeLists.txt:636 (include) 

例如,在 CMake 的輸出窗口出現 Download failed:錯誤,
1.如果因爲斷網原因發生,那麼在連接上網絡後 再次Configure。
2.如果網絡良好,那麼需要你手動去下載沒有下載到的文件,下載連接在我們建立的 opencv_build 文件夾內的 CMakeDownloadLog.txt 這個裏面有需要下載文件的信息,包括文件名、連接和下載狀態。
如:

#use_cache "D:/CPP_Library/opencv401/opencv-4.0.1/.cache"
#do_copy "opencv_ffmpeg.dll" "849286ccc527c99e5a218b67f13c6e8c" 
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/759a23e24ab787a0979f8a93103dcc3105ec10c1/ffmpeg/opencv_ffmpeg.dll" 
"D:/CPP_Library/opencv401/opencv-build/3rdparty/ffmpeg"  

這兩句的意思是說將 opencv_ffmpeg.dll(它的md5簽名是 849286ccc527c99e5a218b67f13c6e8c,下載地址是 “https://raw.githubusercontent.com/opencv/opencv_3rdparty/759a23e24ab787a0979f8a93103dcc3105ec10c1/ffmpeg/opencv_ffmpeg.dll” )
從 “D:/CPP_Library/opencv401/opencv-4.0.1/.cache” 拷貝到 "D:/CPP_Library/opencv401/opencv-build/3rdparty/ffmpeg"目錄下。

#missing "D:/CPP_Library/opencv401/opencv-build/3rdparty/ffmpeg/opencv_ffmpeg.dll"

目標目錄下沒有此文件

#cmake_download "D:/CPP_Library/opencv401/opencv-4.0.1/.cache/ffmpeg/849286ccc527c99e5a218b67f13c6e8c-opencv_ffmpeg.dll" 
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/759a23e24ab787a0979f8a93103dcc3105ec10c1/ffmpeg/opencv_ffmpeg.dll"

下載此文件到源代碼路徑 /.cache/ffmpeg/,並命名爲"md5-文件名"

 # timeout on name lookup is not supported
    # Trying 151.101.108.133...
    # TCP_NODELAY set
    # connect to 151.101.108.133 port 443 failed: Connection refused
    # Failed to connect to raw.githubusercontent.com port 443: Connection refused
    # Closing connection 0
    #

所以 直接利用沒有下載的文件的下載連接去下載文件,然後重命名爲"md5-文件名"的形式 如:849286ccc527c99e5a218b67f13c6e8c-opencv_ffmpeg.dll,放在 /.cache/ffmpeg/ 文件夾下面,或者直接放到目標路徑 /3rdparty/ffmpeg/opencv_ffmpeg.dll(不用重命名)。

利用上面的方法,下載那些下載失敗的文件,並放入到相應的文件夾下,再次進行 CMake 的 Configure

注意:
1、fmpeg_version.cmake 無法直接下載,而是直接打開了ffmpeg_version.cmake,可以右鍵網頁選擇另存爲 ffmpeg_version.cmake.txt,然後再改爲f710891525a04586d565d0e700e62a9c-ffmpeg_version.cmake。(這個名字根據你的提示的改,但估計opencv4.0.1都是這個)這裏如果自己新建一個txt,然後直接將網頁上的內容拷進去,然後再該後綴爲.cmake是不行的,會提示md5不匹配。

2、不同版本的OpenCV對應的 opencv_ffmpeg.dll 等缺失文件的 md5 簽名是不一樣的

具體請參考:https://www.cnblogs.com/huluwa508/p/10142718.html

5.2 VS2015生成時 C2065 ‘ID3D11Multithread’: undeclared identifier 錯誤等; VS2015生成時 LNK1104 cannot open file '…\lib\Debug\opencv_world401d.lib’問題

只要發現了’ID3D11Multithread’: undeclared identifier 那麼下邊出現的一系列問題,包括LNK1104 cannot open file '…\lib\Debug\opencv_world401d.lib’等基本都是由它引起的。
我出現這個問題是由於 windows 10 SDK 版本低(10.0.10586.0版本),你可以在路徑
C:\Program Files (x86)\Windows Kits\10\Include 下看到版本號
其中不包含所要用到的 ID3D11Multithread 。這時需要下載新版本的windows SDK(10.0.17134.0版本)
這裏微軟提供兩種方法,
1.是下載安裝win10的 windows 10 SDK
2.是通過VS進行安裝 (VS2017 能夠安裝更高版本的 (10.0.17763.132))
下載地址:
https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
下載後安裝即可

如圖:

Sample

這裏需要注意,儘管有了新版本SDK,但是VS2015編譯器默認還是使用了低版本,所以需要在VS中設置一下,首先,在 Class View(類視圖) 窗口中(沒有的在菜單 View(視圖)中選擇 Class View(類視圖))選中所有的項目 (通過shift件 第一個和最後一個進行全選)後再項目上右鍵,打開Properties (屬性)對話框,修改Target Platform Version (目標平臺版本) 選擇10.0.17134.0。
到此就完成了錯誤的修改,就可以從新生成opencv了,按照標題 4.的內容

Sample

6. 大功告成

當在 VS2015 完成了生成 INSTALL ,那麼 opencv 的庫就已經生成好了在我們的 opencv_build 文件夾下的 install 文件夾中,包括了 bin、etc、include、x64、文件夾 和一些文件,這就和官網提供的opencv包一樣的結構了,只是沒有java和python文件,將install拷貝到其他地方 改個名 如 opencv401 就可以正常使用啦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章