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

4
我正在进行一个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);
}

这个问题是由于内存异常错误导致的,我认为匹配函数尝试使用的三个容器之一,主要是mMatches,它是一个std::vector<cv::KeyPoint>,可能存在问题。在再次使用向量之前,我尝试通过调用mMatches.clear();来清除向量,虽然向量被清除了,但仍然会在运行时崩溃。

有没有人对我的崩溃原因有任何见解或建议?我已经试了很长时间了,这让我非常沮丧。


1
你可以展示一下错误日志吗? - McBodik
1个回答

1
我尝试和你做一样的事情,我的程序有很多探测器、提取器和匹配算法,和你一样也遇到了同样的问题。在我的情况下,如果我使用Knn-Matcher或FLANN-Matcher,我决定使用ORB探测器和SIFT提取器方法,它可以正常工作,但是当我用这种方法实现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方法,我建议您使用其他匹配算法,例如我所使用的算法,但是如果您愿意,您也可以和我一样做(根据匹配方法使用其中一个提取器),并且您将比较结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接