zoukankan      html  css  js  c++  java
  • opencv::Shi-Tomasi角点检测

    Shi-Tomasi角点检测理论 跟Harris角点检测的理论几乎完全一致,

    唯一不同的是 在使用矩阵 特征值

    /*

    确定图像的强角点
    在图像中寻找具有大特征值的角点。
    该函数,首先用cvCornerMinEigenVal 计算输入图像的每一个象素点的最小特征值,并将结果存储到变量 eig_image 中。
    然后进行非最大值抑制(仅保留3x3邻域中的局部最大值)。
    下一步将最小特征值小于 quality_level?max(eig_image(x,y)) 排除掉。
    最后,函数确保所有发现的角点之间具有足够的距离,(最强的角点第一个保留,然后检查新的角点与已有角点之间的距离大于 min_distance )

    */
    void
    cvGoodFeaturesToTrack( const CvArr* image, //输入图像,8-位或浮点32-比特,单通道 CvArr* eig_image, //临时浮点32-位图像,尺寸与输入图像一致 CvArr* temp_image, //另外一个临时图像,格式与尺寸与 eig_image 一致 CvPoint2D32f* corners, //输出参数,检测到的角点 int* corner_count, //输出参数,检测到的角点数目 double quality_level, //最大最小特征值的乘法因子。定义可接受图像角点的最小质量因子。 double min_distance, //限制因子。得到的角点的最小距离。使用 Euclidian 距离 const CvArr* mask=NULL );
    #include <opencv2/opencv.hpp>
    #include <iostream>
    
    using namespace cv;
    using namespace std;
    
    int num_corners = 25;
    int max_corners = 200;
    const char* output_title = "ShiTomasi Detector";
    void ShiTomasi_Demo(int, void*);
    Mat src, gray_src;
    RNG rng(12345);
    int main(int argc, char** argv) {
        src = imread("D:/vcprojects/images/home.jpg");
        if (src.empty()) {
            printf("could not load image...
    ");
            return -1;
        }
        namedWindow("input image", CV_WINDOW_AUTOSIZE);
        imshow("input image", src);
    
        //灰度图
        cvtColor(src, gray_src, COLOR_BGR2GRAY);
        namedWindow(output_title, CV_WINDOW_AUTOSIZE);
        //阈值
        createTrackbar("Num Corners:", output_title, &num_corners, max_corners, ShiTomasi_Demo);
        ShiTomasi_Demo(0, 0);
    
        waitKey(0);
        return 0;
    }
    
    void ShiTomasi_Demo(int, void*) {
        //最少检测出5个
        if (num_corners < 5) {
            num_corners = 5;
        }
        vector<Point2f> corners;
        double qualityLevel = 0.01;
        double minDistance = 10;
        int blockSize = 3;
        bool useHarris = false;
        double k = 0.04;
        Mat resultImg = gray_src.clone();
        cvtColor(resultImg, resultImg, COLOR_GRAY2BGR);
        //角点检测  标注随机颜色
        goodFeaturesToTrack(gray_src, corners, num_corners, qualityLevel, minDistance, Mat(), blockSize, useHarris, k);
        printf("Number of Detected Corners:  %d
    ", corners.size());
    
        for (size_t t = 0; t < corners.size(); t++) {
            circle(resultImg, corners[t], 2, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), 2, 8, 0);
        }
        imshow(output_title, resultImg);
    }
  • 相关阅读:
    JSON基础知识
    Java 环境配置
    接口测试基础知识
    Fiddler初学笔记
    es6数组方法findIndex()
    sass+less相关
    前端库/框架/插件相关
    知名博主相关
    CSS相关
    移动Web相关
  • 原文地址:https://www.cnblogs.com/osbreak/p/11598664.html
Copyright © 2011-2022 走看看