0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV4.8 CUDA編程代碼教程

OpenCV學(xué)堂 ? 來源:OpenCV學(xué)堂 ? 2023-12-05 09:56 ? 次閱讀

OpenCV4.8 CUDA編程代碼教程

預(yù)計閱讀時間 :12 mins

01CUDA支持模塊

OpenCV4支持通過GPU實現(xiàn)CUDA加速執(zhí)行,實現(xiàn)對OpenCV圖像處理程序的加速運行,當(dāng)前支持加速的模塊包括如下:

圖像背景分割

視頻編解碼

特征2D

卷積濾波

圖像處理

對象檢測

光流

雙目視覺

基本上包含了OpenCV圖像處理的主要功能,這里有一個地方需要特別注意,就是編譯時候選擇不同的CUDA版本,對上述模塊的支持略微不同。比如最新的CUDA10.0來說已經(jīng)不支持級聯(lián)檢測器的加速啦。 要想利用GPU實現(xiàn)CUDA OpenCV加速,第一步當(dāng)然是重新編譯OpenCV源碼實現(xiàn)對CUDA的支持,這個可以參考我之前發(fā)的文章

OpenCV4 | 如何讓傳統(tǒng)圖像處理實現(xiàn)三十倍加速的頂級技能

收到大家的反饋,覺得視頻比較好,所以又錄制了一個OpenCV4 + CUDA加速編譯與配置的視頻教程。

02代碼演示教程

檢測CUDA設(shè)備支持,代碼如下:

cuda::getDevice());
intcount=cuda::getCudaEnabledDeviceCount();
printf("GPUDeviceCount:%d
",count);

運行截圖:

99c0b300-92ab-11ee-939d-92fbcf53809c.png

CUDA處理圖像的時候,首先需要把Mat圖像上載到CUDA數(shù)據(jù)單元GpuMat對象中去,然后調(diào)用CUDA支持的相關(guān)API進行處理,處理完成之后,再從GpuMat下載數(shù)據(jù)到原始Mat對象中,完成后續(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支持圖像的角點檢測,支持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還支持各種特征匹配,以O(shè)RB特征匹配為例,實現(xiàn)CUDA版本的特征匹配會比沒有CUDA版本的速度快到10倍以上,基本也可以達(dá)到實時級別。以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);

//對象檢測
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中出現(xiàn)的DIS光流還不支持CUDA加速調(diào)用。CUDA光流算法支持調(diào)用基本上都可以達(dá)到70幀左右。調(diào)用CUDA加速的稠密光流法, CPU版本運行在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);

上面所有的測試都是基于OpenCV4.8+ GTX 3050TI的顯卡 + Windows 10 系統(tǒng)上完成。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3521

    瀏覽量

    93263
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67764
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    622

    瀏覽量

    41088
  • CUDA
    +關(guān)注

    關(guān)注

    0

    文章

    121

    瀏覽量

    13544

原文標(biāo)題:10分鐘學(xué)會 OpenCV4.8 CUDA編程

文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Ubuntu系統(tǒng)下編譯OpenCV4.8源碼記錄

    支持,所以就用這個開發(fā)板給大家演示一下如何在烏班圖系統(tǒng)下編譯OpenCV4.8源碼與如何編譯執(zhí)行OpenCV C++應(yīng)用。
    的頭像 發(fā)表于 10-27 16:07 ?1362次閱讀
    Ubuntu系統(tǒng)下編譯<b class='flag-5'>OpenCV4.8</b>源碼記錄

    CUDA編程教程

    Nvidia CUDA 2.0編程教程
    發(fā)表于 03-05 07:30

    仿射變換綜合示例_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:仿射變換綜合示例
    發(fā)表于 06-06 15:39 ?5次下載

    基本鼠標(biāo)操作_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:基本鼠標(biāo)操作
    發(fā)表于 06-06 15:39 ?5次下載

    點追蹤_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:點追蹤
    發(fā)表于 06-06 15:39 ?4次下載

    漫水填充算法綜合示例_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:漫水填充算法綜合示例
    發(fā)表于 06-06 15:39 ?2次下載

    形態(tài)學(xué)圖像處理綜合示例_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:形態(tài)學(xué)圖像處理綜合示例
    發(fā)表于 06-06 15:52 ?8次下載

    圖像濾波綜合示例_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:圖像濾波綜合示例
    發(fā)表于 06-06 15:52 ?6次下載

    OpenCV進行基本繪圖_《OpenCV3編程入門》書本配套源

    OpenCV3編程入門》書本配套源代碼:用OpenCV進行基本繪圖
    發(fā)表于 05-11 16:46 ?36次下載

    用morphologyEx進行圖像開運算_《OpenCV3編程入門》配套源代碼

    OpenCV3編程入門》書本配套源代碼:用morphologyEx進行圖像開運算
    發(fā)表于 06-06 15:52 ?11次下載

    用morphologyEx進行圖像閉運算_《OpenCV3編程入門》配套源代碼

    OpenCV3編程入門》書本配套源代碼:用morphologyEx進行圖像閉運算
    發(fā)表于 06-06 15:52 ?3次下載

    用迭代器訪問像素_《OpenCV3編程入門》書本配套源代碼

    OpenCV3編程入門》書本配套源代碼:用迭代器訪問像素
    發(fā)表于 06-06 15:52 ?2次下載

    CUDA簡介: CUDA編程模型概述

    CUDA 編程模型中,線程是進行計算或內(nèi)存操作的最低抽象級別。 從基于 NVIDIA Ampere GPU 架構(gòu)的設(shè)備開始,CUDA 編程模型通過異步
    的頭像 發(fā)表于 04-20 17:16 ?2846次閱讀
    <b class='flag-5'>CUDA</b>簡介: <b class='flag-5'>CUDA</b><b class='flag-5'>編程</b>模型概述

    如何在OpenCV中實現(xiàn)CUDA加速

    OpenCV4.x中關(guān)于CUDA加速的內(nèi)容主要有兩個部分,第一部分是之前OpenCV支持的圖像處理與對象檢測傳統(tǒng)算法的CUDA加速;第二部分是Ope
    的頭像 發(fā)表于 09-05 10:03 ?4904次閱讀

    OpenCV4.8+CUDA+擴展模塊支持編譯指南

    OpenCV4.8+CUDA+擴展模塊支持編譯指南
    的頭像 發(fā)表于 11-30 16:45 ?730次閱讀
    <b class='flag-5'>OpenCV4.8+CUDA</b>+擴展模塊支持編譯指南