1

我有 1000 个模式(我希望在特定场景中查找的图像),我当前的算法获取每个模式的描述符,将它们存储在一个向量中并使用该向量来训练 FlannBasedMatcher。

如果我用 k = 3 进行 knnMatch 我得到匹配的 imgIdx > 1000,这就是这个问题的原因(我试过 k = 2 并且有同样的问题),我找不到任何关于这个的东西,有人可以给我吗有这个吗?

更新:我添加了两倍的模式描述符,这就是为什么我得到高于 1000 的 imgIdx,现在我遇到的问题是,k == 2我得到一个距离为 0 的匹配和一个 > 0 的匹配,距离比为 0,我的理论是我得到距离 0,因为模式匹配与场景完全相同,但是当我在没有训练的情况下这样做时,我没有得到距离 0,知道为什么吗?

我在这里有另一个与此相关的问题。

更新

这基本上是我正在运行的代码

const Ptr<flann::IndexParams>& indexParams=new flann::KDTreeIndexParams(4);
const Ptr<flann::SearchParams>& searchParams=new flann::SearchParams(64);
cv::Ptr<cv::DescriptorMatcher>   matcher = new cv::FlannBasedMatcher(indexParams,  searchParams);
matcher->clear();
std::vector<Anakin::RichImg*>* patterns = loadPatterns();
std::vector<cv::Mat> pdescriptors(patterns->size());
for (int i = 0; i < patterns->size();i++){
    RichImg* p = patterns->at(i);
    pdescriptors.at(i) = p->getDescriptors();
}
this->detector->add(pdescriptors);
this->detector->train();
std::vector< std::vector<cv::DMatch> > m_knnMatches;
const cv::Mat& queryDescriptors = getSceneDescriptors();
if (queryDescriptors.empty()) return;
if(queryDescriptors.type()!=CV_32F) {
    queryDescriptors.convertTo(queryDescriptors, CV_32F);
}
matcher->knnMatch(queryDescriptors, m_knnMatches, 3);
for (size_t i=0; i<m_knnMatches.size(); i++) {
    const cv::DMatch& match_0 = m_knnMatches[i][0];
    const cv::DMatch& match_1 = m_knnMatches[i][1];
    const cv::DMatch& match_2 = m_knnMatches[i][2];
    std::cout << "match_0 : imgIdx(" << match_0.imgIdx << ") distance(" << match_0.distance << ")" << std::endl;
    std::cout << "match_1 : imgIdx(" << match_1.imgIdx << ") distance(" << match_1.distance << ")" << std::endl;
    std::cout << "match_2 : imgIdx(" << match_2.imgIdx << ") distance(" << match_2.distance << ")" << std::endl;

}

结果是:

match_0 : imgIdx(403) distance(0)
match_1 : imgIdx(1403) distance(0)
match_2 : imgIdx(1145) distance(0.224424)
match_0 : imgIdx(403) distance(0)
match_1 : imgIdx(1403) distance(0)
match_2 : imgIdx(1098) distance(0.270127)
match_0 : imgIdx(403) distance(0)
match_1 : imgIdx(1403) distance(0)
match_2 : imgIdx(1985) distance(0.227835)

注意:我刚刚发布了我的代码的较轻版本(理解我在做什么所需的代码),结果只是我得到的一部分(原始结果有 800 多行)

4

0 回答 0