寻找Harris、Shi-Tomasi和亚像素角点

Harris、Shi-Tomasi和亚像素角点都是角点,隶属于特征点这个大类(特征点可以分为边缘、角点、斑点).

一、Harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性较高,但是也可能出现有用信息丢失的情况。

函数:cornerHarris()

void cv::cornerHarris ( InputArray  src,  //需要为8位单通道
    OutputArray  dst,  //结果
    int  blockSize, //领域大小
    int  ksize, //Sobel孔径大小
    double  k, //Harris参数
    int  borderType = BORDER_DEFAULT 
  )    

Harris corner detector.

The function runs the Harris corner detector on the image. Similarly to cornerMinEigenVal and cornerEigenValsAndVecs , for each pixel (x, y) it calculates a 2\times2 gradient covariance matrix M^{(x,y)} over a \texttt{blockSize} \times \texttt{blockSize} neighborhood. Then, it computes the following characteristic:

(特征点计算方法)

Corners in the image can be found as the local maxima of this response map.

Parameters
src Input single-channel 8-bit or floating-point image.
dst Image to store the Harris detector responses. It has the type CV_32FC1 and the same size as src .
blockSize Neighborhood size (see the details on cornerEigenValsAndVecs ).
ksize Aperture parameter for the Sobel operator.
k Harris detector free parameter. See the formula below.
borderType Pixel extrapolation method. See cv::BorderTypes.

调用:

 

Mat srcGray = imread("e:/template/lena.jpg",IMREAD_GRAYSCALE);
    //进行角点检测
    Mat matHarris;
    cornerHarris(srcGray,matHarris,2,3,0.01);
    //显示
    Mat matDst;
    threshold(matHarris,matDst,0.00001,255,THRESH_BINARY);
    imshow("matDst",matDst);
    waitKey(0);

lena的结果:

二、Shi-Tomasi角点

一般认为是Harris的改进,因为当时提出的论文叫做《Good Features to Track》,所以这种角点再OpenCV中叫做goodFeatures

函数:goodFeaturesToTrack()

void cv::goodFeaturesToTrack ( InputArray  image,//输入图像
    OutputArray  corners,//输出向量
    int  maxCorners,//角点最大数量
    double  qualityLevel,//角点检测可接受的最小特征值
    double  minDistance,//角点之间的最小距离
    InputArray  mask = noArray(),//感兴趣区域
    int  blockSize = 3,//领域范围
    bool  useHarrisDetector = false,//true为harris;false为Shi-Tomasi
    double  k = 0.04 //权重系数
  )    

Determines strong corners on an image.

The function finds the most prominent corners in the image or in the specified image region, as described in [154]

  • Function calculates the corner quality measure at every source image pixel using the cornerMinEigenVal or cornerHarris .
  • Function performs a non-maximum suppression (the local maximums in 3 x 3 neighborhood are retained).
  • The corners with the minimal eigenvalue less than qualityLevel⋅maxx,yqualityMeasureMap(x,y) are rejected.
  • The remaining corners are sorted by the quality measure in the descending order.
  • Function throws away each corner for which there is a stronger corner at a distance less than maxDistance.

The function can be used to initialize a point-based tracker of an object.

Note
If the function is called with different values A and B of the parameter qualityLevel , and A > B, the vector of returned corners with qualityLevel=A will be the prefix of the output vector with qualityLevel=B .
Parameters
image Input 8-bit or floating-point 32-bit, single-channel image.
corners Output vector of detected corners.
maxCorners Maximum number of corners to return. If there are more corners than are found, the strongest of them is returned. maxCorners <= 0 implies that no limit on the maximum is set and all detected corners are returned.
qualityLevel Parameter characterizing the minimal accepted quality of image corners. The parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue (see cornerMinEigenVal ) or the Harris function response (see cornerHarris ). The corners with the quality measure less than the product are rejected. For example, if the best corner has the quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure less than 15 are rejected.
minDistance Minimum possible Euclidean distance between the returned corners.
mask Optional region of interest. If the image is not empty (it needs to have the type CV_8UC1 and the same size as image ), it specifies the region in which the corners are detected.
blockSize Size of an average block for computing a derivative covariation matrix over each pixel neighborhood. See cornerEigenValsAndVecs .
useHarrisDetector Parameter indicating whether to use a Harris detector (see cornerHarris) or cornerMinEigenVal.
k Free parameter of the Harris detector.

