Shi-Tomasi角点检测

Shi-Tomasi角点检测
确定图像强角点:goodFeaturesToTrack()函数
giidFeaturesToTrack()函数结合了Shi-Tomasi算子,用于确定图像的强角点。
c++:void goodFeaturesToTrack(
InputArray image,
OutputArray corners,
int maxCorners,
double qualityLevel,
double minDistance,
InputArray mask=norArray(),
int blockSize=3,
bool useHarrisDetector=false,
double k=0.4)
第一个参数,InputArray类型的image,输入图像,须为8位或浮点型32位单通道图像。
第二个参数,OutputArray类型的corners,检测到的角点的输出向量。
第三个参数,int类型的maxCorners,角点的最大数量。
第四个参数,double类型的qualityLevel,角点检测可接受的最小特征值。其实实际用于过滤角点的最小特征值是qualityLevel与图像中最大特征值的乘积。所以qualityLevel通常不会超过1(常用的值为0.10或者0.01)。而检测完所有的角点后,还要进一步剔除掉一些距离较近的角点。
第五个参数,double类型的minDistance,角点之间的最小距离,此参数用于保证返回的焦点之间的距离不小于minDistance个像素。
第六个参数,InputArray类型的mask,可选参数,表示感兴趣区域,有默认值noArray().若此参数非空(需为CV_8UC1类型,且和第一个参数image有相同的尺寸),便用于指定角点检测区域。
第七个参数,int类型的blockSize,有默认值3,是计算导数自相关矩阵时指定的领域范围。
第八个参数,bool类型的useHarrisDetector,默认值false,指示是否使用Harris角点检测。
第九个参数,double类型的k,有默认值0.04,为用于设置Hessian自相关矩阵行列式的相对权重的权重系数。

综合实例:Shi-Tomasi角点检测

#include<opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME "【Shi-Tomasi角点检测】"
//全局变量声明
Mat g_srcImage,g_grayimage;
int g_maxCornerNumber=33;
int g_maxTrackbarNumber=500;
RNG g_rng(12345);
//响应滑动条移动消息的回调函数
void on_GoodFeaturesToTrack(int,void*)
{
//【1】对变量小于等于1时处理
if(g_maxCornerNumber<=1)
{
g_maxCornerNumber=1;
}
//【2】Shi-Tomasi算法(goodFeaturesToTrack函数)的参数准备
vector<Point2f> corners;
double qualityLevel=0.01;//角点检测可接受的最小特征值
double minDistance=10;//角点之间的最小距离
int blockSize=3;//计算导数自相关矩阵时指定的领域范围
double k=0.04;//权重系数
//复制原图像到一个临时变量中,作为感兴趣区域
Mat copy=g_srcImage.clone();
//【3】进行Shi-Tomasi角点检测
goodFeaturesToTrack(g_grayImage,
corners,
g_maxCornerNumber,
qualityLevel,
minDistance,
Mat(),
blockSize,
false,
k);
//【4】输出文字信息
cout<<">此次检测到的角点数量为:"<<corners.size()<<endl;
//【5】绘制检测到的角点
int r=4;
for(unsigned int i=0;i<corners.size();i++)
{
//以随机的颜色绘制出角点
circle(copy,corners[i],r,Scalar(g_rng.uniform(0,255),g_rng.uniform(0,255),g_rng.uniform(0,255),-1,8,0);
}
//【6】显示窗口
imshow(WINDOW_NAME,copy);
}
int main()
{
//【1】载入原图像并将其转换为灰度图
g_srcImage=imread("2.jpg",1);
cvtColor(g_srcImage,g_grayImage,COLOR_BGR2GRAY);
//【2】创建窗口和滑动条,并进行显示和回调函数初始化
namedWindow(WINDOW_NAME,WINDOW_AUTOSIZE);
createTrackbar("最大角点数",WINDOW_NAME,&g_maxCornerNumber,g_maxTrackbarNumber,on_GoodFeaturesToTrack);
imshow(WINDOW_NAME,g_srcImage);
on_GoodFeaturesToTrack(0,0);
waitKey(0);
return 0;
}

猜你喜欢

转载自blog.csdn.net/lly_117/article/details/80324947
今日推荐