預計閱讀時間 :12 mins
01CUDA支持模塊
OpenCV4支持通過GPU實現CUDA加速執行,實現對OpenCV圖像處理程序的加速運行,當前支持加速的模塊包括如下:
圖像背景分割
視頻編解碼
特征2D
卷積濾波
圖像處理
對象檢測
光流
雙目視覺
基本上包含了OpenCV圖像處理的主要功能,這里有一個地方需要特別注意,就是編譯時候選擇不同的CUDA版本,對上述模塊的支持略微不同。比如最新的CUDA10.0來說已經不支持級聯檢測器的加速啦。 要想利用GPU實現CUDA OpenCV加速,第一步當然是重新編譯OpenCV源碼實現對CUDA的支持,這個可以參考我之前發的文章
OpenCV4 | 如何讓傳統圖像處理實現三十倍加速的頂級技能
收到大家的反饋,覺得視頻比較好,所以又錄制了一個OpenCV4 + CUDA加速編譯與配置的視頻教程。
02代碼演示教程
檢測CUDA設備支持,代碼如下:
cuda::getDevice()); intcount=cuda::getCudaEnabledDeviceCount(); printf("GPUDeviceCount:%d ",count);
運行截圖:
CUDA處理圖像的時候,首先需要把Mat圖像上載到CUDA數據單元GpuMat對象中去,然后調用CUDA支持的相關API進行處理,處理完成之后,再從GpuMat下載數據到原始Mat對象中,完成后續操作。以圖像灰度轉換為例,代碼演示如下:
//灰度轉換 Matsrc_host=imread("D:/images/test.png"); GpuMatsrc,gray; src.upload(src_host); cuda::cvtColor(src,gray,COLOR_BGR2GRAY); Matgray_host; gray.download(gray_host); imshow("src",src_host); imshow("gray",gray_host); waitKey(0);
CUDA支持各種卷積處理,卷積處理支持盒子模糊、高斯模糊、圖像梯度(SobleScharr)、二階導數算子-拉普拉斯算子、以高斯模糊為例,代碼演示如下:
cv::Math_img1=cv::imread("D:/images/test1.png"); cv::GpuMatd_img1,d_result3x3,d_result5x5,d_result7x7; //加載數據 d_img1.upload(h_img1); //創建高斯 autofilter3x3=cv::createGaussianFilter(CV_8UC3,CV_8UC3,cv::Size(3,3),5); autofilter5x5=cv::createGaussianFilter(CV_8UC3,CV_8UC3,cv::Size(5,5),5); autofilter7x7=cv::createGaussianFilter(CV_8UC3,CV_8UC3,cv::Size(7,7),5); //執行 filter3x3->apply(d_img1,d_result3x3); filter5x5->apply(d_img1,d_result5x5); filter7x7->apply(d_img1,d_result7x7); //獲取結果 cv::Math_result3x3,h_result5x5,h_result7x7; d_result3x3.download(h_result3x3); d_result5x5.download(h_result5x5); d_result7x7.download(h_result7x7); //顯示 cv::imshow("OriginalImage",h_img1); cv::imshow("Blurredwithkernelsize3x3",h_result3x3); cv::imshow("Blurredwithkernelsize5x5",h_result5x5); cv::imshow("Blurredwithkernelsize7x7",h_result7x7); waitKey(0); return;
CUDA支持圖像的角點檢測,支持Harris與shi-tomas角點檢測,以shi-tomas角點檢測為例,代碼演示如下:
Matsrc_host=imread("D:/images/building.png"); imshow("input",src_host); GpuMatsrc,gray,corners; Matdst; src.upload(src_host); cuda::cvtColor(src,gray,COLOR_BGR2GRAY); autocorner_detector=cuda::createGoodFeaturesToTrackDetector(gray.type(),1000,0.01,15,3); corner_detector->detect(gray,corners); corners.download(dst); printf("detectedcorners%d.... ",corners.cols); for(inti=0;i(0,i); circle(src_host,pt,3,Scalar(b,g,r),2,8,0); } imshow("cornerdetect",src_host); waitKey(0); return;
我們都知道OpenCV中的雙邊模糊是處理速度比較慢的邊緣保留算法,但是它的CUDA版本完全可以做到實時運行無壓力,在線美顏很輕松,代碼演示如下:
try{ Matsrc_host=imread("D:/images/example.png"); imshow("input",src_host); GpuMatsrc(src_host); GpuMatdst; cuda::bilateralFilter(src,dst,0,100,15,4); Matdst_host; dst.download(dst_host); imshow("result",dst_host); } catch(constException&ec){ std::cout<
CUDA還支持各種特征匹配,以ORB特征匹配為例,實現CUDA版本的特征匹配會比沒有CUDA版本的速度快到10倍以上,基本也可以達到實時級別。以ORB特征匹配為例,代碼演示如下:
//gpudata cuda::GpuMatd_object_image; cuda::GpuMatd_scene_image; //cuda::GpuMatd_keypoints_scene,d_keypoints_object;//GPUkeypoints vectorh_keypoints_scene,h_keypoints_object;//CPUkeypoints cuda::GpuMatd_descriptors_scene,d_descriptors_object;//GPUdescriptor //ImageCPUuploadedtoGPU d_object_image.upload(h_object_image); d_scene_image.upload(h_scene_image); //對象檢測 autoorb=cuda::create(); //Detectfeaturepointsandextractcorrespondingdescriptors orb->detectAndCompute(d_object_image,cuda::GpuMat(),h_keypoints_object,d_descriptors_object); orb->detectAndCompute(d_scene_image,cuda::GpuMat(),h_keypoints_scene,d_descriptors_scene); //BruteForceViolenceMatcher Ptrmatcher=cuda::createBFMatcher(NORM_HAMMING); vector>d_matches; matcher->knnMatch(d_descriptors_object,d_descriptors_scene,d_matches,2); std::cout<good_matches; for(intk=0;k0)) { good_matches.push_back(d_matches[k][0]); } } std::cout<
CUDA支持各種光流算法,這里需要注意的時候,最新的OpenCV4中出現的DIS光流還不支持CUDA加速調用。CUDA光流算法支持調用基本上都可以達到70幀左右。調用CUDA加速的稠密光流法, CPU版本運行在10幀左右,CUDA加速效果很明顯。
//GPU光流法 cuda::cvtColor(frame,gray,COLOR_BGR2GRAY); farn->calc(preGray,gray,flow); //GPU數據處理 vectormm; cuda::split(flow,mm); cuda::cartToPolar(mm[0],mm[1],gMag,gAng);
上面所有的測試都是基于OpenCV4.8+ GTX 3050TI的顯卡 + Windows 10 系統上完成。
審核編輯:湯梓紅
-
編程
+關注
關注
88文章
3671瀏覽量
94619 -
代碼
+關注
關注
30文章
4872瀏覽量
69913 -
OpenCV
+關注
關注
31文章
641瀏覽量
42176 -
CUDA
+關注
關注
0文章
122瀏覽量
13976
原文標題:10分鐘學會 OpenCV4.8 CUDA編程
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論