如何像matlab一样检测opencv中的角点?

Posted

技术标签:

【中文标题】如何像matlab一样检测opencv中的角点?【英文标题】:How to detect corners in opencv just like matlab? 【发布时间】:2014-02-11 18:21:19 【问题描述】:

我在 MATLAB 中编写了一个代码,现在想将其转换为 openCV。我面临的问题是,在 MATLAB 中,角点检测是通过 corner() 的简单命令完成的,它以检测到的角点的 (x,y) 坐标数组的形式提供输出。 现在 openCV 文档给了我this example。 使用cornerHarris()函数有两个问题。

    它没有给我角的 (x,y) 坐标。 我必须为每张图像选择不同的阈值,而 MATLAB 中的 corner() 过去常常自行执行此操作。

由于我是 openCV 的新手,因此我将不胜感激任何能够完成这两件事的函数。

【问题讨论】:

【参考方案1】:

我认为OpenCV中最相似的功能是:

goodFeaturesToTrack

代码如下:

#pragma once
#include <string>
#include <iostream>
#include <vector>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
//----------------------------------------------------------
// MAIN
//----------------------------------------------------------
int main(int argc, char* argv[])

    // src image
    Mat src;
    // dst image
    Mat dst;
    // Image loading
    namedWindow("result");
    namedWindow("src");
    src=imread("d:\\ImagesForTest\\lena.jpg",0);    

    cv::cvtColor(src,dst,cv::COLOR_GRAY2BGR);

    Mat corners;
    cv::goodFeaturesToTrack(src,corners,50,0.01,20.0);

    for(int i=0;i<corners.rows;++i)
    
        circle(dst,cv::Point(corners.at<float>(i,0),corners.at<float>(i,1)),3,Scalar(255,0,0),-1,CV_AA);
    

    imshow("src",src);
    imshow("result",dst);
    //----------------------------------------------------------
    // Wait key press
    //----------------------------------------------------------
    waitKey(0);
    destroyAllWindows();
    return 0;

结果:

【讨论】:

我看到您使用的是#pragma once。我在使用pragma 的东西时遇到问题,我在这里提到了我的问题***.com/questions/21710791/… 您可以安全地评论/删除它。 不不...我不是在询问您的这篇文章...我有另一个项目,我想在其中使用“pragma”,但我遇到了一些问题...你可以帮帮我...我在这里发布了我的问题***.com/questions/21710791/… 谢谢。你很有帮助。【参考方案2】:

如前所述,goodFeaturesToTrack() 方法将为您提供具有x (i.e. column index)y(i.e. row index) 的角点

请看下面的代码:

void goodFeatureToTrack(Mat Vx) 
 

    /// Parameters for Shi-Tomasi algorithm
    vector<Point2f> cornersVx;
    int maxCorners = 100;
    double qualityLevel = 0.01;
    double minDistance = 10;
    int blockSize = 3;
    bool useHarrisDetector = false;
    double k = 0.04;

    goodFeaturesToTrack( Vx, cornersVx, maxCorners, qualityLevel, minDistance, Mat(), blockSize, useHarrisDetector, k );



    for(int i=0; i<cornersVx.size(); i++)
    
        cout<<"\n Point for VX:  "<<cornersVx[i].x<<"  "<<cornersVx[i].y;
    



【讨论】:

以上是关于如何像matlab一样检测opencv中的角点?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV亚像素级的角点检测

各位高手,matlab实现了两幅图像的角点检测,怎样实现角点匹配

OpenCV中检测ChArUco的角点

[图像识别]11.OpenCV的角点检测 FAST和OBR算法

图中的角点和边缘检测

求C++中利用opencv计算轮廓图像傅里叶描述子的代码