【问题标题】:OpenCV: 'BruteForceMatcher' : undeclared identifierOpenCV:'BruteForceMatcher':未声明的标识符
【发布时间】:2013-02-03 17:42:34
【问题描述】:

我正在使用 OpenCV 2.4.3,我正在尝试调用 BruteForceMatcher,但我收到了这个错误:

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

我的代码:

#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;
}

【问题讨论】:

    标签: opencv


    【解决方案1】:

    在 opencv 2.4 中,BruteForceMatcher 不再那样调用了。您可以包含 legacy.hpp 以使用以前的 openCV 版本。 BruteForceMatcher 现在是 BFMatcher

    documentation

    【讨论】:

      【解决方案2】:
      #include <opencv2/legacy/legacy.hpp>
      

      使用这条线。它会像以前一样工作。

      【讨论】:

        【解决方案3】:

        你可以添加一行代码:

        #include<opencv2/legacy/legacy.hpp>
        

        享受你的 opencv。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-30
          • 1970-01-01
          • 2021-06-07
          • 2016-04-09
          • 2020-12-09
          • 2016-04-22
          相关资源
          最近更新 更多