若該文爲原創文章,未經容許不得轉載
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:http://www.javashuo.com/article/p-wxwjppoc-mo.html
本文章博客地址:http://www.javashuo.com/article/p-vynlwpnh-nu.html
各位讀者,知識無窮而人力有窮,要麼改需求,要麼找專業人士,要麼本身研究程序員
紅胖子(紅模仿)的博文大全:開發技術集合(包含Qt實用技術、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機、軟硬結合等等)持續更新中...(點擊傳送門)編程
OpenCV開發專欄(點擊傳送門)
上一篇:《OpenCV開發筆記(十一):OpenCV編譯支持Gpu(cuda) 加速開發之win-qt-mingw32編譯》windows
下一篇:《OpenCV開發筆記(十三):OpenCV圖像對比度、亮度的調整》服務器
前言
接上一篇章,使用cuda開發,cuda不支持windows下的mingw開發,因此轉爲msvc2015 32。架構
OpenCV編譯相關博客
《OpenCV開發筆記(〇):使用mingw530_32編譯openCV3.4.1源碼,搭建Qt5.9.3的openCV開發環境》app
《OpenCV開發筆記(一):OpenCV介紹、編譯》ide
《OpenCV開發筆記(十一):OpenCV編譯支持Gpu(cuda) 加速開發之win-qt-mingw32編譯》模塊化
《OpenCV開發筆記(十二):OpenCV編譯支持Gpu(cuda) 加速開發之win-qt-msvc2015編譯(opencv3.4.0、cuda9.0、VS2015)》工具
《OpenCV開發筆記(三十四):紅胖子帶你傻瓜式編譯Qt+openCV3.4.1+opencv_contrib(全網最淺顯易懂)》性能
《OpenCV開發筆記(七十):紅胖子帶你傻瓜式編譯VS2017x64版本的openCV4》
背景
上一篇《OpenCV開發筆記(十一):OpenCV編譯支持Gpu(cuda) 加速開發之win-qt-mingw32編譯》,cuda沒法在windows平臺上不支持mingw32。
關於OpenCL硬件加速與Cuda
OpenCL
由蘋果(Apple)公司發起,業界衆多著名廠商共同製做的面向異構系統通用目的並行編程的開放式、免費標準,也是一個統一的編程環境。便於軟件開發人員爲高性能計算服務器、桌面計算系統、手持設備編寫高效輕便的代碼,並且普遍適用於多核心處理器(CPU)、圖形處理器(GPU)、Cell類型架構以及數字信號處理器(DSP)等其餘並行處理器,在遊戲、娛樂、科研、醫療等各類領域都有廣闊的發展前景。
CUDA
CUDA是一個基於Nvidia GPU的並行計算的架構。CUDA最主要的包含兩個方面:一個是ISA指令集架構;第二硬件計算引擎;其實是硬件和指令集。 也就是說咱們能夠把CUDA看作是與X86或者cell相似的架構,可是是基因而GPU,而不是傳統的CPU。
OpenCL與CUDA區別
Cuda和OpenCL的關係並非衝突關係,而是包容關係。
OpenCL是一個API,在第一個級別,CUDA架構是更高一個級別,在這個架構上不論是OpenCL仍是DX11這樣的API,仍是像C語言、Fortran、DX11計算,均可以支持。做爲程序開發員來說,通常他們只懂這些語言或者API,能夠採用多種語言開發本身的程序,無論他選擇什麼語言,只要是但願調用GPU的計算能,在這個架構上均可以用CUDA來編程。
關於OpenCL與CUDA之間的技術區別,主要體如今實現方法上。基於C語言的CUDA被包裝成一種容易編寫的代碼,所以即便是不熟悉芯片構造的科研人員,也可能利用Cuda工具編寫出實用的程序。而OpenCL雖然句法上與CUDA接近,可是它更增強調底層操做,所以難度較高,但正由於如此,OpenCL才能跨平臺運行。
CUDA是一個並行計算的架構,包含有一個指令集架構和相應的硬件引擎。OpenCL是一個並行計算的應用程序編程接口(API),在NVIDIA CUDA架構上OpenCL是除了C for CUDA外新增的一個CUDA程序開發途徑。
若是你想得到更多的對硬件上的控制權的話,你可使用OpenCL這個API來進行編程,若是對API不是太瞭解,也能夠用CUDA C語言來編程,這是兩種不一樣編程的方式,他們有他們相同點和不一樣點
OpenCL和CUDA C語言進行開發的時候,在並行計算這塊,他們的概念是差很少的,這兩種程序在程序上是有很大的類似度,因此程序之間的相互移植相對來講也是比較容易。
CUDA C是一種高級語言,那些對硬件瞭解很少的非專業人士也能輕鬆上手;而OpenCL則是針對硬件的應用程序開發接口,它能給程序員更多對硬件的控制權,相應的上手及開發會比較難一些。
OpenCV編譯支持Gpu(window qt msvc2015)
步驟一:CMake配置,錯誤「error in configuration process, project……」IDE版本問題
以上錯誤是沒找到編譯器,簡單來講就是,重載安裝VS2017的相關部分(添加MSVC2015的編譯C++環境)
而後繼續,發現VS2017和MSVC2015雖然都裝了,可是CMake得和VS編譯器配對,通過每個都測試,只能選擇以下,才能夠不報上述錯誤
解決以下圖(未裝MSVC2015以前不行也沒有再深究了),選擇32位和64位又均可以編譯經過了,推論應該主要是要安裝下面這個:
配置32位的,以下圖:
步驟二:CMake配置,錯誤「error in configuration process, project…」環境變量問題
查看錯誤文件「CMakeError.log」,以下圖:
須要設置的環境變量,查看報錯的環境變量:
CUDA_cublas_LIBRARY (ADVANCED) CUDA_cufft_LIBRARY (ADVANCED) CUDA_nppc_LIBRARY (ADVANCED) CUDA_nppial_LIBRARY (ADVANCED) CUDA_nppicom_LIBRARY (ADVANCED) CUDA_nppidei_LIBRARY (ADVANCED) CUDA_nppif_LIBRARY (ADVANCED) CUDA_nppig_LIBRARY (ADVANCED) CUDA_nppim_LIBRARY (ADVANCED) CUDA_nppist_LIBRARY (ADVANCED) CUDA_nppisu_LIBRARY (ADVANCED) CUDA_nppitc_LIBRARY (ADVANCED) CUDA_npps_LIBRARY (ADVANCED)
必需要設置,不然沒法生成工程文件。
查看是否有這些庫,以下圖:
只有64位的纔有,那就配置爲VS2017 X64的,32位的就壓根沒有了,因此改成vs2017 x64的,以下圖:
應該是檢測到,默認就勾選上了,安裝目錄修改下,編譯完成後好拿庫。
步驟三:生成工程
生成成功,以下圖:
步驟四:使用VS2017編譯
打開VS2017打開上述build目錄的vs的all工程,打開後以下圖:
改目標爲release x64編譯工程,生成解決方案,漫長的等待。
根據經驗,編譯是編譯全部的dll和例子,不少時候例子是會有錯誤的(須要調整環境變量,庫的安裝路徑等等),因此這時候一個小技巧,退而求其次,單獨編譯opencv庫就好了,試一試以下圖:
分別以下圖:
Opencv仍是錯誤,經判斷應該是CMake使用版本問題,查詢以下圖:
因此要查詢下顯卡支持的cuda的計算能力,網址:
https://developer.nvidia.com/cuda-gpus
查詢顯卡計算能力,能夠經過運行cuda samples中的deviceQuery得知。
命令行運行結果以下圖:
修改CMake配置:
從新configure和generate一次,仍是不行,各類查找,繼續修改
後通過屢次其餘方法嘗試,不在列舉,都沒法解決,基本上能嘗試的方法都嘗試了,遂決定下降cuda sdk的版本
步驟五:更換SDK版本(10.1--->9.0)
下載舊版本的地址:https://docs.nvidia.com/cuda/
這邊下載,那邊卸載已安裝的,完成後繼續CMake,VS走一遭
仍是錯誤
下降VS版本至VS2015。
重裝系統從新開始OpenCV編譯
步驟一:安裝VS2015社區版本
步驟二:安裝cuda9.0
步驟三:CMake配置,「MBuild.exe」的問題,須要裝C++的通用開發環境和windows sdk。
使用VS的安裝工具,VS2015沒有installer須要本身點開安裝程序,自定義添加安裝,安裝完成後,配置經過,以下圖:
步驟四:CMake配置,找不到一些dll的路徑
查看本篇章OpenCV編譯上重裝系統前的步驟二,是配置編譯環境要是64位的/
步驟五:添加opencv_contrib3.4.0
步驟六:配置報錯,經過「SSL connect error」,警告不處理了,直接配置
步驟七:打開工程編譯,成功編譯opencv_core
步驟八:生成debug和release
此時會出現錯誤,重定義什麼的,實際上是test報錯,非modules的庫報錯,最終在執行一次modules確認,以下圖:
(release整個工程編譯大概2個多小時,網上有4個多小時的)。
庫編譯成功,進行部署,而後拿取頭文件和庫文件,以下圖:
步驟九:測試運行成功(參照模塊化)
測試代碼
bool OpenCVGpuManager::testOpenCVGpu() { bool ret = false; // 返回已安裝的啓用CUDA的設備數 int deviceCount = cv::cuda::getCudaEnabledDeviceCount(); if(deviceCount) { ret = true; } qDebug() << __FILE__ << __LINE__ <<"The localMachine cuda‘s device count :" << deviceCount; return ret; }
測試結果
Qt模塊化(OpenCVGpuManager)
部署環境
涉及到gpu跟cuda、qt、編譯環境息息相關,以下:
- 顯卡:NVIDIA GeForce GTX 750
- Cuda版本:9.0
- VS版本:2015
- Qt版本:5.9.3 msvc2015 x86_win64
模塊化部署
openCVGpuManager.pri
INCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += \ $$PWD/OpenCVGpuManager.h SOURCES += \ $$PWD/OpenCVGpuManager.cpp #must be msvc2015 64 (only for this platform INCLUDEPATH += $${PWD}/openCVGpu3.4.0/include \ $${PWD}/openCVGpu3.4.0/include/opencv \ $${PWD}/openCVGpu3.4.0/include/opencv2 LIBS += -L$${PWD}/openCVGpu3.4.0/x64/vc14/lib LIBS += -lopencv_aruco340 LIBS += -lopencv_bgsegm340 LIBS += -lopencv_bioinspired340 LIBS += -lopencv_calib3d340 LIBS += -lopencv_ccalib340 LIBS += -lopencv_core340 LIBS += -lopencv_cudaarithm340 LIBS += -lopencv_cudabgsegm340 LIBS += -lopencv_cudacodec340 LIBS += -lopencv_cudafeatures2d340 LIBS += -lopencv_cudafilters340 LIBS += -lopencv_cudaimgproc340 LIBS += -lopencv_cudalegacy340 LIBS += -lopencv_cudaobjdetect340 LIBS += -lopencv_cudaoptflow340 LIBS += -lopencv_cudastereo340 LIBS += -lopencv_cudawarping340 LIBS += -lopencv_cudev340 LIBS += -lopencv_datasets340 LIBS += -lopencv_dnn340 LIBS += -lopencv_dpm340 LIBS += -lopencv_face340 LIBS += -lopencv_features2d340 LIBS += -lopencv_flann340 LIBS += -lopencv_fuzzy340 LIBS += -lopencv_highgui340 LIBS += -lopencv_img_hash340 LIBS += -lopencv_imgcodecs340 LIBS += -lopencv_imgproc340 LIBS += -lopencv_line_descriptor340 LIBS += -lopencv_ml340 LIBS += -lopencv_objdetect340 LIBS += -lopencv_optflow340 LIBS += -lopencv_phase_unwrapping340 LIBS += -lopencv_photo340 LIBS += -lopencv_plot340 LIBS += -lopencv_reg340 LIBS += -lopencv_rgbd340 LIBS += -lopencv_saliency340 LIBS += -lopencv_shape340 LIBS += -lopencv_stereo340 LIBS += -lopencv_stitching340 LIBS += -lopencv_structured_light340 LIBS += -lopencv_superres340 LIBS += -lopencv_surface_matching340 LIBS += -lopencv_text340 LIBS += -lopencv_tracking340 LIBS += -lopencv_video340 LIBS += -lopencv_videoio340 LIBS += -lopencv_videostab340 LIBS += -lopencv_xfeatures2d340 LIBS += -lopencv_ximgproc340 LIBS += -lopencv_xobjdetect340 LIBS += -lopencv_xphoto340 win32{ # copy openCVGpu3.4.0 release dll src_file = $$PWD/openCVGpu3.4.0/x64/vc14/bin/* dst_file = $$OUT_PWD src_file ~= s,/,\\,g dst_file ~= s,/,\\,g system(xcopy $$src_file $$dst_file /y /s/q/e) }
工程模板OpenCVGpuDemo:對應版本號v1.0.0
OpenCVGpu對應版本號v1.0.0
上一篇:《OpenCV開發筆記(十一):OpenCV編譯支持Gpu(cuda) 加速開發之win-qt-mingw32編譯》
下一篇:《OpenCV開發筆記(十三):OpenCV圖像對比度、亮度的調整》
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客導航:http://www.javashuo.com/article/p-wxwjppoc-mo.html
本文章博客地址:http://www.javashuo.com/article/p-vynlwpnh-nu.html
本文同步分享在 博客「紅胖子(AAA紅模仿)」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。