程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> OpenCV中feature2D學習——亞像素級角點檢測(cornerSubPix)

OpenCV中feature2D學習——亞像素級角點檢測(cornerSubPix)

編輯:C++入門知識

OpenCV中feature2D學習——亞像素級角點檢測(cornerSubPix)


概述

除了利用Harris進行角點檢測和利用Shi-Tomasi方法進行角點檢測外,還可以使用cornerEigenValsAndVecs()函數和cornerMinEigenVal()函數自定義角點檢測函數。如果對角點的精度有更高的要求,可以用cornerSubPix()函數將角點定位到子像素,從而取得亞像素級別的角點檢測效果。

cornerSubPix()函數

(1)函數原型

cornerSubPix()函數在角點檢測中精確化角點位置,其函數原型如下:

C++: void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria);
C: void cvFindCornerSubPix(const CvArr* image, CvPoint2D32f* corners, int count, CvSize win, CvSize zero_zone, CvTermCriteria criteria);

(2)函數參數

函數參數說明如下:

image:輸入圖像

corners:輸入角點的初始坐標以及精准化後的坐標用於輸出。

winSize:搜索窗口邊長的一半,例如如果winSize=Size(5,5),則一個大小為\的搜索窗口將被使用。

<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+emVyb1pvbmWjusvRy/fH+NPy1tC85LXEZGVhZCByZWdpb26x37OktcTSu7Dro6zT0Mqx08PT2rHcw+LX1M/gudi+2NXztcTG5tLs0NSho8jnufsmIzIwNTQwO8nozqooLTEsLTEp1PKx7cq+w7vT0NXiuPbH+NPyoaM8YnI+CmNyaXRlcmlho7q9x7XjvqvXvLuvtfy0+rn9s8y1xNbV1rnM9bz+oaPSsr7Nyse1sbX8tPq0zsr9s6y5/WNyaXRlcmlhLm1heENvdW50o6y78tXfvce148671sOx5Luv0KHT2mNyaXRlcmlhLmVwc2lsb27KsaOszaPWubX8tPq5/bPMoaM8YnI+CjwvcD4KPHA+PC9wPgo8aDE+PHN0cm9uZz60+sLryr7A/Twvc3Ryb25nPjwvaDE+CjxwPjwvcD4KPHA+tPrC68q+wP27+dPaZ29vZEZlYXR1cmVzVG9UcmFjaygpvOyy4rP2wLS1xL3HteOjrMq508Njb3JuZXJTdWJQaXgoKbqvyv29q73HtePOu9bDvqvIt7W90cfP8cvYvLa+q7bIoaM8YnI+CjwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">/** * @使用cornerSubPix()函數在goodFeaturesToTrack()的角點檢測基礎上將角點位置精確到亞像素級別 * @author holybin */ #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include #include #include using namespace cv; using namespace std; /// 全局變量 Mat src, srcGray; int maxCorners = 10; //角點個數的最大值 int maxCornersThresh = 20; //角點個數最大值的上限(滑動條范圍0-20) char* detectWindow = "detection"; char* refineWindow = "refinement"; /// 角點精准化函數聲明 void doCornerRefinement( int, void* ); int main( int argc, char** argv ) { /// 載入圖像並灰度化 src = imread( "D:\\opencv_pic\\house_small.jpg", 1 ); cvtColor( src, srcGray, CV_BGR2GRAY ); /// 創建顯示窗口以及滑動條 namedWindow( detectWindow, CV_WINDOW_AUTOSIZE ); createTrackbar( "max num:", detectWindow, &maxCorners, maxCornersThresh, doCornerRefinement ); imshow( detectWindow, src ); doCornerRefinement( 0, 0 ); waitKey(0); return(0); } /// 使用Shi-Tomasi方法檢測角點,再對角點位置進行精准化 void doCornerRefinement( int, void* ) { if( maxCorners < 1 ) maxCorners = 1; /// Shi-Tomasi的參數設置 vector corners; double qualityLevel = 0.01; double minDistance = 10; int blockSize = 3; bool useHarrisDetector = false; //不使用Harris檢測算法 double k = 0.04; /// 深度拷貝原圖像用於繪制角點 Mat detectSrcCopy = src.clone(); Mat refineSrcCopy = src.clone(); /// 應用Shi-Tomasi角點檢測算法 goodFeaturesToTrack( srcGray, corners, maxCorners, qualityLevel, minDistance, Mat(), //未選擇感興趣區域 blockSize, useHarrisDetector, k ); /// 當maxCorners的值較小時,以下兩個值基本是一樣的; /// 當maxCorners的值較大時,實際檢測到的角點數目有可能小於maxCorners,以下兩個值不一樣。 cout<<"* detected corners : "<

實驗結果:

\



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved