Shi-Tomasi角点检测

本文介绍了Shi-Tomasi角点检测算法,它是Harris算法的改进版。该算法通过计算矩阵M的特征值来检测角点,并在代码实现部分详细解析了goodFeatureTrack()函数,包括参数意义和功能,帮助理解如何在OpenCV中应用该算法进行角点检测。

一、算法基本原理和步骤

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

结果:

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值