图像特征提取与检测——Shi-Tomasi角点检测

opencv提供了goodFeaturesToTrack函数用来实现Shi-Tomasi算子,其API函数接口为
void cv::goodFeaturesToTrack(
InputArray _image,
OutputArray _corners,
int maxCorners,
double qualityLevel,
double minDistance,
InputArray _mask,
int blockSize,
bool useHarrisDetector, double harrisK )

第一个参数:8位或32位浮点型输入图像,单通道
第二个参数:保存检测出的角点
第三个参数:角点数目最大值,如果实际检测的角点超过此值,则只返回前maxCorners个强角点
第四个参数:角点的品质因子
第五个参数:对于初选出的角点而言,如果在其周围minDistance范围内存在其他更强角点,则将此角点删除
第六个参数:指定感兴趣区,如不需在整幅图上寻找角点,则用此参数指定ROI
第七个参数:计算协方差矩阵时的窗口大小
第八个参数:指示是否使用Harris角点检测,如不指定,则计算shi-tomasi角点
第九个参数:Harris角点检测需要的k值

代码如下:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;
int main()
{
    Mat srcImage = imread("E:\\testimage\\harris.jpg");
    if (!srcImage.data)
        return -1;
    Mat srcGray;
    cvtColor(srcImage, srcGray, CV_BGR2GRAY);
    vector<Point2f> vecCorners;//角点容器
    double qualityLevel = 0.02;//角点品质因子
    double minDistance = 13;//minDistance
    int blockSize = 3;//窗口大小
    bool useHarrisDetector = false;//不适用harris
    double k = 0.05;
    int maxCorners = 40;
    int maxTrackbar = 80;
    Mat resultImage = srcImage.clone();
    goodFeaturesToTrack(srcGray,
        vecCorners, maxCorners,
        qualityLevel, minDistance,
        Mat(), blockSize, useHarrisDetector, k);
    std::cout << "角点个数为:" << vecCorners.size() << endl;
    for (int i = 0; i < vecCorners.size(); i++)
    {
        circle(resultImage, vecCorners[i], 4,
            Scalar(0, 255, 255), 2);
    }
    imshow("srcImage", srcImage);
    imshow("resultImage", resultImage);
    imwrite("srcImage.jpg", srcImage);
    imwrite("resultImage.jpg", resultImage);
    waitKey(0);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/songjinxaing/article/details/82054263