預(yù)計(jì)閱讀時(shí)間 :12 mins
01CUDA支持模塊
OpenCV4支持通過GPU實(shí)現(xiàn)CUDA加速執(zhí)行,實(shí)現(xiàn)對(duì)OpenCV圖像處理程序的加速運(yùn)行,當(dāng)前支持加速的模塊包括如下:
圖像背景分割
視頻編解碼
特征2D
卷積濾波
圖像處理
對(duì)象檢測(cè)
光流
雙目視覺
基本上包含了OpenCV圖像處理的主要功能,這里有一個(gè)地方需要特別注意,就是編譯時(shí)候選擇不同的CUDA版本,對(duì)上述模塊的支持略微不同。比如最新的CUDA10.0來(lái)說已經(jīng)不支持級(jí)聯(lián)檢測(cè)器的加速啦。 要想利用GPU實(shí)現(xiàn)CUDA OpenCV加速,第一步當(dāng)然是重新編譯OpenCV源碼實(shí)現(xiàn)對(duì)CUDA的支持,這個(gè)可以參考我之前發(fā)的文章
OpenCV4 | 如何讓傳統(tǒng)圖像處理實(shí)現(xiàn)三十倍加速的頂級(jí)技能
收到大家的反饋,覺得視頻比較好,所以又錄制了一個(gè)OpenCV4 + CUDA加速編譯與配置的視頻教程。
02代碼演示教程
檢測(cè)CUDA設(shè)備支持,代碼如下:
cuda::getDevice()); intcount=cuda::getCudaEnabledDeviceCount(); printf("GPUDeviceCount:%d ",count);
運(yùn)行截圖:
CUDA處理圖像的時(shí)候,首先需要把Mat圖像上載到CUDA數(shù)據(jù)單元GpuMat對(duì)象中去,然后調(diào)用CUDA支持的相關(guān)API進(jìn)行處理,處理完成之后,再?gòu)腉puMat下載數(shù)據(jù)到原始Mat對(duì)象中,完成后續(xù)操作。以圖像灰度轉(zhuǎn)換為例,代碼演示如下:
//灰度轉(zhuǎn)換 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)、二階導(dǎo)數(shù)算子-拉普拉斯算子、以高斯模糊為例,代碼演示如下:
cv::Math_img1=cv::imread("D:/images/test1.png"); cv::GpuMatd_img1,d_result3x3,d_result5x5,d_result7x7; //加載數(shù)據(jù) d_img1.upload(h_img1); //創(chuàng)建高斯 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); //執(zhí)行 filter3x3->apply(d_img1,d_result3x3); filter5x5->apply(d_img1,d_result5x5); filter7x7->apply(d_img1,d_result7x7); //獲取結(jié)果 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支持圖像的角點(diǎn)檢測(cè),支持Harris與shi-tomas角點(diǎn)檢測(cè),以shi-tomas角點(diǎn)檢測(cè)為例,代碼演示如下:
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版本完全可以做到實(shí)時(shí)運(yùn)行無(wú)壓力,在線美顏很輕松,代碼演示如下:
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<"Error"?<
CUDA還支持各種特征匹配,以O(shè)RB特征匹配為例,實(shí)現(xiàn)CUDA版本的特征匹配會(huì)比沒有CUDA版本的速度快到10倍以上,基本也可以達(dá)到實(shí)時(shí)級(jí)別。以O(shè)RB特征匹配為例,代碼演示如下:
//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); //對(duì)象檢測(cè) 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<"match?size:"?<good_matches; for(intk=0;k0)) { good_matches.push_back(d_matches[k][0]); } } std::cout<"size:"?<
CUDA支持各種光流算法,這里需要注意的時(shí)候,最新的OpenCV4中出現(xiàn)的DIS光流還不支持CUDA加速調(diào)用。CUDA光流算法支持調(diào)用基本上都可以達(dá)到70幀左右。調(diào)用CUDA加速的稠密光流法, CPU版本運(yùn)行在10幀左右,CUDA加速效果很明顯。
//GPU光流法 cuda::cvtColor(frame,gray,COLOR_BGR2GRAY); farn->calc(preGray,gray,flow); //GPU數(shù)據(jù)處理 vectormm; cuda::split(flow,mm); cuda::cartToPolar(mm[0],mm[1],gMag,gAng);
上面所有的測(cè)試都是基于OpenCV4.8+ GTX 3050TI的顯卡 + Windows 10 系統(tǒng)上完成。
審核編輯:湯梓紅
-
編程
+關(guān)注
關(guān)注
88文章
3614瀏覽量
93686 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68524 -
OpenCV
+關(guān)注
關(guān)注
31文章
634瀏覽量
41337 -
CUDA
+關(guān)注
關(guān)注
0文章
121瀏覽量
13620
原文標(biāo)題:10分鐘學(xué)會(huì) OpenCV4.8 CUDA編程
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論