Shi-Tomasi角点检测

一、算法基本原理和步骤

(1)原理
shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。

(2)算法步骤
Shi-Tomasi角点检测_第1张图片


二、代码实现

(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
#include
#include
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 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: "<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角点检测_第2张图片

你可能感兴趣的:(opencv2)