一、算法基本原理和步骤
(1)原理
shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
(2)算法步骤
二、代码实现
(1)goodFeatureTrack()函数原型:
void goodFeaturesToTrack( InputArray image, OutputArray corners,int maxCorners, double qualityLevel, double minDistance,InputArray mask=noArray(), int blockSize=3,
bool useHarrisDetector=false, double k=0.04 );
(2)参数说明:
image:输入图像,8-位或浮点32-比特,单通道
corners:输出参数,检测到的角点
corner_count:输出参数,检测到的角点数目
quality_level:最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子
min_distance:限制因子。得到的角点的最小距离;使用 Euclidian 距离
mask
ROI:感兴趣区域。函数在ROI中计算角点,如果 mask 为 NULL,则选择整个图像
block_size: 是计算导数的自相关矩阵时指定点的领域,采用小窗口计算的结果比单点(也就是block_size为1)计算的结果要好
useHarrisDetector:当use_harris的值为非0,则函数使用Harris的角点定义;若为0,则使用Shi-Tomasi的定义
K:用于设置Hessian自相关矩阵即对Hessian行列式的相对权重的权重系数
(3)代码实现:
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int max_cornerNum;
void on_change(int,void*){
Mat image=imread("12.jpg");
Mat imageGray;
cvtColor(image,imageGray,CV_BGR2GRAY );
Mat copyImage;
copyImage=image.clone();
//goodFeaturesToTrack函数参数设置
vector<Point2f> corner;
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
bool useHarrisDetector = false;
double k = 0.04;
//调用函数goodFeaturesToTrack
goodFeaturesToTrack(imageGray,corner,max_cornerNum,qualityLevel,minDistance,Mat(),blockSize,useHarrisDetector,k);
//画图
cout<<"** Number of corners detected: "<<corner.size()<<endl;
int r = 4;
for( int i = 0; i < corner.size(); i++ )
{
circle( copyImage, corner[i], r, Scalar(0,0,255));
}
//显示图像
imshow( "Detector image", copyImage );
}
int main(){
max_cornerNum=23;
namedWindow("Detector image",0);
createTrackbar("cornerNum","Detector image",&max_cornerNum,120,on_change);
waitKey(0);
return 0;
}
结果:
本文介绍了Shi-Tomasi角点检测算法,它是Harris算法的改进版。该算法通过计算矩阵M的特征值来检测角点,并在代码实现部分详细解析了goodFeatureTrack()函数,包括参数意义和功能,帮助理解如何在OpenCV中应用该算法进行角点检测。
1869

被折叠的 条评论
为什么被折叠?



