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

    效果演示:

  • 相关阅读:
    公用导航栏的根据url控制选中导航js
    页面切换出动晃动解决
    redis五大数据类型
    redis简介
    Linux安装redis
    各种锁的理解
    原子引用
    理解CAS
    彻底玩转单例模式
    Volatile
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/12459005.html
Copyright © 2020-2023  润新知