欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Shi-Tomasi角点检测

程序员文章站 2024-03-25 19:34:10
...

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

上一篇: JS中 的NaN,神奇的存在 !

下一篇: