OpenCV4.8 CUDA編程代碼教程
預計閱讀時間 :12 mins
01CUDA支持模塊
OpenCV4支持通過GPU實現CUDA加速執(zhí)行,實現對OpenCV圖像處理程序的加速運行,當前支持加速的模塊包括如下:
圖像背景分割
視頻編解碼
特征2D
卷積濾波
圖像處理
對象檢測
光流
雙目視覺
基本上包含了OpenCV圖像處理的主要功能,這里有一個地方需要特別注意,就是編譯時候選擇不同的CUDA版本,對上述模塊的支持略微不同。比如最新的CUDA10.0來說已經不支持級聯檢測器的加速啦。 要想利用GPU實現CUDA OpenCV加速,第一步當然是重新編譯OpenCV源碼實現對CUDA的支持,這個可以參考我之前發(fā)的文章
OpenCV4 | 如何讓傳統圖像處理實現三十倍加速的頂級技能
收到大家的反饋,覺得視頻比較好,所以又錄制了一個OpenCV4 + CUDA加速編譯與配置的視頻教程。
02代碼演示教程
檢測CUDA設備支持,代碼如下:
cuda::getDevice());
intcount=cuda::getCudaEnabledDeviceCount();
printf("GPUDeviceCount:%d
",count);
運行截圖:

CUDA處理圖像的時候,首先需要把Mat圖像上載到CUDA數據單元GpuMat對象中去,然后調用CUDA支持的相關API進行處理,處理完成之后,再從GpuMat下載數據到原始Mat對象中,完成后續(xù)操作。以圖像灰度轉換為例,代碼演示如下:
//灰度轉換 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);
//創(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);
//獲取結果
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<"Error"?<
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<"match?size:"?<good_matches;
for(intk=0;k0))
{
good_matches.push_back(d_matches[k][0]);
}
}
std::cout<"size:"?<
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 系統上完成。
審核編輯:湯梓紅
-
編程
+關注
關注
90文章
3710瀏覽量
96981 -
代碼
+關注
關注
30文章
4956瀏覽量
73492 -
OpenCV
+關注
關注
33文章
652瀏覽量
44608 -
CUDA
+關注
關注
0文章
126瀏覽量
14435
原文標題:10分鐘學會 OpenCV4.8 CUDA編程
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
OpenCV4.8 CUDA編程代碼教程
評論