2014-02-11 75 views
1

我在MATLAB中編寫了一個代碼,現在想將它轉換爲openCV。我面臨的問題是,在MATLAB中,通過一個簡單的命令corner()完成拐角檢測,並且以檢測拐角的(x,y)座標數組的形式給出輸出。
現在openCV文檔給我this example
使用cornerHarris()函數有兩個問題。如何像matlab一樣檢測opencv中的角點?

  1. 它不給我角(x,y)座標。
  2. 我必須爲每個圖像選擇不同的閾值,而MATLAB中的corner()本身就是用來做這個的。

任何執行這兩件事的函數都會非常感謝,因爲我是openCV的新手。

回答

3

我認爲,在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; 
} 

而結果:

enter image description here

+0

我看到你正在使用'的#pragma once'。我有問題與使用'雜注'的東西,我在這裏提到我的問題http://stackoverflow.com/questions/21710791/how-to-set-openmp-for-multithreading-in-ubuntu-12-04-for -an-opencv-project?noredirect = 1#comment32828461_21710791 – skm

+0

您可以安全地評論/刪除它。 –

+0

no no ...我不是問你的這篇文章...我有另一個項目,我想使用「雜注」,但我面臨一些問題......所以你可以幫助我... ...我在這裏發佈了我的問題http://stackoverflow.com/questions/21710791/how-to-set-openmp-for-multithreading-in-ubuntu-12-04-for-an-opencv-project/21712492?noredirect= 1#21712492 – skm

0

如前所述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; 
    } 


}