Ask Your Question
0

how to call bruteforcematcher

asked 2013-02-03 11:41:32 -0600

this post is marked as community wiki

This post is a wiki. Anyone with karma >50 is welcome to improve it.

BruteForceMatcher

hai im using opencv 2.4.3 , and i'm try to call BruteForceMatcher , but i have error

this is 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;

}

and this is the 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 ... (more)

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
3

answered 2013-02-03 12:55:50 -0600

Guanta gravatar image

BruteForceMatcher is deprecated. However you can still use it by including legacy.hpp. Alternatively you can use the newer way by calling:


BFMatcher matcher(cv::NORM_L2) (click for Docu)


or use:


matcher = cv::DescriptorMatcher::create("BruteForce")


(Note that this actually gives you a cv::Ptr<cv::descriptormatcher> back.). Also note that afaik it is currently not possible to use its own distance-measures, so you are restricted by NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2. But in the most cases they should be sufficient.

edit flag offensive delete link more

Question Tools

Stats

Asked: 2013-02-03 11:41:32 -0600

Seen: 2,488 times

Last updated: Feb 03 '13