2013-02-03 2 views
4

J'utilise OpenCV et je 2.4.3 essaie d'appeler BruteForceMatcher, mais je reçois cette erreur:OpenCV: 'BruteForceMatcher': identificateur non déclaré

1>------ Build started: Project: pixelTracking, Configuration: Debug Win32 ------ 
1>Compiling... 
1>main.cpp 
1>d:\myproject\opencv\belajar\pixeltracking\pixeltracking\main.cpp(58) : error C2065: 'BruteForceMatcher' : undeclared identifier 
1>d:\myproject\opencv\belajar\pixeltracking\pixeltracking\main.cpp(58) : error C2275: 'cv::L2<T>' : illegal use of this type as an expression 
1>  with 
1>  [ 
1>   T=float 
1>  ] 
1>d:\myproject\opencv\belajar\pixeltracking\pixeltracking\main.cpp(58) : error C2065: 'matcher' : undeclared identifier 
1>d:\myproject\opencv\belajar\pixeltracking\pixeltracking\main.cpp(61) : error C2065: 'matcher' : undeclared identifier 
1>d:\myproject\opencv\belajar\pixeltracking\pixeltracking\main.cpp(61) : error C2228: left of '.match' must have class/struct/union 
1>  type is ''unknown-type'' 
1>Build log was saved at "file://d:\myproject\OPENCV\belajar\pixelTracking\pixelTracking\Debug\BuildLog.htm" 
1>pixelTracking - 5 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Mon code:

#include <iostream> 
#include <vector> 
#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/nonfree/features2d.hpp> 
#include <opencv2/features2d/features2d.hpp> 

int main() 
{ 
     // Read input images 
     cv::Mat image1= cv::imread("../gambar1.jpg",0); 
     cv::Mat image2= cv::imread("../gambar2.jpg",0); 
     if (!image1.data || !image2.data) 
       return 0; 

    // Display the images 
     cv::namedWindow("Right Image"); 
     cv::imshow("Right Image",image1); 
     cv::namedWindow("Left Image"); 
     cv::imshow("Left Image",image2); 

     // vector of keypoints 
     std::vector<cv::KeyPoint> keypoints1; 
     std::vector<cv::KeyPoint> keypoints2; 

     // Construction of the SURF feature detector 
     cv::SurfFeatureDetector surf(3000); 

     // Detection of the SURF features 
     surf.detect(image1,keypoints1); 
     surf.detect(image2,keypoints2); 

     std::cout << "Number of SURF points (1): " << keypoints1.size() << std::endl; 
     std::cout << "Number of SURF points (2): " << keypoints2.size() << std::endl; 

     // Draw the kepoints 
     cv::Mat imageKP; 
     cv::drawKeypoints(image1,keypoints1,imageKP,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 
     cv::namedWindow("Right SURF Features"); 
     cv::imshow("Right SURF Features",imageKP); 
     cv::drawKeypoints(image2,keypoints2,imageKP,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 
     cv::namedWindow("Left SURF Features"); 
     cv::imshow("Left SURF Features",imageKP); 

     // Construction of the SURF descriptor extractor 
     cv::SurfDescriptorExtractor surfDesc; 

     // Extraction of the SURF descriptors 
     cv::Mat descriptors1, descriptors2; 
     surfDesc.compute(image1,keypoints1,descriptors1); 
     surfDesc.compute(image2,keypoints2,descriptors2); 

     std::cout << "descriptor matrix size: " << descriptors1.rows << " by " << descriptors1.cols << std::endl; 

     // Construction of the matcher 
     BruteForceMatcher<cv::L2<float>> matcher; 
     // Match the two image descriptors 
     std::vector<cv::DMatch> matches; 
     matcher.match(descriptors1,descriptors2, matches); 

     std::cout << "Number of matched points: " << matches.size() << std::endl; 

     std::nth_element(matches.begin(), // initial position 
          matches.begin()+24, // position of the sorted element 
             matches.end());  // end position 
     // remove all elements after the 25th 
     matches.erase(matches.begin()+25, matches.end()); 

     cv::Mat imageMatches; 
     cv::drawMatches(image1,keypoints1, // 1st image and its keypoints 
          image2,keypoints2, // 2nd image and its keypoints 
             matches,      // the matches 
             imageMatches,   // the image produced 
             cv::Scalar(255,255,255)); // color of the lines 
     cv::namedWindow("Matches"); 
     cv::imshow("Matches",imageMatches); 

     cv::waitKey(); 
     return 0; 

     int size=7; 
     cv::Mat imaf1; 
     image1.convertTo(imaf1,CV_32F); 

     cv::Mat imaf2; 
     image2.convertTo(imaf2,CV_32F); 

     cv::waitKey(); 
     return 0; 
} 

Répondre

7

En opencv 2.4 BruteForceMatcher n'est plus appelé comme ça. Vous pouvez inclure legacy.hpp pour utiliser les éléments des versions précédentes d'openCV. BruteForceMatcher est maintenant BFMatcher

Voir documentation.

6
#include <opencv2/legacy/legacy.hpp> 

Utilisez cette ligne. Cela fonctionnera comme avant.

1

vous pouvez ajouter un code de ligne:

#include<opencv2/legacy/legacy.hpp> 

profiter de votre OpenCV.

Questions connexes