opencv DMatch imgIdx大于训练集的大小

时间:2014-02-17 19:27:31

标签: c++ opencv flann

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

如果我使用k = 3进行knnMatch,我会获得与imgIdx匹配的> 1000,这就是这个问题的原因(我尝试了k = 2并且遇到了同样的问题),我找不到任何关于此事的信息,有人可以帮我一把吗?。

更新:我添加了两次模式描述符,这就是为什么我的imgIdx超过1000,现在我遇到的问题是k == 2我得到一个匹配距离0和一个带&gt; 0,距离比为0,我的理论是我得到距离0因为模式匹配与场景完全相同,但是当我没有训练时这样做我没有得到距离0,任何想法为什么?< / p>

I have another question that's related to this one in here.

已更新

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

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多行)

0 个答案:

没有答案