【发布时间】:2015-11-08 04:26:29
【问题描述】:
我似乎遇到的问题是,当我加载存储为 xml 文件的 IplImgaes 时,与 IplImage 对象关联的一些数据成员已损坏。例如,d1->width 应该是 1024,d1->height 应该是 768。相反,似乎无论我加载这些图像的方式如何,我都会得到像 -72538984、-1272467456 和 0 这样的垃圾值。我也有测试了包含类似垃圾值的 d1->depth 和 d1->nChannels。我正在使用 OpenCV C API xml 持久性在磁盘中写入和读取这些图像。我已阅读并重新阅读相关文档以确保我正确使用 API,但似乎无论我如何阅读图像,仍然存在某种形式的数据丢失或损坏。
我使用 xml 持久性的原因是当我在获取图像的程序中使用函数 cvSaveImage 时,该函数会将数据从 16 位格式截断为 8 位格式。我的理解是使用 xml 持久化可以避免这个问题。另外,我试图避免在这个项目中使用 C++ API,因为它是之前已经使用 C API 编写的工作的扩展。根据我在下面包含的代码,我能否确定我正确地执行了这部分,并且问题出在图像创建、存储、检索和使用过程中的其他地方?还是我在这里做的事情显然是错误的?非常感谢您的帮助。
方法 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>
【问题讨论】:
-
我相信 C++ API 的 imwrite 函数只允许 16 位无符号,我需要能够保持负值。
-
有人能解释一下为什么我的问题被否决了吗?我从我能想到的问题的各个角度提供了详尽的细节,而不包括一堆不必要的代码。问题的第一行也清楚地说明了核心问题,下面提供了相关细节。这个问题怎么不清楚或没有很好的研究?
-
我同意,这个问题很好地提出:+1。看看答案,看看它是否适合你。