折騰了三天終於配置成功了,在此寫下編譯配置的所有步驟和遇到的不少坑。html
總體介紹:python
OpenCV 中 CUDA 實現的函數還不是太多,使用前要在OpenCV的官網上確認如下你想要的功能是否已經實現,不然費了老鼻子勁配個環境不能用,太浪費時間了。git
編譯的時候要編譯Release 和Debug 兩個版本,個人電腦 i5-4460 3.20GHz ,每一個版本大概須要兩個半小時左右,電腦配置不同時間也會有些不一樣。編譯完成以後整個文件夾19.7G(MD,這麼大,嚇死寶寶了~)。github
環境:windows
Windows10 專業版 64位dom
Virtual Stadio 2013ide
Opencv 3.1函數
Cuda 7.5測試
Cmake 3.4.3ui
安裝步驟:
0、安裝前準備的內容:
安裝TBB:
自行去官網下載,下載後的文件,解壓放在C:\Program Files(能夠放在任意目錄,是後邊環境變量設置的時候對應調整一下便可),目錄下:
而後設置環境變量:在系統-> 高級系統設置->環境變量->path 後邊加入下邊地址:
C:\Program Files\tbb44_20160413oss\bin\intel64\vc12 (這裏注意選擇對應的32位 或者64 位和對應的VS版本,Virtual Studio2010 對應vc10, Virtual Studio 2011 對應vc11, Virtual Studio 2013 對應 vc12. Virtual Studio 2015 對應 vc14).
安裝CUDA:
自行去官網下載,而後按照默認的安裝就行,路徑最好不要動,免得配置的時候再有麻煩。
(開始編譯以前以前建議先閱讀一下寫在後邊的我編譯過程當中遇到的幾個大坑的問題,可能會讓你少走不少彎路)
一、新建一個文件夾,並把下好的Openv3.1 和 contrib 的源碼都放進去(源碼在github上自行下載,地址在opencv.org上找)。
二、打開Cmake(自行下載,必定要用3.4.3的,不要用最新的),設置源碼路徑和目標路徑(個人目標路徑是:D:\opencv310_CUDA),點擊Configure。
PS:第一次Configure的時候因爲須要下載一些文件,可能時間會久一點。
這時會讓你選擇環境,對應選擇就能夠。個人是VS 2013,因此選了上邊的配置。而後點擊 Finish。
說明:Cmake中紅色的部分說明尚未更新,須要點擊Configure更新,每次更改完一些配置或者參數以後都要點擊Configure更新一下。最後肯定配置無誤了再點Generate,將會在你的目標文件夾中生成項目文件。
三、這裏Cmake裏邊須要先配置點東西:
把下邊的
WITH_TBB
WITH_CUDA
都勾選上,其餘的項能夠暫時無論。
PS:這裏邊有一個BUILD_opencv_world的選項,網上有人建議不要選,我就沒有選,說是會出問題的概率比較大,並且選了這個選項以後,全部的文件都會被編譯到一個dll裏邊去,你們還記得,在OpenCV官網上下的直接能夠在Windows上能夠用的OpenCV麼,那個裏邊就是一個opencv_world310.dll,把全部的類、函數什麼的都放到這個裏邊去了,這樣的壞處就是,不少你的程序中用不上的東西也都給你放進去了。
而後點Configure
這時,會讓你選擇TBB的路徑,對應填寫好就行,個人是:C:\Program Files\tbb44_20160413oss\include
而後再次Configure, 以下圖:
此次又會有關於TBB的兩個紅色的,這個是Cmake已經本身找到的路徑,你看一眼,沒什麼問題就再一次Configure。
此次就不會有紅色的了,確認一下沒什麼須要再配置的了,就直接Generate。
等着Generate完成,你就能夠去目標文件夾去看生成的結果了。
四、在你的目標文件中找到OpenCV.sln 文件,並用VS打開:
個人目標文件夾是D:opencv310_CUDA
五、打開以後,大概長這樣
而後在,CMakeTargets下的INSTALL上右鍵->生成。(生成以前建議先閱讀一下寫在後邊的我編過程當中遇到的幾個大坑的問題,可能會讓你少走不少彎路)
而後就慢慢的等待吧,等着編譯完成就OK了。
六、編譯完成以後,你會在你的目標文件夾中找到一個install文件夾,裏邊就有Debug和Release的各類你須要的東西。
install文件夾大概長這樣:
是否是有一種很親切的感受。
而後就是配置環境變量,配置VS還有用程序測試了。這個寫在最後,繼續往下翻。
-------------------------------------------------------
先說幾個大坑,要特別注意,否則會浪費掉不少時間:
-------------------------------------------------------
一、要特別注意,Cmake的版本不要用最新的3.5,必定要用3.4.3,否則會出現不少問題,好比說:
沒法打開輸入文件「..\..\lib\Release\opencv_bioinspired310.lib」
之類的錯誤。
剛開始最頭疼的就是OpenCV的 bioinspired(和醫學,生物圖像處理相關的一些功能) 這個庫編譯不出來,想着反正這個庫也不用上,就在Cmake的時候不選他,可是若是不選,就會出現其餘的一些文件找不到之類的問題。最後換了Cmake3.4.3以後一切正常。估計是Opencv或者是CUDA沒有針對最新的Cmake修改。
二、Cmake完成以後,不要所有編譯,這樣若是到後邊出問題了,前邊編譯了很長時間就浪費了。編譯以前先選幾個比較容易出問題的項目編譯一下試試,好比:opencv_core, opencv_bioinspired, opencv_cudaarithm, opencv_cudabgsegm.尤爲是opencv_cudaarithm, opencv_cudabgsegm這兩個項目,編譯起來很是慢並且最容易出問題。編譯方法,在項目上 右鍵->生成。
三、若是所有編譯完畢以後,若是有一兩個項目沒有編譯成功,不必再所有從新編譯,直接在Cmake編譯的目錄裏的modules目錄裏找到失敗的類,進去用VS打開是項目,從新編譯一下便可。
好比,個人opencv_cudabgsegm 項目最後編譯失敗,我就在D:\opencv310_CUDA\modules\ 下找到 cudabgsegm,進入目錄雙擊 INSTALL.vcxproj ,用VS打開項目。而後生成一次(以下圖,在CmakeTargets下的INSTALL上右鍵->生成),就能夠在install文件夾裏找到以前失敗的lib文件了。
配置編譯好的OpenCV:
一、配置環境變量:
在Path中添加: D:\opencv310_CUDA\install\x64\vc12\bin;
(其實我在用戶的環境變量中也加了一條,不過貌似加不加都行)
配置完環境變量,重啓或註銷才能生效
二、配置VS的項目屬性:
新建一個控制檯應用程序,而後在項目名稱上右鍵->屬性:
而後:
(路徑以你的電腦實際爲準)
(注意配置平臺信息32位 仍是64位,還有Release和Debug)
VC++目錄 下的:
包含目錄 添加如下內容:
D:\opencv310_CUDA\install\include
D:\opencv310_CUDA\install\include\opencv
D:\opencv310_CUDA\install\include\opencv2
庫目錄 添加如下內容:
D:\opencv310_CUDA\install\build\x64\vc12\lib
在連接器 下的:
輸入->附加依賴項 添加(注意發佈版本不同,Debug版的帶「d」, Release版的不帶):
(Release版)
opencv_aruco310.lib
opencv_bgsegm310.lib
opencv_bioinspired310.lib
opencv_calib3d310.lib
opencv_ccalib310.lib
opencv_core310.lib
opencv_cudaarithm310.lib
opencv_cudabgsegm310.lib
opencv_cudacodec310.lib
opencv_cudafeatures2d310.lib
opencv_cudafilters310.lib
opencv_cudaimgproc310.lib
opencv_cudalegacy310.lib
opencv_cudaobjdetect310.lib
opencv_cudaoptflow310.lib
opencv_cudastereo310.lib
opencv_cudawarping310.lib
opencv_cudev310.lib
opencv_datasets310.lib
opencv_dnn310.lib
opencv_dpm310.lib
opencv_face310.lib
opencv_features2d310.lib
opencv_flann310.lib
opencv_fuzzy310.lib
opencv_highgui310.lib
opencv_imgcodecs310.lib
opencv_imgproc310.lib
opencv_line_descriptor310.lib
opencv_ml310.lib
opencv_objdetect310.lib
opencv_optflow310.lib
opencv_photo310.lib
opencv_plot310.lib
opencv_reg310.lib
opencv_rgbd310.lib
opencv_saliency310.lib
opencv_shape310.lib
opencv_stereo310.lib
opencv_stitching310.lib
opencv_structured_light310.lib
opencv_superres310.lib
opencv_surface_matching310.lib
opencv_text310.lib
opencv_tracking310.lib
opencv_ts310.lib
opencv_video310.lib
opencv_videoio310.lib
opencv_videostab310.lib
opencv_xfeatures2d310.lib
opencv_ximgproc310.lib
opencv_xobjdetect310.lib
opencv_xphoto310.lib
(Debug 版)
opencv_aruco310d.lib
opencv_bgsegm310d.lib
opencv_bioinspired310d.lib
opencv_calib3d310d.lib
opencv_ccalib310d.lib
opencv_core310d.lib
opencv_cudaarithm310d.lib
opencv_cudabgsegm310d.lib
opencv_cudacodec310d.lib
opencv_cudafeatures2d310d.lib
opencv_cudafilters310d.lib
opencv_cudaimgproc310d.lib
opencv_cudalegacy310d.lib
opencv_cudaobjdetect310d.lib
opencv_cudaoptflow310d.lib
opencv_cudastereo310d.lib
opencv_cudawarping310d.lib
opencv_cudev310d.lib
opencv_datasets310d.lib
opencv_dnn310d.lib
opencv_dpm310d.lib
opencv_face310d.lib
opencv_features2d310d.lib
opencv_flann310d.lib
opencv_fuzzy310d.lib
opencv_highgui310d.lib
opencv_imgcodecs310d.lib
opencv_imgproc310d.lib
opencv_line_descriptor310d.lib
opencv_ml310d.lib
opencv_objdetect310d.lib
opencv_optflow310d.lib
opencv_photo310d.lib
opencv_plot310d.lib
opencv_reg310d.lib
opencv_rgbd310d.lib
opencv_saliency310d.lib
opencv_shape310d.lib
opencv_stereo310d.lib
opencv_stitching310d.lib
opencv_structured_light310d.lib
opencv_superres310d.lib
opencv_surface_matching310d.lib
opencv_text310d.lib
opencv_tracking310d.lib
opencv_ts310d.lib
opencv_video310d.lib
opencv_videoio310d.lib
opencv_videostab310d.lib
opencv_xfeatures2d310d.lib
opencv_ximgproc310d.lib
opencv_xobjdetect310d.lib
opencv_xphoto310d.lib
PS:這些文件是我用python寫的腳本生成出來的,不要一個一個從lib文件夾裏把名字裏拷出來,容易出錯,並且工做量挺大。一共106個,各53個。
測試:
把opencv源碼中的例子拿出來測試:
代碼在: opencv-master\samples\cpp\tutorial_code\gpu\gpu-basics-similarity\gpu-basics-similarity.cpp
把代碼拷到剛纔建的那個VS項目裏,而後生成。
注意:這裏不能直接運行,這個程序要接受參數才能運行。
打開command終端, 進入編譯出來的文件存放的目錄,再拷兩張圖片到這個路徑,而後用一下命令運行:
OpenCV_CUDAtest.exe left.jpg right.jpg 10
TMD這個結果顯示,個人CUDA的計算速度比CPU的還慢,好像有點坑爹啊。
寫在最後:據我瞭解,CUDA並非必定就會比純CUP快的,GUP更擅長處理大規模的並行計算,不擅長邏輯運算,並且在OpenCV中,要想用GPU處理,就必須先把數據轉換成GPU能夠處理的數據類型,而後再傳輸到GPU中處理,其中數據傳輸只能經過系統總線,速度會很慢。所以在選擇CUDA的時候要慎重考慮,並非全部的程序都適合CUDA的,說不定有的程序用了CUDA反而更慢了。估計也就是這個緣由,網上Opencv + CUDA的資料纔會比較少吧。
要詳細瞭解CUDA原理以及優劣勢,請本身查找更詳細的資料。
Reference:
http://www.nmtree.net/2014/03/19/windows_build-opencv-with-cmake-and-vs2013.html
http://blog.csdn.net/xizero00/article/details/50823020
blog.csdn.net/kelvin_yan/article/details/48708227
http://www.cnblogs.com/freedomshe/archive/2013/01/11/win7_vs2012_opencv_rebuild.html
http://blog.csdn.net/Kelvin_Yan/article/details/38866795