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

               

      

  • 相关阅读:
    AdminLTE 3.0发布了
    .NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响
    【译】ASP.NET Core在 .NET Core 3.1 Preview 1中的更新
    物品编码中心所说的包装指示符
    Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
    Asp.Net Core Mvc Razor之RazorPage
    基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理
    Qt的下载地址
    由于MicrosoftVisualStudio14.0DesignerShadowCache导致的一个异常问题
    Spring系列.事务管理原理简析
  • 原文地址:https://www.cnblogs.com/Jack-Elvis/p/11650206.html
Copyright © 2011-2022 走看看