调用:

Mat srcGray = imread("e:/template/lena.jpg",IMREAD_GRAYSCALE);

//进行角点检测
    Mat matHarris;
    vector<Point2f> corners;//输出向量
    goodFeaturesToTrack(srcGray,corners,100,0.01,10,Mat(),3,false,0.04);
    //显示
    Mat matDst = srcGray.clone();
    for (int i=0;i<corners.size();i++)
    {
        circle(matDst,corners[i],2,Scalar(255));
    }
     
    imshow("matDst",matDst);
    waitKey(0);

结果:

可以看到,眼部、帽子上面的尖端这些的却是"GoodFeatures"的地方都被标注了出来

三、如果需要亚像素的角点,我们必须更进一步。

函数:cornerSubPix()

void cv::cornerSubPix ( InputArray  image,
    InputOutputArray  corners,
    Size  winSize,
    Size  zeroZone,
    TermCriteria  criteria 
  )    

调用:需要注意现计算goodfeatures再算亚像素

Mat srcGray = imread("e:/template/lena.jpg",IMREAD_GRAYSCALE);
    //进行角点检测
    Mat matHarris;
    vector<Point2f> corners;//输出向量
    cv::goodFeaturesToTrack(
        srcGray,                              // Image to track
        corners,                          // Vector of detected corners (output)
        MAX_CORNERS,                       // Keep up to this many corners
        0.01,                              // Quality level (percent of maximum)
        5,                                 // Min distance between corners
        cv::noArray(),                     // Mask
        3,                                 // Block size
        false,                             // true: Harris, false: Shi-Tomasi
        0.04                               // method specific parameter
        );
    cv::cornerSubPix(
        srcGray,                          // Input image
        corners,                          // Vector of corners (input and output)
        cv::Size(5, 5),      // Half side length of search window
        cv::Size(-1,-1),                   // Half side length of dead zone (-1=none)
        cv::TermCriteria(
            cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS,
            20,                              // Maximum number of iterations
            0.03                             // Minimum change per iteration
            )
        );
    //显示
    Mat matDst = srcGray.clone();
    for (int i=0;i<corners.size();i++)
    {
        circle(matDst,corners[i],2,Scalar(255));
        cout<<"\t"<<"序号"<<i<<"亚像素坐标("<<corners[i].x<<","<<corners[i].y<<")"<<endl;
    }
     
    imshow("matDst",matDst);
    waitKey(0);

结果:

可以看到其计算处理小数点后面的值。

四、小结

角点虽然现在用的比较少了,但是作为基本的知识有必要了解;下一步的更为复杂的特征点模型都是基于角点的,它们之间有着一脉相承的关系。

时间: 2024-10-15 14:16:33

寻找Harris、Shi-Tomasi和亚像素角点的相关文章

OpenCV——Harris、Shi Tomas、自定义、亚像素角点检测

在图像处理和与计算机视觉领域,兴趣点(interest points),或称作关键点(keypoints).特征点(feature points) 被大量用于解决物体识别,图像识别.图像匹配.视觉跟踪.三维重建等一系列的问题.我们不再观察整幅图,而是选择某些特殊的点,然后对他们进行局部有的放矢的分析.如果能检测到足够多的这种点,同时他们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就有使用价值. 图像特征类型可以被分为如下三种: <1>边缘 <2>角点 (感兴趣关键点) &

图像处理之角点检测与亚像素角点定位

