- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
確定圖像上的強角點。
該函數在圖像或指定的圖像區域內找到最顯著的角點,如文獻[240]中所述。
- 函數使用 cornerMinEigenVal 或 cornerHarris 在每個源圖像像素上計算角點質量測量值。
- 函數執行非極大值抑制(保留3x3鄰域內的局部最大值)。
- 最小特征值小于 qualityLevel?maxx,yqualityMeasureMap(x,y) 的角點將被拒絕。
- 剩余的角點按照質量測量值從大到小排序。
- 函數會丟棄每一個在其距離小于 maxDistance 范圍內存在更強角點的角點。
該函數可以用于初始化基于點的對象跟蹤器。
注意:
如果以不同的 qualityLevel 參數值 A 和 B 調用該函數,并且 A > B,則返回的帶有 qualityLevel=A 的角點向量將是帶有 qualityLevel=B 的輸出向量的前綴。
函數的文字ID是 “org.opencv.imgproc.feature.goodFeaturesToTrack”。
函數原型
GArray<Point2f> cv::gapi::goodFeaturesToTrack
(const GMat & image,int maxCorners,double qualityLevel,double minDistance,const Mat & mask = Mat(),int blockSize = 3,bool useHarrisDetector = false,double k = 0.04
)
參數
- 參數 image:輸入8位或浮點32位、單通道圖像。 - 參數 maxCorners:要返回的最大角點數量。如果找到的角點多于 maxCorners,將返回最強的那些。maxCorners <= 0 表示對最大數量沒有限制,并返回所有檢測到的角點。
- 參數 qualityLevel:表征接受的最小圖像角點質量的參數。參數值乘以最佳角點質量測量值,即最小特征值(見 cornerMinEigenVal)或 Harris 函數響應(見 cornerHarris)。質量測量值低于此乘積的角點將被拒絕。例如,如果最佳角點的質量測量值為1500,qualityLevel=0.01,則所有質量測量值小于15的角點都將被拒絕。
- 參數 minDistance:返回角點之間的最小可能歐幾里得距離。
- 參數 mask:可選的興趣區域。如果圖像不為空(需要類型為 CV_8UC1 并且與 image 大小相同),則指定檢測角點的區域。
- 參數 blockSize:計算每個像素鄰域導數協方差矩陣的平均塊大小。參見 cornerEigenValsAndVecs。
- 參數 useHarrisDetector:指示是否使用 Harris 檢測器(見 cornerHarris)或 cornerMinEigenVal 的參數。
- 參數 k:Harris 檢測器的自由參數。
返回值
檢測到的角點向量。
代碼示例
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::gapi;int main()
{// 讀取輸入圖像,通常為灰度圖像Mat src = imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", IMREAD_GRAYSCALE );if ( src.empty() ){std::cerr << "無法讀取圖像" << std::endl;return -1;}// 定義G-API網絡cv::GMat in;cv::GArray< cv::Point2f > kpts;kpts = gapi::goodFeaturesToTrack( in,100, // maxCorners0.01, // qualityLevel10, // minDistanceMat(), // mask3, // blockSizefalse, // useHarrisDetector0.04 ); // k// 創建并執行G-API圖cv::GComputation comp( cv::GIn( in ), cv::GOut( kpts ) );std::vector< cv::Point2f > corners;comp.apply( gin( src ), gout( corners ) );// 在原圖上繪制檢測到的角點for ( const auto& point : corners ){circle( src, point, 5, Scalar( 0, 0, 255 ), FILLED );}// 顯示結果imshow( "Good Features to Track", src );waitKey();return 0;
}