OpenCv:特征匹配,将描述符与knn过滤的关键点匹配?

OpenCv:特征匹配,将描述符与knn过滤的关键点匹配?,opencv,computer-vision,feature-extraction,feature-detection,Opencv,Computer Vision,Feature Extraction,Feature Detection,我有下面的代码,我用它来检测和匹配两幅图像中检测到的关键点。 我检测关键点,并将描述符存储在以下位置: cv::Mat descCurrent; cv::Mat descCurrentR; 然后将它们传递给此函数: std::vector<DMatch> PointMatching::matchPointsOG2(cv::Mat descriptors1Cpu, cv::Mat descriptors2Cpu) { descriptors1GPU.upload(descr

我有下面的代码,我用它来检测和匹配两幅图像中检测到的关键点。 我检测关键点,并将描述符存储在以下位置:

cv::Mat descCurrent;
cv::Mat descCurrentR;
然后将它们传递给此函数:

std::vector<DMatch> PointMatching::matchPointsOG2(cv::Mat descriptors1Cpu, cv::Mat descriptors2Cpu)
{

    descriptors1GPU.upload(descriptors1Cpu);
    descriptors2GPU.upload(descriptors2Cpu);


    // matching descriptors
    Ptr<cv::cuda::DescriptorMatcher> matcher = cv::cuda::DescriptorMatcher::createBFMatcher(NORM_HAMMING);
    vector<cv::DMatch> matches;
    vector< vector< DMatch> > knn_matches;

    matcher->knnMatch(descriptors1GPU, descriptors2GPU, knn_matches, 2);

    //Filter the matches using the ratio test
    for (std::vector<std::vector<cv::DMatch> >::const_iterator it = knn_matches.begin(); it != knn_matches.end(); ++it) {
        if (it->size() > 1 && (*it)[0].distance / (*it)[1].distance < 0.8) {
            matches.push_back((*it)[0]);
        }
    }


    return matches;

}
std::vector PointMatching::matchPointsOG2(cv::Mat描述符1CPU,cv::Mat描述符2CPU)
{
描述符1GPU.upload(描述符1CPU);
描述符2GPU.upload(描述符2CPU);
//匹配描述符
Ptr matcher=cv::cuda::DescriptorMatcher::createBFMatcher(NORM_HAMMING);
向量匹配;
向量>knn_匹配;
匹配器->knnMatch(描述符1GPU、描述符2GPU、knn_匹配,2);
//使用比率测试筛选匹配项
对于(std::vector::const_迭代器it=knn_matches.begin();it!=knn_matches.end();+it){
如果(it->size()>1&(*it)[0]。距离/(*it)[1]。距离<0.8){
匹配。推回((*it)[0]);
}
}
返回比赛;
}
然后,一旦我有了匹配,我会这样做:

std::vector<cv::KeyPoint> keyPntsGoodL;
    std::vector<cv::KeyPoint> keyPntsGoodR;
for (size_t i = 0; i < matchR.size(); i++)
            {
                keyPntsGoodL.push_back(keyPntsCurrent[matchR[i].queryIdx]);
                keyPntsGoodR.push_back(keyPntsCurrentR[matchR[i].trainIdx]);

            }
std::vector keyPntsGoodL;
std::向量键pntsgoodr;
对于(size_t i=0;i
这一切都是预期的工作,我已经匹配和过滤的关键点。 我的问题是:

如何以相同的方式过滤描述符? 如果我现在只想得到与
keyPntsGoodL
匹配的初始描述符(descCurrent)的子集,我该怎么做


谢谢。

匹配只针对描述符,而不是关键点。。。所以你应该已经有了“好”的描述。嗨,谢谢你的回复。我有匹配最初发现的关键点的描述符。我需要的是对应于从匹配函数返回的过滤关键点的子集。实际上,我在Python中使用它,但想法应该是一样的:使用某个匹配函数在描述符上创建的
匹配对象已经包含匹配的关键点:这是否有帮助?我做不了太多。@anti你有没有想过?