opencv —— Shi-Tomasi 角点检测

Shi-Tomasi 角点检测概述

除了利用 Harris 进行角点检测外,我们通常还可以利用 Shi-Tomasi 方法进行角点检测。Shi-Tomasi 算法是 Harris 算法的改进,此算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来 Shi 和 Tomasi 提出了改进方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。

 

确定图像强角点:goodFeaturesToTrack 函数

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

  • image,输入图像,需为 8 位或浮点型 32 位单通道图像。
  • corners,检测到的角点将被存在这里。
  • maxCorners,角点的最大数量。
  • qualityLevel,角点检测可接受的最小特征值 = qualityLevel * 图像中最大特征值。所以 qualityLevel 不会超过 1(通常为 0.1 或 0.01)。检测完所有角点后,还会进一步剔除掉一些距离较近的角点。
  • minDistance,角点间的最小距离,若两角点距离 < minDistance ,则认为是一个角点。
  • mask,可选参数,表示感兴趣区域,有默认值 noArray() ,若此值非空,需为 CV_8UC1 类型,且和 image 有相同尺寸,便于指定角点检测区域。
  • blockSize,有默认值 3,是计算角点的窗口大小。
  • useHarrisDetector,默认为 false,表示是否使用 Harris 角点检测。
  • k,有默认值 0.04,Harris 角点检测计算公式中用到的权重系数。

opencv —— Harris 角点检测

 

代码示例:

#include<opencv.hpp>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
using namespace cv;
Mat src, cornerImg, grayImg;
int mxCorners = 10;
int qualityLevel = 1;
int mnDistance = 20;
RNG rngs = { 12345 };
void Change(int, void*) {
    //计算角点
    vector<Point>corners;
    double ql = qualityLevel * 1.0 / 100;
    goodFeaturesToTrack(grayImg, corners, mxCorners, ql, mnDistance, Mat(), 3, false, 0.04);
    
    //绘制角点
    Mat dst = src.clone();
    for (int i = 0; i < corners.size(); i++) {
        Scalar colors = Scalar(rngs.uniform(0, 255), rngs.uniform(0, 255), rngs.uniform(0, 255));
        circle(dst, corners[i], 5, colors, -1);
    }
    imshow("dst", dst);
}
int main() {
    src = imread("C:/Users/齐明洋/Desktop/示例图片/1.jpg");
    imshow("src", src);

    //转换为灰度图像
    cvtColor(src, grayImg, COLOR_BGR2GRAY);

    namedWindow("dst");
    createTrackbar("maxCorners", "dst", &mxCorners, 100, Change);
    createTrackbar("qualityLevel", "dst", &qualityLevel, 100, Change);
    createTrackbar("minDistance", "dst", &mnDistance, 50, Change);
    Change(0, 0);

    waitKey(0);
}

效果演示:

 

posted @ 2020-03-10 21:48  狂奔的小学生  阅读(941)  评论(0编辑  收藏  举报