goodFeaturesToTrack——Shi-Tomasi角点检测

摘要:
当检测点数设置为11时,仅检测到具有最大特征值的前11个角:继续增加检测点数,并检测到所有角:

J.Shi和C.Tomasi在1994年在其论文“Good Features to Track”中,提出了一种对Harris角点检测算子的改进算法——Shi-Tomasi角点检测算子,可以看到,Opencv中函数goodFeaturesToTrack就是直接取自他们论文的名字。


goodFeaturesToTrack有比cornerHarris更多的控制参数,函数原型:

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 );


第一个参数image:8位或32位单通道灰度图像;

第二个参数corners:位置点向量,保存的是检测到的角点的坐标;

第三个参数maxCorners:定义可以检测到的角点的数量的最大值;

第四个参数qualityLevel:检测到的角点的质量等级,角点特征值小于qualityLevel*最大特征值的点将被舍弃;

第五个参数minDistance:两个角点间最小间距,以像素为单位;

第六个参数mask:指定检测区域,若检测整幅图像,mask置为空Mat();

第七个参数blockSize:计算协方差矩阵时窗口大小;

第八个参数useHarrisDetector:是否使用Harris角点检测,为false,则使用Shi-Tomasi算子;

第九个参数k:留给Harris角点检测算子用的中间参数,一般取经验值0.04~0.06。第八个参数为false时,该参数不起作用;


goodFeaturesToTrack检测Shi-Tomasi角点简单demo:


#include "core/core.hpp"  
#include "highgui/highgui.hpp" 
#include "imgproc/imgproc.hpp"

using namespace cv;   

Mat image;
Mat imageGray;
int thresh=5;   //角点个数控制
int MaxThresh=255;

void Trackbar(int,void*);  

int main(int argc,char*argv[])  
{  
	image=imread(argv[1]);
	cvtColor(image,imageGray,CV_RGB2GRAY);
	GaussianBlur(imageGray,imageGray,Size(5,5),1); // 滤波
	namedWindow("Corner Detected");
	createTrackbar("threshold:","Corner Detected",&thresh,MaxThresh,Trackbar);
	imshow("Corner Detected",image);
	Trackbar(0,0);
	waitKey();
	return 0;
}  

void Trackbar(int,void*)
{
	Mat dst,imageSource;
	dst=Mat::zeros(image.size(),CV_32FC1);  
	imageSource=image.clone();
	vector<Point2f> corners;  
	goodFeaturesToTrack(imageGray,corners,thresh,0.01,10,Mat());
	for(int i=0;i<corners.size();i++)
	{
		circle(imageSource,corners[i],2,Scalar(0,0,255),2);
	}
	imshow("Corner Detected",imageSource); 
}


goodFeaturesToTrack相比cornerHarris,增加了检测的复杂度,同时也可以更好的控制检测到的角点的特性,比如角点个数,角点间最小间距等。设置检测点数为11时,只有特征值最大的前11个角点被检测出来:


goodFeaturesToTrack——Shi-Tomasi角点检测第1张


继续增大检测点数的值,所有角点都被检测出来:

goodFeaturesToTrack——Shi-Tomasi角点检测第2张

免责声明:文章转载自《goodFeaturesToTrack——Shi-Tomasi角点检测》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt 手动添加ui文件到工程(转)Bagging和Boosting 概念及区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c++11 std::forward使用场景以及作用

不使用 std::forward时,下述代码G不管传入什么类型的参数,只会最终调用 void F(int& a); using namespace std; void F(int& a) { cout << "int& version " <<a <<endl; } void F(i...

51nod 1136 欧拉函数【数论】

1136 欧拉函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler's totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1...

杨辉三角求沿着矩阵走的路径有多少条

请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。 private static void calc(int row, int col) { int[][] arr = new int[row...

使用lambda调用有参函数

package com.mayikt.service; /** * @ClassName YouShenInterface * @Author 蚂蚁课堂余胜军 QQ644064779 www.mayikt.com * @Version V1.0 **/ @FunctionalInterface public interface YouShenIn...

Java小项目之:教你做个开心消消乐!

Java小项目之:教你做个开心消消乐!今天给大家带来的小项目是开心消消乐(连连看),还是一样的惯例。操作简单,适合java初学者练手。想看其他java小项目的朋友可以关注我,我会持续更新,也可以私信我领资料! 这个游戏分三个模块,其中第一,二两个模块的内容都是非常分散,常常要考虑各这两大模块之间的协作,而且每个模块内部又有很多小模块,互相之间也有非常密切的...

超级素数幂--全国模拟(一)

[编程题] 超级素数幂 时间限制:1秒 空间限制:32768K 如果一个数字能表示为p^q(^表示幂运算)且p为一个素数,q为大于1的正整数就称这个数叫做超级素数幂。现在给出一个正整数n,如果n是一个超级素数幂需要找出对应的p,q。  输入描述: 输入一个正整数n(2 ≤ n ≤ 10^18)     输出描述: 如果n是一个超级素数幂则输出p,q,以空格...