我似乎遇到的问题是,当我加载存储为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>
答案 0 :(得分:2)
在您的xml文件中,您保存了CvMat
(type_id="opencv-matrix"
),而不是IplImage
(type_id="opencv-image"
)。
因此,当您加载它时,您应该转换为CvMat*
,否则您将获得垃圾值。
例如,这将起作用:
CvFileStorage* fs = cvOpenFileStorage("path_to_xml", 0, CV_STORAGE_READ);
CvMat* img = (CvMat*)cvReadByName(fs, NULL, "depthImage", NULL);
cvReleaseFileStorage(&fs);