【问题标题】:openCv, match features across three images?openCv,匹配三个图像的特征?
【发布时间】:2017-06-29 21:38:15
【问题描述】:

我有立体摄像头设置。我正在使用 openCv 在图像中查找特征。我需要做的是匹配上一个和当前(左)帧中的特征,然后在当前(右)帧中找到与 那些 特征匹配的特征,这样我就可以对它们进行三角测量。我需要最终得到三组特征描述符和关键帧,匹配三张图像。

到目前为止我的代码是:

    //storage
        cv::Mat descCurrent;
        cv::Mat descCurrentR;
        cv::Mat descPrevious;
        std::vector<cv::KeyPoint> keyPntsCurrent;
        std::vector<cv::KeyPoint> keyPntsCurrentMatch;
        std::vector<cv::KeyPoint> keyPntsCurrentR;
        std::vector<cv::KeyPoint> keyPntsPrevious;

    //On the FIRST frame

        keyPntsPrevious = kaze->DetectKeypoints(imLeft, descPrevious);


    // on the CURRENT frame

    //detect the keypoints on Left and Right Current images
        kaze->DetectKeypointsL(imLeft, descCurrent, keyPntsCurrent);
        kaze->DetectKeypointsR(imRight, descCurrentR, keyPntsCurrentR);

    //match to previous frame
        std::vector<cv::DMatch> match = pntMatch->matchPoints(descPrevious, descCurrent);

    //get current - previous descriptors to use for left - right matching
        if (match.size() > 1)
        {
            for (int m = 0; m < match.size(); m++)
        {
           // feature index OF PREVIOUS FRAME DESC
            float* descVector = descCurrent.ptr<float>(match[m].trainIdx);
            descTmp.push_back(descVector);
            //feature index OF CURRENT FRAME KEY            
            keyPntsCurrentMatch.push_back(keyPntsCurrent[match[m].trainIdx]); 

        }

        }
            //  memcpy(descCurrentMatched.data, descTmp.data(), descTmp.size()*sizeof(float));
                descTmp.clear();

                //match to RIGHT frame
                std::vector<cv::DMatch> matchR = pntMatch->matchPoints(descCurrentMatched, descCurrentR);


//triangulate
PointsTo3d(keyPntsCurrentMatch, keyPntsCurrentR, matchR);

    //at end of loop
        descPrevious = descCurrentMatched;
        keyPntsPrevious = keyPntsCurrent;
        keyPntsCurrentMatch.clear();

这一行: memcpy(descCurrentMatched.data, descTmp.data(), descTmp.size()*sizeof(float));

当前使应用程序崩溃,没有错误。所以我的问题是:

这是匹配动态视频流中三个图像的特征的有效方法吗?

如果是这样,为什么memcpy 会崩溃?

谢谢。

【问题讨论】:

    标签: c++ opencv computer-vision


    【解决方案1】:

    啊哈!发布后几分钟,我想出了一个解决方法。可以检测所有关键点,然后将匹配的先前当前关键点传递给此函数:

    cv::Mat features;
    cv::Ptr<cv::DescriptorExtractor> extractor = cv::AKAZE::create();
    extractor->compute(imLeft, keyPntsCurrentMatch, features); 
    

    这将从您传入的关键点输出新的描述符。

    【讨论】:

      猜你喜欢
      • 2022-12-21
      • 2014-04-11
      • 2018-07-03
      • 2018-09-12
      • 2018-04-27
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      相关资源
      最近更新 更多