折騰了三天終於配置成功了,在此寫下編譯配置的全部步驟和遇到的很多坑。
整體介紹:
OpenCV 中 CUDA 實現的函數還不是太多,使用前要在OpenCV的官網上確認以下你想要的功能是否已經實現,否則費了老鼻子勁配個環境不能用,太浪費時間了。
編譯的時候要編譯Release 和Debug 兩個版本,我的電腦 i5-4460 3.20GHz ,每個版本大概需要兩個半小時左右,電腦配置不一樣時間也會有些不同。編譯完成之后整個文件夾19.7G(MD,這么大,嚇死寶寶了~)。

環境:
Windows10 專業版 64位
Virtual Stadio 2013
Opencv 3.1
Cuda 7.5
Cmake 3.4.3
安裝步驟:
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:
自行去官網下載,然后按照默認的安裝就行,路徑最好不要動,省得配置的時候再有麻煩。
(開始編譯之前之前建議先閱讀一下寫在后邊的我編譯過程中遇到的幾個大坑的問題,可能會讓你少走很多彎路)
1、新建一個文件夾,並把下好的Openv3.1 和 contrib 的源碼都放進去(源碼在github上自行下載,地址在opencv.org上找)。

2、打開Cmake(自行下載,一定要用3.4.3的,不要用最新的),設置源碼路徑和目標路徑(我的目標路徑是:D:\opencv310_CUDA),點擊Configure。
PS:第一次Configure的時候由於需要下載一些文件,可能時間會久一點。

這時會讓你選擇環境,對應選擇就可以。我的是VS 2013,所以選了上邊的配置。然后點擊 Finish。

說明:Cmake中紅色的部分說明還沒有更新,需要點擊Configure更新,每次更改完一些配置或者參數之后都要點擊Configure更新一下。最后確定配置無誤了再點Generate,將會在你的目標文件夾中生成項目文件。
3、這里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完成,你就可以去目標文件夾去看生成的結果了。
4、在你的目標文件中找到OpenCV.sln 文件,並用VS打開:
我的目標文件夾是D:opencv310_CUDA

5、打開之后,大概長這樣

然后在,CMakeTargets下的INSTALL上右鍵->生成。(生成之前建議先閱讀一下寫在后邊的我編過程中遇到的幾個大坑的問題,可能會讓你少走很多彎路)
然后就慢慢的等待吧,等着編譯完成就OK了。
6、編譯完成之后,你會在你的目標文件夾中找到一個install文件夾,里邊就有Debug和Release的各種你需要的東西。
install文件夾大概長這樣:

是不是有一種很親切的感覺。
然后就是配置環境變量,配置VS還有用程序測試了。這個寫在最后,繼續往下翻。
-------------------------------------------------------
先說幾個大坑,要特別注意,不然會浪費掉很多時間:
-------------------------------------------------------
1、要特別注意,Cmake的版本不要用最新的3.5,一定要用3.4.3,不然會出現很多問題,比如說:
無法打開輸入文件“..\..\lib\Release\opencv_bioinspired310.lib”
之類的錯誤。
剛開始最頭疼的就是OpenCV的 bioinspired(和醫學,生物圖像處理相關的一些功能) 這個庫編譯不出來,想着反正這個庫也不用上,就在Cmake的時候不選他,但是如果不選,就會出現其他的一些文件找不到之類的問題。最后換了Cmake3.4.3之后一切正常。估計是Opencv或者是CUDA沒有針對最新的Cmake修改。
2、Cmake完成之后,不要全部編譯,這樣如果到后邊出問題了,前邊編譯了很長時間就浪費了。編譯之前先選幾個比較容易出問題的項目編譯一下試試,比如:opencv_core, opencv_bioinspired, opencv_cudaarithm, opencv_cudabgsegm.尤其是opencv_cudaarithm, opencv_cudabgsegm這兩個項目,編譯起來非常慢而且最容易出問題。編譯方法,在項目上 右鍵->生成。

3、如果全部編譯完畢之后,如果有一兩個項目沒有編譯成功,沒必要再全部重新編譯,直接在Cmake編譯的目錄里的modules目錄里找到失敗的類,進去用VS打開是項目,重新編譯一下即可。
比如,我的opencv_cudabgsegm 項目最后編譯失敗,我就在D:\opencv310_CUDA\modules\ 下找到 cudabgsegm,進入目錄雙擊 INSTALL.vcxproj ,用VS打開項目。然后生成一次(如下圖,在CmakeTargets下的INSTALL上右鍵->生成),就可以在install文件夾里找到之前失敗的lib文件了。

配置編譯好的OpenCV:
1、配置環境變量:
在Path中添加: D:\opencv310_CUDA\install\x64\vc12\bin;
(其實我在用戶的環境變量中也加了一條,不過貌似加不加都行)
配置完環境變量,重啟或注銷才能生效
2、配置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
