2015-05-27 117 views
0

我使用ubuntu进行工作,Code是使用opencv的C++。 我测试了一下以检测图片的某些部分。它工作得很好,但现在我想在我的大局中找到位置。这里是代码:C++ Opencv sift Positiondetection

#include... 
using namespace cv; 

int main(int argc, char** argv) { 



Mat img = imread("/home/ubuntu/workspace2/sift/src/inputklein.jpg",CV_LOAD_IMAGE_GRAYSCALE); 


while(1){ 
      Mat img2 =imread("/home/ubuntu/workspace2/sift/src/input.jpeg",CV_LOAD_IMAGE_GRAYSCALE); //frame 
      //initialize SIFT 
      // Create smart pointer for SIFT feature detector. 
      SIFT sift; 
      vector<KeyPoint> key_points; 
      vector<KeyPoint> key_points2; 

      //-- Step 1: Detect the keypoints using SURF Detector 
      int minHessian = 100; 
      SurfFeatureDetector detector(minHessian); 
      detector.detect(img, key_points); 
      detector.detect(img2, key_points2); 

      //-- Step 2: Calculate descriptors (feature vectors) 
      SurfDescriptorExtractor extractor; 

      Mat descriptors1; 
      Mat descriptors2; 

      extractor.compute(img, key_points, descriptors1); 
      extractor.compute(img2, key_points2, descriptors2); 


      //-- Step 3: Matching descriptor vectors using FLANN matcher 
       FlannBasedMatcher matcher; 
       std::vector<DMatch> matches; 
       matcher.match(descriptors1, descriptors2, matches); 

       double max_dist = 20; double min_dist = 10; 


       //-- Quick calculation of max and min distances between keypoints 
       for(int i = 0; i < descriptors1.rows; i++) 
       { double dist = matches[i].distance; 
        if(dist < min_dist) min_dist = dist; 
        if(dist > max_dist) max_dist = dist; 
       } 

       //std::cout<<"Max dist :"<< max_dist ; 
       //std::cout<<"Min dist :"<< min_dist ; 

       //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist, 
       //-- or a small arbitary value (0.02) in the event that min_dist is very 
       //-- small) 
       //-- PS.- radiusMatch can also be used here. 
       std::vector<DMatch> good_matches; 

       for(int i = 0; i < descriptors1.rows; i++) 
       { if(matches[i].distance <= max(2*min_dist, 0.02)) 
        { good_matches.push_back(matches[i]); } 
       } 

       //-- Draw only "good" matches 
       Mat img_matches; 
       drawMatches(img, key_points, img2, key_points2, 
          good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), 
          vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 


       //std::cout<<key_points[1].pt.x<<"\n"; 
       //std::cout<<key_points2[1].pt.y<<"\n"; 



    //-- 3. Apply the classifier to the frame 


     cv::imshow("test", img_matches); //img_matches 
     waitKey(30); 
} 

return 0; 
} 

好吧,但我怎么能得到的位置矿最关键的地方。有人能给我一个提示,我该如何理解它? 我看到我可以使用像这样的东西: “key_points [1] .pt.x”或与y,但我不必检查它到每个x,y地点吗? 接下来会是: good_matches [1] .queryIdx但这里是同样的问题。我如何找到它的位置?

  1. 对我来说一个很大的问题,为什么只有一个循环而已? 它不应该在行和列?在我的目的地它应该像在一个数组(x,y)中工作,我检查每个位置,如果它是相同的...(有没有简单的数据类型的问题...)

  2. 哪里可以找到/或drawMatches的代码的位置(例如)。 正常的方式,我会尝试“公开声明”(使用Eclipse,C++),但我只看到头,而不是真正的功能。 我需要的代码,并希望我能够改变这一切,而不OpenCV的,也许我可以做环......所以我必须明白,我怎么能阅读和使用矢量DMatch ...

THX您的帮助。 最好的问候,

回答

0

如果我把你很好,你会找到关键点的位置和分类他们。要知道关键点的位置,您需要做一个bucle穿过关键点矢量并将其保存在矩阵中。

然后,当你可以比较这些关键点与图像区域(无论你想要的)的位置并根据图像中的区域对它们进行分类。

Mat pointsInFirstAreaRight, pointInFirstAreaLeft; 
    for (int i = 0; i < 2; i++){ 
      for(vector<DMatch>::const_iterator it = keypoints[i].begin(); it!= keypoints[i].end(); ++it){ 
       // Get the position of keypoints 
       float x = [it->queryIdx].pt.x; 
       float y = [it->queryIdx].pt.y; 

       //If the point detected are in the 20 first pixels 
       if ((x < 20) && (y > 20)) 
       { 
         //Classify this point in this area 
         if (i == 0) 
         pointsInFirstAreaRight.push_back(Point2f(x, y)); 
         else if (i == 1) 
         pointsInFistAreaLeft.push_back(Point2f(x, y)); 
        } 
      } 
    } 

关于sift函数,它可以在同一时间执行检测和提取器。我用它在我的代码是这样的:

> SIFT sift; 
>   
>   /* get keypoints on the images */ 
>   sift(imagenI, Mat(), keypoints[0], descriptors[0]); 
>   sift(imagenD, Mat(), keypoints[1], descriptors[1]); 

,然后我发现一个关键点为Extrac点的描述。

然后我只需要做匹配。

我希望能帮到你。

+0

我不知道我是否理解你的代码。 Sry说我在2天后回答,但我认为我不太清楚筛选作品是如何筛选的,我想先阅读。但它没有帮助。你是什么意思与参数pointsInFirstAreaRight ...你的代码中的问题是,我不能使用一些功能,如.push_back。我想在fpga中给出代码,并且我的理解如何,它不喜欢函数库。所以我需要一个非常简单的代码... – knowless

+0

参数pointsInFirstArea是因为我认为你想要分类器的关键点取决于它们的位置,所以这个参数是关键点的矢量来保存(20×20)区域中的关键点。 –

+0

关于我的push_back功能,它运行良好,我不知道为什么你可以使用它。在这种情况下,该功能将点2f中的关键点复制。看到我放在我的激光器中的sift代码。 –