OpenCV的暴力匹配器在第二次迭代时崩溃

时间:2013-07-16 09:38:33

标签: c++ opencv vector crash

我正在开发一个OpenCV项目,我试图使用ORB特征检测器,BRISK特征描述符和Brute Force Matcher的组合来通过我的网络摄像头提供的视频序列来检测,匹配和跟踪功能。

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

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

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

1 个答案:

答案 0 :(得分:0)

我试着和你做同样的事情,我有一个带有很多探测器,提取器和匹配算法的程序,我遇到了和你一样的问题。

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

我的代码是这样的:

 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]);
             }
         }
     }

如果你想使用extractor-SIFT方法,我建议你使用其他matcher算法,但是如果你愿意,你可以对我这样做(取决于匹配方法使用一个或其他提取器),你会比较结果。