Shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
#include "pch.h"
//----------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
#define source_window "Shi-Tomasi——source"
#define corners_window "Shi-Tomasi——corners"
void cornerShiTomasi_demo(int, void*);
Mat g_srcImage, g_grayImage;
int maxCorners = 33;
int maxTrackbar = 500;
int main()
{
g_srcImage = imread("3.jpg");
cvtColor(g_srcImage, g_grayImage, CV_BGR2GRAY);
namedWindow(source_window, CV_WINDOW_AUTOSIZE);
createTrackbar("Max corners:", source_window, &maxCorners, maxTrackbar, cornerShiTomasi_demo);
imshow(source_window, g_srcImage);
cornerShiTomasi_demo(0, 0);
waitKey(0);
return 0;
}
void cornerShiTomasi_demo(int, void*)
{
if (maxCorners < 1) { maxCorners = 1; }
/// Parameters for Shi-Tomasi algorithm
vector<Point2f> corners;
double qualityLevel = 0.01;//角点检测可以接受的最小特征值
double minDistance = 10;//角点之间的最小距离
int blockSize = 3;//计算倒数自相关矩阵时指定的领域范围
double k = 0.04;//权重系数
bool useHarrisDetector = false;//不使用Harris角点检测
/// Copy the source image
Mat copyMat = g_srcImage.clone();
/// Apply corner detection :Determines strong corners on an image.
goodFeaturesToTrack(g_grayImage,
corners,
maxCorners,
qualityLevel,
minDistance,
Mat(),
blockSize,
useHarrisDetector,
k);
/// Draw corners detected
for (unsigned int i = 0; i < corners.size(); i++) {
circle(copyMat, corners[i], 5, Scalar(255), -1, 8, 0);
circle(g_srcImage, corners[i], 4, Scalar(0, 255, 0), 2, 8, 0);
}
/// Show what you got
imshow(corners_window, copyMat);
imshow(source_window, g_srcImage);
}
参考: