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

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

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

4

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

于 2015-05-28T08:12:20.810 回答