OpenCV的Brute Force Matcher在第二次迭代时崩溃

OpenCV's Brute Force Matcher crashes on second iteration

本文关键字:第二次 迭代 崩溃 Matcher Brute Force OpenCV      更新时间:2023-10-16

我正在进行一个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();来清除矢量,尽管矢量已被清除,但我在运行时仍然会崩溃。

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

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

在我的案例中,如果我使用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方法,我建议你使用我做过的其他匹配器算法,但是如果你喜欢,你可以对我做同样的事情(取决于匹配方法,使用一个或其他提取器),你会比较结果。