如何将向量<Dmatch> 写入 FileStorage

Posted

技术标签:

【中文标题】如何将向量<Dmatch> 写入 FileStorage【英文标题】:How to write vector<Dmatch> to FileStorage 【发布时间】:2014-06-12 20:52:52 【问题描述】:

我已经能够使用 FileStorage 成功地将关键点(向量)、描述符(Mat)和其他内容写入 yml 文件。但是,在计算出一对图像之间的匹配后,我无法将匹配写入文件。

我假设这是因为 DMatch 似乎是一个具有距离、trainIdx 等字段的结构,但有没有人有一种将其写入文件的好方法?

或者我应该只写一个距离向量、一个 trainIdx 向量等?

编辑显示一些代码:

std::vector<cv::DMatch> matches;
for(int i=0;i<numims-1;i++)    
    for(int j=i+1;j<min(i+10,numims);j++)
        matches = MatchImagePair(i,j);
        //write the matches
        std::string matchfile = matchpath + "matchesij.yml";
        cv::FileStorage fs(matchfile, cv::FileStorage::WRITE);
        write(fs, "matches", matches);
        fs.release();
    

matchesij 应该包含 i 和 j 的数字,但为简洁起见,我进行了编辑。

另外,MatchImagePair 看起来像:

std::vector<cv::DMatch> Matches::MatchImagePair(int idx1, int idx2)
    //matcher type
    cv::BFMatcher matcher(cv::NORM_L2);

    //given descrs1 and descrs2, match the 2 descriptors
    matcher.knnMatch(descrs1, descrs2, matches12, 2);
    matcher.knnMatch(descrs2, descrs1, matches21, 2);

    //various tests, returns vector<DMatch> given keypts1, keypts2 (for RANSAC)
    matches = DoVariousTests(matches12, matches21, keypts1, keypts2);

    return matches;

【问题讨论】:

【参考方案1】:

您可以重载 &gt;&gt; 运算符以进行文件存储。

来自here: 的 cv::TermCriteria 的工作示例代码:

void operator>>(const cv::FileNode &node,
        cv::TermCriteria &termCrit) 
    node["type"] >> termCrit.type;
    node["maxCount"] >> termCrit.maxCount;
    node["epsilon"] >> termCrit.epsilon;


cv::FileStorage &operator<<(cv::FileStorage &fs,
        const cv::TermCriteria &termCrit) 
    fs << "" << "type" << termCrit.type << "maxCount"
            << termCrit.maxCount << "epsilon" << termCrit.epsilon
            << "";
    return fs;

【讨论】:

我今天会尝试一下,一旦我开始工作就投票,谢谢!

以上是关于如何将向量<Dmatch> 写入 FileStorage的主要内容,如果未能解决你的问题,请参考以下文章

如何将枚举类型向量的向量保存在

如何有效地将结构向量写入文件?

如何使用 C++ 中的函数将向量写入文件?

将标量的多维向量(张量)写入 C++ 文件

将包含另一个向量的结构向量写入二进制文件

在 C++ 中通过迭代器将向量写入二进制文件的正确方法