from http://blog.sina.com.cn/s/blog_96b836170102w1ki.html
本博文原理部分简述,重点在编程实现(程序参考并修改了网上资料,网上程序不一定能运行,但本文程序亲测能跑)。
Shi-Tomasi 算法是Harris算法的改进。Harris算法最原始的定义是将矩阵M 的行列式值与M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi和Tomasi提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
//ShiTomas
#include "stdafx.h"
#include
#include
#include
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include
#include
#include
#include
using namespace cv;
using namespace std;
/// 全局变量
Mat src,srcGray;
int maxCorners=23; //角点个数的最大值
int maxCornersThresh= 1000; //角点个数最大值的上限(滑动条范围0-1000)
RNG rng(12345);
char*sourceWindow = "src";
/// 角点检测函数声明
void doGoodFeaturesToTrack(int,void*);
int main(intargc,char**argv)
{
/// 载入图像并灰度化
src = imread("C:\\Users\\Administrator\\Desktop\\qi.jpg",1);
cvtColor(src, srcGray, CV_BGR2GRAY);
/// 创建显示窗口以及滑动条
//namedWindow(sourceWindow, CV_WINDOW_AUTOSIZE);
//createTrackbar("maxnum:",sourceWindow, &maxCorners, maxCornersThresh,doGoodFeaturesToTrack);
imshow(sourceWindow, src);
doGoodFeaturesToTrack(0, 0);
waitKey(0);
return(0);
}
/// 角点检测函数实现:标示出每个角点位置
void doGoodFeaturesToTrack(int,void*)
{
if(maxCorners< 1)
maxCorners = 1;
/// Shi-Tomasi的参数设置
vector<</span>Point2f>corners;
doublequalityLevel= 0.01;
doubleminDistance= 10;
intblockSize= 3;
booluseHarrisDetector= false; //不使用Harris检测算法
doublek= 0.04;
/// 深度拷贝原图像用于绘制角点
MatsrcCopy= src.clone();
/// 应用角点检测算法
goodFeaturesToTrack(srcGray,
corners,
maxCorners,
qualityLevel,
minDistance,
Mat(), //未选择感兴趣区域
blockSize,
useHarrisDetector,
k);
/// 当maxCorners的值较小时,以下两个值基本是一样的;
/// 当maxCorners的值较大时,实际检测到的角点数目有可能小于maxCorners,以下两个值不一样。
cout << "* detected corners : " <<corners.size() << endl;
cout << "** max corners: " <<maxCorners << endl;
/// 绘制出角点
intr= 4;
for(inti= 0; i < corners.size(); i++)
circle(srcCopy, corners[i], r, Scalar(0,255, 0), -1, 8, 0);
/// 显示结果
namedWindow(sourceWindow, CV_WINDOW_AUTOSIZE);
imshow(sourceWindow, srcCopy);
}
效果图: