日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解

發(fā)布時間:2025/3/21 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一提到角點(diǎn)檢測,最常用的方法莫過于Harris角點(diǎn)檢測,opencv中也提供了Harris角點(diǎn)檢測的接口,即cv::cornerHarris(),但是Harris角點(diǎn)檢測存在很多缺陷(如角點(diǎn)是像素級別的,速度較慢等),因此我們這里將介紹opencv中的另一個功能更為強(qiáng)大的函數(shù)——cv::goodFeaturesToTrack(),它不僅支持Harris角點(diǎn)檢測,也支持Shi Tomasi算法的角點(diǎn)檢測。但是,該函數(shù)檢測到的角點(diǎn)依然是像素級別的,若想獲取更為精細(xì)的角點(diǎn)坐標(biāo),則需要調(diào)用cv::cornerSubPix()函數(shù)進(jìn)一步細(xì)化處理,即亞像素。

1、cv::goodFeaturesToTrack()角點(diǎn)檢測

cv::goodFeaturesToTrack()的具體調(diào)用形式如下:

void cv::goodFeaturesToTrack(cv::InputArray image, // 輸入圖像(CV_8UC1 CV_32FC1)cv::OutputArray corners, // 輸出角點(diǎn)vectorint maxCorners, // 最大角點(diǎn)數(shù)目double qualityLevel, // 質(zhì)量水平系數(shù)(小于1.0的正數(shù),一般在0.01-0.1之間)double minDistance, // 最小距離,小于此距離的點(diǎn)忽略cv::InputArray mask = noArray(), // mask=0的點(diǎn)忽略int blockSize = 3, // 使用的鄰域數(shù)bool useHarrisDetector = false, // false ='Shi Tomasi metric'double k = 0.04 // Harris角點(diǎn)檢測時使用);

第一個參數(shù)是輸入圖像(8位或32位單通道圖)。

第二個參數(shù)是檢測到的所有角點(diǎn),類型為vector或數(shù)組,由實(shí)際給定的參數(shù)類型而定。如果是vector,那么它應(yīng)該是一個包含cv::Point2f的vector對象;如果類型是cv::Mat,那么它的每一行對應(yīng)一個角點(diǎn),點(diǎn)的x、y位置分別是兩列。

第三個參數(shù)用于限定檢測到的點(diǎn)數(shù)的最大值。

第四個參數(shù)表示檢測到的角點(diǎn)的質(zhì)量水平(通常是0.10到0.01之間的數(shù)值,不能大于1.0)。

第五個參數(shù)用于區(qū)分相鄰兩個角點(diǎn)的最小距離(小于這個距離得點(diǎn)將進(jìn)行合并)。

第六個參數(shù)是mask,如果指定,它的維度必須和輸入圖像一致,且在mask值為0處不進(jìn)行角點(diǎn)檢測。

第七個參數(shù)是blockSize,表示在計(jì)算角點(diǎn)時參與運(yùn)算的區(qū)域大小,常用值為3,但是如果圖像的分辨率較高則可以考慮使用較大一點(diǎn)的值。

第八個參數(shù)用于指定角點(diǎn)檢測的方法,如果是true則使用Harris角點(diǎn)檢測,false則使用Shi Tomasi算法。

第九個參數(shù)是在使用Harris算法時使用,最好使用默認(rèn)值0.04。


下面使用測試代碼,看一下實(shí)際的檢測效果。

測試代碼如下:

cv::Mat image_color = cv::imread("house.jpg", cv::IMREAD_COLOR);//使用灰度圖像進(jìn)行角點(diǎn)檢測cv::Mat image_gray;cv::cvtColor(image_color, image_gray, cv::COLOR_BGR2GRAY);//設(shè)置角點(diǎn)檢測參數(shù)std::vector<cv::Point2f> corners;int max_corners = 200;double quality_level = 0.01;double min_distance = 3.0;int block_size = 3;bool use_harris = false;double k = 0.04;//角點(diǎn)檢測cv::goodFeaturesToTrack(image_gray, corners, max_corners, quality_level, min_distance, cv::Mat(), block_size, use_harris, k);//將檢測到的角點(diǎn)繪制到原圖上for (int i = 0; i < corners.size(); i++){cv::circle(image_color, corners[i], 1, cv::Scalar(0, 0, 255), 2, 8, 0);}cv::imshow("house corner", image_color);cv::waitKey(0);return;

實(shí)際檢測效果如下:




2、cv::cornerSubPix()亞像素角點(diǎn)檢測

前面已經(jīng)提及,cv::goodFeaturesToTrack()提取到的角點(diǎn)只能達(dá)到像素級別,在很多情況下并不能滿足實(shí)際的需求,這時,我們則需要使用cv::cornerSubPix()對檢測到的角點(diǎn)作進(jìn)一步的優(yōu)化計(jì)算,可使角點(diǎn)的精度達(dá)到亞像素級別。

具體調(diào)用形式如下:

void cv::cornerSubPix(cv::InputArray image, // 輸入圖像cv::InputOutputArray corners, // 角點(diǎn)(既作為輸入也作為輸出)cv::Size winSize, // 區(qū)域大小為 NXN; N=(winSize*2+1)cv::Size zeroZone, // 類似于winSize,但是總具有較小的范圍,Size(-1,-1)表示忽略cv::TermCriteria criteria // 停止優(yōu)化的標(biāo)準(zhǔn));
第一個參數(shù)是輸入圖像,和 cv::goodFeaturesToTrack()中的輸入圖像是同一個圖像。

第二個參數(shù)是檢測到的角點(diǎn),即是輸入也是輸出。

第三個參數(shù)是計(jì)算亞像素角點(diǎn)時考慮的區(qū)域的大小,大小為NXN; N=(winSize*2+1)。

第四個參數(shù)作用類似于winSize,但是總是具有較小的范圍,通常忽略(即Size(-1, -1))。

第五個參數(shù)用于表示計(jì)算亞像素時停止迭代的標(biāo)準(zhǔn),可選的值有cv::TermCriteria::MAX_ITER 、cv::TermCriteria::EPS(可以是兩者其一,或兩者均選),前者表示迭代次數(shù)達(dá)到了最大次數(shù)時停止,后者表示角點(diǎn)位置變化的最小值已經(jīng)達(dá)到最小時停止迭代。二者均使用cv::TermCriteria()構(gòu)造函數(shù)進(jìn)行指定。


下面就通過一個示例看看cv::cornerSubPix()亞像素角點(diǎn)檢測的具體效果。

cv::Mat image_color = cv::imread("image.jpg", cv::IMREAD_COLOR);//用于繪制亞像素角點(diǎn)cv::Mat image_copy = image_color.clone();//使用灰度圖像進(jìn)行角點(diǎn)檢測cv::Mat image_gray;cv::cvtColor(image_color, image_gray, cv::COLOR_BGR2GRAY);//設(shè)置角點(diǎn)檢測參數(shù)std::vector<cv::Point2f> corners;int max_corners = 100;double quality_level = 0.01;double min_distance = 10;int block_size = 3;bool use_harris = false;double k = 0.04;//角點(diǎn)檢測cv::goodFeaturesToTrack(image_gray,corners,max_corners,quality_level,min_distance,cv::Mat(),block_size,use_harris,k);//將檢測到的角點(diǎn)繪制到原圖上for (int i = 0; i < corners.size(); i++){cv::circle(image_color, corners[i], 5, cv::Scalar(0, 0, 255), 2, 8, 0);}//指定亞像素計(jì)算迭代標(biāo)注cv::TermCriteria criteria = cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,40,0.01);//亞像素檢測cv::cornerSubPix(image_gray, corners, cv::Size(5, 5), cv::Size(-1, -1), criteria);//將檢測到的亞像素角點(diǎn)繪制到原圖上for (int i = 0; i < corners.size(); i++){cv::circle(image_copy, corners[i], 5, cv::Scalar(0, 255, 0), 2, 8, 0);}cv::imshow("corner", image_color);cv::imshow("sub pixel corner", image_copy);cv::imwrite("corner.jpg", image_color);cv::imwrite("corner_sub.jpg", image_copy);cv::waitKey(0);return;

直接角點(diǎn)檢測和亞像素角點(diǎn)檢測的結(jié)果分別如下:





從檢測的效果來看,使用亞像素角點(diǎn)檢測后角點(diǎn)的精細(xì)度確實(shí)得到了顯著的提升。


2017.04.07

總結(jié)

以上是生活随笔為你收集整理的【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。