角点是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角点可以有效提高图像处理速度与精准度.所以对于整张图像来说特别重要,角点检测与提取的越准确图像处理与分析结果就越接近真实.同时角点检测对真实环境下的对象识别.对象匹配都起到决定性作用.Harr角点检测是图像处理中角点提取的经典算法之一,应用范围广发,在经典的SIFT特征提取算法中Harr角点检测起到关键作用.通常对角点检测算法都有如下要求: 1. 基于灰度图像.能够自动调整运行稳定,检测出角点的数目. 2. 对噪声不敏感.有一定的噪声

亚像素角点

Harris 角点定义为一个邻域内存在两个正交方向上梯度变化较大的点. 作 xy 平面上的二维函数,使用自相关函数可描述图像上一固定点在任意方向上的灰度变化:然后利用泰勒级数展开自相关函数,即可将其转换为矩阵特征值问题(参考博文 "光流跟踪"). 在某些应用中(如视觉测量),想获得更加精确的角点定位,可使用角点亚像素算法实现. 在提取亚像素边缘时,可以通过数学建模(最小二乘法)来描述边缘方向上一阶导数曲线,该曲线为一个二次函数:然后找到数学模型的最值点即为亚像素边缘位置. 对于 Har

OpenCV中feature2D学习——亚像素级角点检测(cornerSubPix)

概述 除了利用Harris进行角点检测和利用Shi-Tomasi方法进行角点检测外,还可以使用cornerEigenValsAndVecs()函数和cornerMinEigenVal()函数自定义角点检测函数.如果对角点的精度有更高的要求,可以用cornerSubPix()函数将角点定位到子像素,从而取得亚像素级别的角点检测效果. cornerSubPix()函数 (1)函数原型 cornerSubPix()函数在角点检测中精确化角点位置,其函数原型如下: C++: void cornerSub

OpenCV亚像素级的角点检测

亚像素级的角点检测 目标 在本教程中我们将涉及以下内容: 使用OpenCV函数 cornerSubPix 寻找更精确的角点位置 (不是整数类型的位置,而是更精确的浮点类型位置). 理论 代码 这个教程的代码如下所示.源代码还可以从 这个链接下载得到 #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #inclu

亚像素级角点定位

代码示例: #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace cv; using namespace std; #define WINDOW_NAME "Shi-Tom

OpenCv_cvFindCornerSubPix()查找亚像素级角点

如果我们进行图像处理的目的不是用于识别特征点而是进行稽核测量,则通常需要更高的精度,而cvGoodFeatureToTrack()只能提供简单的像素坐标值,但有时候我们会需要实际坐标值而不是证书坐标值,例如,我们想要确定图形中一个尖锐的峰值点的位置,但是峰值点的位置一般都不会位于一个像素点的正中心,,这时候就可以使用亚像素检测方法. 亚像素级角点的位置在社星际标定.跟踪并重建蛇形阿基的轨迹或者重建被跟踪目标的三维结构时就是一个基本的测量值.通过cvGoodFeaturesToTrack()函数可

亚像素边缘检测评述

转载请注明出处:http://blog.csdn.net/lsh_2013 1 引言 数字图像的边缘检测是图像分割.目标识别.区域形状提取等图像处理领域的重要基础.在进行图像理解和分析时,第一步往往是边缘检测.目前边缘检测已经成为机器视觉领域最活跃的课题之一,其研究具有非常重要的理论意义和实际应用价值.传统的边缘检测方法的检测精度最高只能达到一个像素级,但是,随着科学技术的飞速发展,工业检测等应用对精确度的要求不断提高,传统的像素级边缘检测方法已经不能满足实际测量的需要,本文重点介绍的亚像素边缘

亚像素数值极值检测算法总结

动机 在计算机视觉领域,经常需要检测极值位置,比如SIFT关键点检测.模板匹配获得最大响应位置.统计直方图峰值位置.边缘检测等等,有时只需要像素精度就可以,有时则需要亚像素精度.本文尝试总结几种常用的一维离散数据极值检测方法,几个算法主要来自论文<A Comparison of Algorithms for Subpixel Peak Detection>,加上自己的理解和推导. 问题定义 给定如下离散值,求其极值位置.可知125为观察极值. \[[60, 80, 100, 120, 125,