【问题标题】:OpenCV's Brute Force Matcher crashes on second iterationOpenCV 的蛮力匹配器在第二次迭代时崩溃
【发布时间】:2013-07-14 10:16:18
【问题描述】:

我正在开发一个 OpenCV 项目,我正在尝试结合使用 ORB 特征检测器、BRISK 特征描述符和蛮力匹配器,通过我的网络摄像头提供的视频序列检测、匹配和跟踪特征。

目前,单张图片一切正常。我可以在屏幕上突出显示一个区域,将其提取为 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);
}

这与我得到的内存异常错误相结合,使我相信 match 函数试图使用的三个容器之一存在问题,主要是 mMatches 这是一个 std::vector<cv::KeyPoint> 我试图清除在再次使用之前通过调用mMatches.clear(); 来调用向量,尽管向量被清除,但我仍然在运行时崩溃。

是否有人对可能导致我崩溃的原因有任何见解或建议?我已经搞砸了一段时间了,它开始变得非常令人沮丧。

【问题讨论】:

  • 也许你显示错误日志?

标签: c++ opencv vector crash


【解决方案1】:

我试图对你做同样的事情,我有一个包含很多检测器、提取器和匹配算法的程序,我遇到了和你一样的问题。

在我的情况下,我决定使用 ORB 检测器和 SIFT 提取器方法,如果我要使用 Knn-Matcher 或 FLANN-Matcher 并且它工作正常,但是当我使用这种方法实现 BFMatcher 时,我无法做到。最后,我决定将 ORB 提取器与 BFMatcher 一起使用,它可以工作。

我的代码是这样的:

 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 方法,我建议您使用其他匹配器算法,例如我所做的,但是如果您愿意,您可以对我做同样的事情(取决于匹配方法,使用一个或其他提取器),您将比较结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多