Shi-Tomasi为改进的Harris算法,而且可以指定检测出角点的个数。
实现函数:
void goodFeaturesToTrack( InputArray image, //输入图像
OutputArray corners, //检测的角点
int maxCorners, //指定检测角点的最多个数
double qualityLevel, //特征值的乘法因子
double minDistance, //角点之间的最小距离(欧氏距离)
InputArray mask=noArray(), //掩码
int blockSize=3, //领域大小
bool useHarrisDetector=false, //是否采用Harris角点检测
double k=0.0) //Harris系数,0.04-0.06
代码示例:
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int num_corners = 10;
int max_corners = 200;
const char* output_title = "ShiTomasi Detector";
void ShiTomasi_Demo(int, void*);
Mat src, gray_src;
int main(int argc, char** argv)
{
src = imread("D:/cv400/house.jpg");
if (src.empty())
{
cout << "Load image error..." << endl;
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
cvtColor(src, gray_src, COLOR_BGR2GRAY);
namedWindow(output_title, WINDOW_AUTOSIZE);
createTrackbar("Num Corners:", output_title, &num_corners, max_corners, ShiTomasi_Demo);
ShiTomasi_Demo(0, 0);
waitKey(0);
return 0;
}
void ShiTomasi_Demo(int, void*)
{
if (num_corners < 5)
num_corners = 5;
vector<Point2f> corners;
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
bool useHarris = false;
double k = 0.04;
Mat resultImg = src.clone();
goodFeaturesToTrack(gray_src, corners, num_corners, qualityLevel, minDistance, Mat(), blockSize, useHarris, k);
cout << "Number of Detected Corners: " << corners.size() << endl;
for (size_t t = 0; t < corners.size(); t++)
circle(resultImg, corners[t], 2, Scalar(0,0, 255), 2, 8, 0);
imshow(output_title, resultImg);
}
原图:
检测10个角点:
检测100个角点: