zoukankan      html  css  js  c++  java
  • 自定义阈值的两种角点检测

    阈值的设定主要是通过R值矩阵中的R值大小来确定的:

    通过阈值来确定需要的角点R值的范围

    R值矩阵的计算参看:https://www.cnblogs.com/Jack-Elvis/p/11640931.html

     

     harris和shiTomasi两种自定义阈值的角点检测代码如下:

      1 #include <opencv2/opencv.hpp>
      2 #include <iostream>
      3 
      4 #include <math.h>
      5 using namespace cv;
      6 using namespace std;
      7 const char* harris_win = "Custom Harris Corners Detector";
      8 const char* shitomasi_win = "Custom Shi-Tomasi Corners Detector";
      9 
     10 Mat src, gray_src;
     11 // harris corner response
     12 Mat harris_dst, harrisRspImg;
     13 double harris_min_rsp;
     14 double harris_max_rsp;
     15 // shi-tomasi corner response
     16 
     17 Mat shiTomasiRsp;
     18 double shitomasi_max_rsp;
     19 double shitomasi_min_rsp;
     20 int sm_qualitylevel = 30;  //shiTomasiRsp矩阵的拖动变量
     21 // quality level
     22 int qualityLevel = 30;    //harrisRspImg R矩阵的拖动变量
     23 int max_count = 100; 
     24 
     25 void CustomHarris_Demo(int, void*);
     26 void CustomShiTomasi_Demo(int, void*);
     27 
     28 
     29 int main(int argc, char** argv) {
     30     src = imread("L:/6.jpg");
     31     if (src.empty()) {
     32         printf("could not load image...
    ");
     33         return -1;
     34     }
     35     namedWindow("input image", CV_WINDOW_AUTOSIZE);
     36     imshow("input image", src);
     37     cvtColor(src, gray_src, COLOR_BGR2GRAY);
     38 
     39 
     40     //1.harris方法 计算特征值:
     41     int blockSize = 3;
     42     int ksize = 3;
     43     double k = 0.04;
     44     harris_dst = Mat::zeros(src.size(), CV_32FC(6));
     45     harrisRspImg = Mat::zeros(src.size(), CV_32FC1);
     46     cornerEigenValsAndVecs(gray_src, harris_dst, blockSize, ksize, 4);
     47     // 计算gray_src响应,            输出herris_dst特征矩阵
     48 
     49     for (int row = 0; row < harris_dst.rows; row++) {
     50         for (int col = 0; col < harris_dst.cols; col++) {
     51         double lambda1 = harris_dst.at<Vec6f>(row, col)[0]; //harris_dst:M特征矩阵中的特征值:λ1
     52         double lambda2 = harris_dst.at<Vec6f>(row, col)[1]; //harris_dst:M特征矩阵中的特征值:λ2
     53         harrisRspImg.at<float>(row, col) = lambda1*lambda2 - k*pow((lambda1 + lambda2), 2);
     54         //harrisRspImg:R矩阵   R  =  det(M)-k(traceM)2  //平方
     55         }
     56     }
     57     minMaxLoc(harrisRspImg, &harris_min_rsp, &harris_max_rsp, 0, 0, Mat());
     58     //寻找harrisRspImg矩阵中R的最大最小值: harris_min_rsp  harris_max_rsp
     59     namedWindow(harris_win, CV_WINDOW_AUTOSIZE);
     60     createTrackbar("Quality Value:", harris_win, &qualityLevel, max_count, CustomHarris_Demo);
     61     CustomHarris_Demo(0, 0);
     62 
     63 
     64 
     65     //2. shiTomasi方法 计算最小特征值:
     66     shiTomasiRsp = Mat::zeros(src.size(), CV_32FC1);  //定义R矩阵类型
     67     cornerMinEigenVal(gray_src, shiTomasiRsp, blockSize, ksize, 4);
     68     // 输出shiTomasiRsp特征矩阵;即R矩阵
     69     minMaxLoc(shiTomasiRsp, &shitomasi_min_rsp, &shitomasi_max_rsp, 0, 0, Mat());
     70     //找出shiTomasiRsp矩阵最大最小值
     71     namedWindow(shitomasi_win, CV_WINDOW_AUTOSIZE);
     72     createTrackbar("Quality:", shitomasi_win, &sm_qualitylevel, max_count, CustomShiTomasi_Demo);
     73     CustomShiTomasi_Demo(0, 0);
     74 
     75     waitKey(0);
     76     return 0;
     77 }
     78 
     79 void CustomHarris_Demo(int, void*) {
     80     if (qualityLevel < 10) {
     81         qualityLevel = 10;
     82     }
     83     Mat resultImg = src.clone();
     84     float t = harris_min_rsp + (((double)qualityLevel) / max_count)*(harris_max_rsp - harris_min_rsp);
     85     //阈值t =  R矩阵最小值  +   百分之qualityLevel(滑动条)*  R矩阵的值得范围(max-min)
     86     for (int row = 0; row < src.rows; row++) {
     87         for (int col = 0; col < src.cols; col++) {
     88             float v = harrisRspImg.at<float>(row, col); //提取R矩阵的值给v
     89             if (v > t) {                               //画出v>t的点
     90                 circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0);
     91             }
     92         }
     93     }
     94 
     95     imshow(harris_win, resultImg);
     96 }
     97 
     98 //下面函数与上面CustomHarris_Demo函数一样
     99 void CustomShiTomasi_Demo(int, void*) {
    100     if (sm_qualitylevel < 20) {
    101         sm_qualitylevel = 20;
    102     }
    103 
    104     Mat resultImg = src.clone();
    105     float t = shitomasi_min_rsp + (((double)sm_qualitylevel) / max_count)*(shitomasi_max_rsp - shitomasi_min_rsp);
    106     for (int row = 0; row < src.rows; row++) {
    107         for (int col = 0; col < src.cols; col++) {
    108             float v = shiTomasiRsp.at<float>(row, col);
    109             if (v > t) {
    110                 circle(resultImg, Point(col, row), 2, Scalar(0, 0, 255), 2, 8, 0);
    111             }
    112         }
    113     }
    114     imshow(shitomasi_win, resultImg);
    115 }

    结果:

    1.harris                                                                                          2.shiTomasi

               

      

  • 相关阅读:
    「日常训练」Single-use Stones (CFR476D2D)
    「日常训练」Greedy Arkady (CFR476D2C)
    「Haskell 学习」二 类型和函数(上)
    「学习记录」《数值分析》第二章计算实习题(Python语言)
    「日常训练」Alena And The Heater (CFR466D2D)
    Dubbo 消费者
    Dubbo 暴露服务
    Rpc
    git fail to push some refs....
    Spring Cloud (6)config 客户端配置 与GitHub通信
  • 原文地址:https://www.cnblogs.com/Jack-Elvis/p/11650206.html
Copyright © 2011-2022 走看看