2013-07-16 81 views
3

我正在開發一個OpenCV項目,我嘗試使用ORB特徵檢測器,BRISK特徵描述符和Brute Force Matcher的組合來檢測,匹配和跟蹤特徵由我的攝像頭提供的視頻序列。OpenCV的蠻力匹配器在第二次迭代時崩潰

目前,一切工作正常單張圖片。我可以突出顯示屏幕上的某個區域,將其提取爲ROI,檢測其功能並將其匹配回到視頻的第一幀。但是,當我嘗試在視頻序列上計算此過程時,出現了我的問題。

camera >> cameraFrame; 
cv::cvtColor(cameraFrame, greyFrame, cv::COLOR_BGR2GRAY); 

BriskMatching::briskMatcher.findFrameFeatures(greyFrame, mask); 
BriskMatching::briskMatcher.computeFrameDescriptors(greyFrame); 

     if(BriskMatching::briskMatcher.getFirstFrame()) 
     { 
      BriskMatching::briskMatcher.findImgFeatures(imgToMatch_1C); 
      BriskMatching::briskMatcher.setFirstFrame(false); 
      clearMask.copyTo(mask); 
      BriskMatching::briskMatcher.computeImgDescriptors(imgToMatch_1C); 
     } 
    } 

    BriskMatching::briskMatcher.match(); 
    BriskMatching::briskMatcher.mMatches.clear(); 
    cv::drawMatches(imgToMatch_1C, BriskMatching::briskMatcher.mImgORBFeatures, greyFrame, BriskMatching::briskMatcher.mFrameORBFeatures, BriskMatching::briskMatcher.mMatches, matchesImg, cv::Scalar(255, 255, 255)); 
    cv::imshow("Matches", matchesImg); 

程序崩潰,在運行時,當我打電話BriskMatching::briskMatcher.match();,但只有程序循環的第一次迭代之後。下面是包含在briskMatcher.match()函數的代碼...

void BriskMatching::match() 
{ 
    mBfMatcher.match(mImgDescriptors,mFrameDescriptors, mMatches); 
} 

這與內存異常錯誤我得到的結合使我相信,有與三個容器的匹配功能正在努力的一個問題使用,主要是mMatches這是一個std::vector<cv::KeyPoint>我試圖通過在再次使用之前調用mMatches.clear();來清除該向量,雖然向量被清除,但我仍然在運行時遇到崩潰。

有沒有人有任何見解或建議,可能會導致我的崩潰。一段時間以來,我一直在搞這個,現在開始變得非常沮喪。先謝謝了。

+1

也許你顯示錯誤日誌? – McBodik

回答

0

我試圖對你做同樣的事情,我有一個程序有很多檢測器,提取器和匹配算法,我和你有同樣的問題。

在我的情況下,我決定使用ORB檢測器和SIFT提取器方法,如果我使用Knn-Matcher或FLANN-Matcher並且工作正常,但是當我使用這種方法實現BFMatcher時,我無法做到這一點。最後,我決定使用BFMatcher的ORB提取器,它工作。

我的代碼是這樣的:

else if(botonORBisPressed){ 
     OrbFeatureDetector detector; 
     for (int i=0; i<2; i++) { 
      detector.detect(gray_image[i], keypoints[i]); 
     } 

     //Extractor method depends on Matcher. 
     if (botonBFPulsado == true) { 
      Ptr <DescriptorExtractor> extractor = DescriptorExtractor::create("ORB"); 
      if(!extractor) 
      { 
       cout << "Error creating feature descriptor" << endl; 
       getchar(); 
      } 

      for (int i=0; i<2; i++) { 
       (* extractor).compute(gray_image[i], keypoints[i], descriptors[i]); 
      } 
     } 

     if ((botonFlannisPressed == true) || (botonKnnisPressed == true)) { 
      //Use SIFT algorithm to do the matching 
      SiftDescriptorExtractor extractor; 
      for (int i=0 ; i<2 ; i++) { 
       extractor.compute(gray_image[i], keypoints[i],descriptors[i]); 
      } 
     } 
    } 

如果你想使用提取-SIFT方法,我建議你使用其他匹配算法,我做到了,但是如果你喜歡,你可以做同樣的我(取決於使用一個或其他提取器的匹配方法),並且您將比較結果。