Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV: 'BruteForceMatcher' : undeclared identifier

Tags:

opencv

I'm using OpenCV 2.4.3 and I'm trying to call BruteForceMatcher, but I'm getting this error:

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 ==========

My 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;
}
like image 702
Roy Avatar asked Dec 08 '22 17:12

Roy


2 Answers

In opencv 2.4 BruteForceMatcher is not called like that anymore. You can include legacy.hpp to use things of previous openCV versions. BruteForceMatcher is now BFMatcher

See documentation.

like image 178
Ander Biguri Avatar answered Jun 03 '23 08:06

Ander Biguri


#include <opencv2/legacy/legacy.hpp>

Use this line. It will work as before.

like image 38
Armin Mustafa Avatar answered Jun 03 '23 09:06

Armin Mustafa