Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编写向量<;Dmatch>;文件存储_C++_Opencv_Visual C++ - Fatal编程技术网

C++ 如何编写向量<;Dmatch>;文件存储

C++ 如何编写向量<;Dmatch>;文件存储,c++,opencv,visual-c++,C++,Opencv,Visual C++,我已经能够使用文件存储成功地将关键点(vector)、描述符(Mat)和其他东西写入yml文件。但是,在计算了一对图像之间的匹配之后,我无法将匹配写入文件 我假设这是因为DMatch似乎是一个具有distance、trainIdx等字段的结构,但有人有好的方法将其写入文件吗 或者我应该写一个距离向量,一个trainIdx向量等等 编辑以显示某些代码: std::vector<cv::DMatch> matches; for(int i=0;i<numims-1;i++){

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

我假设这是因为DMatch似乎是一个具有distance、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();
    }
}

您可以为文件存储重载
>
运算符

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

void操作符>>(常量cv::FileNode和node,
cv::TermCriteria和termCrit){
节点[“类型”]>>termCrit.type;
节点[“maxCount”]>>termCrit.maxCount;
节点[“epsilon”]>>termCrit.epsilon;
}

简历:FileStorage&Operator我今天会试试这个,等我成功后再投票,谢谢!
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;
}
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;
}