opencv提供了goodFeaturesToTrack函数用来实现Shi-Tomasi算子,其API函数接口为
void cv::goodFeaturesToTrack(
InputArray _image,
OutputArray _corners,
int maxCorners,
double qualityLevel,
double minDistance,
InputArray _mask,
int blockSize,
bool useHarrisDetector, double harrisK )
第一个参数:8位或32位浮点型输入图像,单通道
第二个参数:保存检测出的角点
第三个参数:角点数目最大值,如果实际检测的角点超过此值,则只返回前maxCorners个强角点
第四个参数:角点的品质因子
第五个参数:对于初选出的角点而言,如果在其周围minDistance范围内存在其他更强角点,则将此角点删除
第六个参数:指定感兴趣区,如不需在整幅图上寻找角点,则用此参数指定ROI
第七个参数:计算协方差矩阵时的窗口大小
第八个参数:指示是否使用Harris角点检测,如不指定,则计算shi-tomasi角点
第九个参数:Harris角点检测需要的k值
代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = imread("E:\\testimage\\harris.jpg");
if (!srcImage.data)
return -1;
Mat srcGray;
cvtColor(srcImage, srcGray, CV_BGR2GRAY);
vector<Point2f> vecCorners;//角点容器
double qualityLevel = 0.02;//角点品质因子
double minDistance = 13;//minDistance
int blockSize = 3;//窗口大小
bool useHarrisDetector = false;//不适用harris
double k = 0.05;
int maxCorners = 40;
int maxTrackbar = 80;
Mat resultImage = srcImage.clone();
goodFeaturesToTrack(srcGray,
vecCorners, maxCorners,
qualityLevel, minDistance,
Mat(), blockSize, useHarrisDetector, k);
std::cout << "角点个数为:" << vecCorners.size() << endl;
for (int i = 0; i < vecCorners.size(); i++)
{
circle(resultImage, vecCorners[i], 4,
Scalar(0, 255, 255), 2);
}
imshow("srcImage", srcImage);
imshow("resultImage", resultImage);
imwrite("srcImage.jpg", srcImage);
imwrite("resultImage.jpg", resultImage);
waitKey(0);
return 0;
}