win7 64位下自行編譯OpenCV2.4.10+CUDA toolkit 5.5的整個過程以及需要注意的問題(opencv+cuda並行計算元素的使用)
首先說明的是,這個帖子是成功的編譯了dll,但是這個dll使用的時候還是很容易出現各種問題的。
發現錯誤可能是由於系統安裝了太多版本的opencv,環境變數的設置混亂,造成dll版本載入不對的問題。
更新:下面這篇文章裡面有加速編譯的設置辦法:但是編譯器採用了vs2012,我根據他的所有軟體版本換了編譯器,以及QT庫,需要特別注意的是,這些庫的相應操作系統版本32bit 或者64bit版本
QT早期版本下載地址:
下面這個網址能夠找到qt的各個版本
http://download.qt-project.org/archive/qt/
下面是教程地址:
http://www.xuebuyuan.com/2108717.html
2014.10.23
嚴格根據上文的軟體跟庫版本是可以編譯設置成功的。
Motivation:
之前在西電跟同學聽了圖像方面的講座,受益匪淺啊。人家學校的老師大多都是搞sar雷達圖像的,動輒20000*30000的高解析度。演算法再怎麼優化,一套流程下來至少算十天半個月。這改個參數算算等不起啊,最後發現搞這個不上GPU根本就不行,於是我想啊講GPU引入我的這個自然圖像處理跟,stereomatching,的graphcuts演算法中,應該也能夠得到性能的大幅度提升。
由於之前一直在看OpenCV這個圖像處理庫的相關內容,所以先搜了一下看看OpenCV這個庫有沒有直接對CUDA加速進行支持的,我打開電腦一看OpenCV的dll庫後面的後綴帶了_gpu就直接貼了代碼在那調試呢。結果是,小白了。自己要安裝CUDAtoolkit並且結合OpenCV編譯一遍的。
由於我的筆記本電腦是神舟的,顯卡是NVIDIAGTX765我也沒看,直接去官網下了個最新的CUDATOOLKIT6.5就開始整了,最後發現,人家有專門針對筆記本的notebook版本的,傻了一天白乾了,之後發現這個版本過高,還是下了notebook的5.5版本。
最新的6.5可能是給8系,9系的新卡用的吧,我也不是很清楚,最後搞完這一套配置終於明白為啥,linux之父最討厭nvidia了,這程序之間也是亂七八糟的關係兼容不兼容的,官網早期版本的sdk都找不到,哎。。。
使用Cmake的時候,有幾點要注意的,選擇VisualStudio2010的版本應該為win64這樣在win764bit版本下面生成的OpenCV才是正確的。
vs2010主要有兩種模式,分別是debug 和 release。 模式可以通過如圖所示的位置選擇。需要注意的是,因為先前我們cmake採用的是64位VS10編譯器,在這裡需要選擇編譯器x64, 而不是win32, 否則會出錯。
整體的過程參考了下面的鏈接:
http://www.xuebuyuan.com/722557.html
http://blog.csdn.net/fengbingchun/article/details/9831837
安裝完成後,在系統環境裡面會發現新添加了兩個環境變數:(環境變數挨個添加吧,不要怕麻煩)
CUDA_PATH =C:Program FilesNVIDIA GPU Computing ToolkitCUDAv5.0
CUDA_PATH_V5_0 =C:Program FilesNVIDIA GPU Computing ToolkitCUDAv5.0
手動配置環境變數。在系統環境變數中新建如下項:
CUDA_SDK_PATH = C:ProgramDataNVIDIA CorporationCUDA Samplesv5.0CUDA_LIB_PATH = %CUDA_PATH%libX64CUDA_BIN_PATH = %CUDA_PATH%inCUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%commonlibx64CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%inwin64
然後在系統環境變數Path 後添加如下內容:
;%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%;
3. 安裝TBB
去http://threadingbuildingblocks.org/download 下載tbb41_20130314oss_win.zip解壓到某路徑
本人D: bb41_20130314oss
添加環境變數D: bb41_20130314ossinintel64vc10
編譯過程有兩點,可能出現:
1.配置的時候別忘了:添加兩個路徑,尤其是OpenCV的一個lib庫不然 編譯有的庫找不到,編譯不成功。
這個庫不需要設置!!!(後來發現!!!)
2.整個編譯的過程非常的緩慢,並且出現在編譯OpenCV_gpu這個模塊的時候,出現c4819錯誤感覺非常影響速度,這個你要回到相應的cuda文件中,另存為unicode格式就好
i7的處理器大概能編譯3個小時左右。。。
加速方法,可以縮短到一個小時左右!就是只針對響應的顯卡版本進行設置:
由於這樣直接生成的解決方案需對不同的GPU架構分別編譯,編譯時間過長(數小時),建議針對所用顯卡進行配置(據稱可達原時間六分之一):找到如下兩項
清空CUDA_ARCH_PTX,將CUDA_ARCH_BIN中僅保留所需GPU架構,確定所需架構,請查詢https://developer.nvidia.com/cuda-gpus重新configure。(建議使用以上方法先編譯一邊,確定沒有錯誤,再為所有架構重新編譯,花了四天的時間得到的教訓)
以上是轉載的內容,這裡要說幾個需要注意的地方:
1.本文中採用的是Cmake2.8.8版本,我用過2.8.12就會出現過很多本文中未提到的錯誤;
2.上文中提到的CUDA_BUILD_CBUIN」、「CUDA_VERBOSE_BUILD(好像是這些),有些其實在Cmake配置和生成的過程中是找不到的,不過這並不影響結果,可以忽略;
3.關於tbb路徑下x86和x64版本lib的選擇問題:如果你的vs是32位的就選擇x86的庫,否則選x64的庫;
4.將編譯好的頭文件、庫等載入到程序中時,注意要使用編譯的Release版本(形如:"opencv_gpu243.lib",243後沒有d的就是Release版本,有的就是Debug版本),否則會產生「應用程序無法正常啟動0xc000007b」的錯誤
測試代碼:
[cpp] view plaincopy- <spanstyle="font-size:18px;">//first.cpp:定義控制台應用程序的入口點。
- //
- #include"stdafx.h"
- #include<iostream>
- #include"opencv2/opencv.hpp"
- #include"opencv2/gpu/gpu.hpp"
- #pragmacomment(lib,"opencv_gpu2410.lib")
- #pragmacomment(lib,"opencv_core2410.lib")
- usingnamespacestd;
- usingnamespacecv;
- usingnamespacecv::gpu;
- intmain()
- {
- inti;
- try
- {
- cout<<getCudaEnabledDeviceCount();
- }
- catch(constcv::Exception&ex)
- {
- cout<<"Error:"<<ex.what()<<endl;
- }
- system("PAUSE");
- return0;
- }
- </span>
實際上,最後配置好了之後,還是各種問題,我覺的直接調用編譯好的opencv加上cuda的庫編程效率不是很好,通用性也存在問題。後來覺的引起這個問題的原因是自己電腦上安裝的東西太多了,opencv就裝了3個版本,環境變數設置的太多了,引起很多問題。
參考下面這個文章的第三種辦法,後面再試試:
http://www.cnblogs.com/dwdxdy/p/3528711.html
推薦閱讀: