2011-12-19 23 views
0

私はcv :: goodFeaturesToTrackから得る点を反復しようとしています。任意のアイデアOpenCV goodFeaturesToTrack in Obj-C-C++

for (size_t idx = 0; idx < corners.size(); idx++) { 
     cv::circle(image,corners.at(idx),radius,color,thickness); 
} 

std::vector<std::vector<cv::Point2f> > corners; 
cv::goodFeaturesToTrack(image,corners, 500, 0.01, 10); 

動作しません。私の考え、:

私はこのコードを使用して、私のポイントを取得しますか?

+0

参照によって「コーナー」を渡していますか?それが値であれば、それはループに入ることさえありません。 'corners.size()'の値をデバッグしてみてください。 – Mahesh

+0

問題は、idxでcv :: Pointを取得しています...私はループに入っていますが、右隅の点にアクセスできません。私は事務所にいるときより詳細な情報を入力します – dom

答えて

4

検出器goodFeaturesToTrack(実際にはすべての検出器を備えています)、あなたはそれを機能のベクトルのベクトルを渡そうとしている一方で、機能のベクトルを取り込みます。あなたのコードの残りの部分は正常に見えるが、あなたは

std::vector<cv::Point2f> corners; 

にライン

std::vector<std::vector<cv::Point2f>> corners; 

を変更する必要がありますし、うまくいけば、すべてがうまくなります。

+0

ありがとう!今それは働いている:) – dom

1

「機能しない」とは何を意味するのかよくわかりません。しかし、goodFeaturesToTrack_Demo.cppを調べて、その使用方法が問題を解決するかどうかを確認してください。コードと

更新:

/** 
* @function goodFeaturesToTrack_Demo.cpp 
* @brief Demo code for detecting corners using Shi-Tomasi method 
* @author OpenCV team 
*/ 

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

using namespace cv; 
using namespace std; 

/// Global variables 
Mat src, src_gray; 

int maxCorners = 23; 
int maxTrackbar = 100; 

RNG rng(12345); 
const char* source_window = "Image"; 

/// Function header 
void goodFeaturesToTrack_Demo(int, void*); 

/** 
* @function main 
*/ 
int main(int, char** argv) 
{ 
    /// Load source image and convert it to gray 
    src = imread(argv[1], 1); 
    cvtColor(src, src_gray, COLOR_BGR2GRAY); 

    /// Create Window 
    namedWindow(source_window, WINDOW_AUTOSIZE); 

    /// Create Trackbar to set the number of corners 
    createTrackbar("Max corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo); 

    imshow(source_window, src); 

    goodFeaturesToTrack_Demo(0, 0); 

    waitKey(0); 
    return(0); 
} 

/** 
* @function goodFeaturesToTrack_Demo.cpp 
* @brief Apply Shi-Tomasi corner detector 
*/ 
void goodFeaturesToTrack_Demo(int, void*) 
{ 
    if(maxCorners < 1) { maxCorners = 1; } 

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

    /// Copy the source image 
    Mat copy; 
    copy = src.clone(); 

    /// Apply corner detection 
    goodFeaturesToTrack(src_gray, 
       corners, 
       maxCorners, 
       qualityLevel, 
       minDistance, 
       Mat(), 
       blockSize, 
       useHarrisDetector, 
       k); 


    /// Draw corners detected 
    cout<<"** Number of corners detected: "<<corners.size()<<endl; 
    int r = 4; 
    for(size_t i = 0; i < corners.size(); i++) 
    { circle(copy, corners[i], r, Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)), -1, 8, 0); } 

    /// Show what you got 
    namedWindow(source_window, WINDOW_AUTOSIZE); 
    imshow(source_window, copy); 
} 
+0

ありがとう、私はそれを試してみます – dom

+0

提供されたリンクは認証を要求します、コードを見るために登録する必要がありますか?ここに例を載せてください。 – user2727765

+0

それをキャッチするためにありがとう!私はリンクを更新し、後世のためにコードを掲載しました。 – mevatron