OpenCV写入XML错误——节点重复

OpenCV writing to XML incorrectly-- nodes repeating

本文关键字:节点 错误 写入 XML OpenCV      更新时间:2023-10-16

我正在写OpenCV中的XML文件,我遇到了节点被错误写入的问题。我的代码:

FileStorage fs(s.outputFileName, FileStorage::WRITE);  
fs << "camera_matrix" << cameraMatrix;          
fs << "distCoeffs" << distCoeffs;       
fs << "image_width" << imageSize.width;    
fs << "image_height" << imageSize.height;
fs.release();

cameraMatrixdistCoeffs都是Mat对象。

我的XML输出文件如下:

<?xml version="1.0"?>
<opencv_storage>
<camera_matrix type_id="opencv-matrix">
   <rows>3</rows>
   <cols>3</cols>
   <dt>d</dt>
   <data>
    4.6490822605835838e+003 0. 1.4075000000000000e+003 0.
    4.6490822605835838e+003 9.3950000000000000e+002 0. 0. 1  </data></camera_matrix>
<camera_matrix>distCoeffs</camera_matrix>
<camera_matrix type_id="opencv-matrix">
   <rows>5</rows>
   <cols>1</cols>
   <dt>d</dt>
   <data>
    -1.1104540491479253e-001 3.2257882031809664e+000 0. 0.
    -3.2884118325204533e+001</data></camera_matrix>
<image_width>2816</image_width>
<image_width>image_height</image_width>
<image_width>1880</image_width>
</opencv_storage>

由于某种原因,它没有将distCoeffs Mat对象存储为名称为<distCoeffs>的节点,而是将其存储为名称为<camera_matrix>的节点,并且将整数image_height存储为名称为<image_height>的节点,而不是存储为名称为<image_width>的节点。为什么会发生这种情况?我看了看OpenCV文档,但找不到我做错了什么。在Visual Studio 2013中使用OpenCV 3.0.0

编辑:我可以用这个测试代码重现错误:
#include "stdafx.h"
#include <opencv2/core.hpp>
#include <iostream>

using namespace cv;
using namespace std;
static void saveCameraParams(Mat c, Mat d);
int main(int argc, char** argv)
{
    Mat cameraMatrix = Mat(3, 3, CV_64F, cvScalar(0.));
    Mat distCoeffs = Mat(5, 1, CV_64F, cvScalar(0.));
    saveCameraParams(cameraMatrix, distCoeffs);
}
static void saveCameraParams(Mat cameraMatrix, Mat distCoeffs)
    {
        Size imageSize;
        imageSize.width = 3;
        imageSize.width = 4;
        FileStorage fs("test_out.xml", FileStorage::WRITE);
        fs << "camera_matrix" << cameraMatrix;
        fs << "distCoeffs" << distCoeffs;
        fs << "image_width" << imageSize.width;
        fs << "image_height" << imageSize.height;
        fs.release();
}

这是我使用的平台的问题。在我的解决方案中,其中一个项目的平台不正确。