为什么从OpenCV中的XML文件加载会破坏我的数据?

时间:2015-08-14 20:24:35

标签: c xml image opencv

我似乎遇到的问题是,当我加载存储为xml文件的IplImga时,与IplImage对象关联的一些数据成员已损坏。例如,d1->宽度应为1024,d1->高度应为768.相反,似乎无论我加载这些图像的方式如何,我都会得到垃圾值,如-72538984,-1272467456和0。还测试了具有相同垃圾值的d1->深度和d1-> nChannels。我正在使用OpenCV C API xml持久性来写入和读取磁盘上的这些图像。我已阅读并重新阅读相关文档以确保我正确使用API​​,但似乎无论我如何阅读图像,仍然存在某种形式的数据丢失或损坏。

我使用xml持久性的原因是当我在获取图像的程序中使用函数cvSaveImage时,该函数会将数据从16位格式截断为8位格式。我的理解是使用xml持久性将避免这个问题。此外,我试图避免为此项目使用C ++ API,因为它是已使用C API编写的先前工作的扩展。根据我在下面列出的代码,我可以确定我正确地做了这个部分,问题出在图像创建,存储,retreival和使用过程中的其他地方吗?或者我在这里做的事情是否明显错误?非常感谢你的帮助。

方法1

CvFileStorage * fs1 = cvOpenFileStorage("/home/bot/luca-HSV/HSVD/GRID1/SQUARE4/DEPTH180.xml", 0, CV_STORAGE_READ); 
CvFileStorage * fs2 = cvOpenFileStorage("/home/bot/luca-HSV/HSVD/GRID1/SQUARE4/DEPTH144.xml", 0, CV_STORAGE_READ);

d1 = (IplImage*) cvReadByName(fs1, 0, "depthImage");
d2 = (IplImage*) cvReadByName(fs2, 0, "depthImage");

cvReleaseFileStorage(&fs1);
cvReleaseFileStorage(&fs2);

方法2

CvFileStorage * fs1 = cvOpenFileStorage("/home/bot/luca-HSV/HSVD/GRID1/SQUARE4/DEPTH180.xml", 0, CV_STORAGE_READ); 
CvFileStorage * fs2 = cvOpenFileStorage("/home/bot/luca-HSV/HSVD/GRID1/SQUARE4/DEPTH144.xml", 0, CV_STORAGE_READ);

CvFileNode * node1 = cvGetFileNodeByName(fs1, 0, "depthImage");
CvFileNode * node2 = cvGetFileNodeByName(fs2, 0, "depthImage");

d1 = (IplImage*) cvRead(fs1, node1);
d2 = (IplImage*) cvRead(fs2, node2);

cvReleaseFileStorage(&fs1);
cvReleaseFileStorage(&fs2);

方法3

d1 = (IplImage*) cvLoad("/home/bot/luca-HSV/HSVD/GRID1/SQUARE4/DEPTH180.xml"/*, NULL, NULL, NULL*/);
d2 = (IplImage*) cvLoad("/home/bot/luca-HSV/HSVD/GRID1/SQUARE4/DEPTH144.xml"/*, NULL, NULL, NULL*/);
// I have tried both using and not using these three NULL parameters. It
// does not seem to make a lot of difference

在所有这些方法之前,我包括以下几行:

IplImage * d1 = cvCreateImage(cvSize(IMG_WIDTH, IMG_HEIGHT), IPL_DEPTH_64F, 3);
IplImage * d2 = cvCreateImage(cvSize(IMG_WIDTH, IMG_HEIGHT), IPL_DEPTH_64F, 3);

示例XML文件标头

<?xml version="1.0"?>
<opencv_storage>
<depthImage type_id="opencv-matrix">
  <rows>768</rows>
  <cols>1024</cols>
  <dt>"3d"</dt>
  <data> 

1 个答案:

答案 0 :(得分:2)

在您的xml文件中,您保存了CvMattype_id="opencv-matrix"),而不是IplImagetype_id="opencv-image")。

因此,当您加载它时,您应该转换为CvMat*,否则您将获得垃圾值。

例如,这将起作用:

CvFileStorage* fs = cvOpenFileStorage("path_to_xml", 0, CV_STORAGE_READ);
CvMat* img = (CvMat*)cvReadByName(fs, NULL, "depthImage", NULL);
cvReleaseFileStorage(&fs);