OpenCV 1.1,IplImage无法正确显示图像

时间:2013-12-10 19:51:17

标签: c opencv

使用OpenCV时遇到了一个奇怪的问题。假设我有一个CHAR类型的内存块,它是一个尺寸为X * sizeY的8位深度图像的缓冲区。指向图像的指针称为pcMask,因此我使用以下代码将缓冲区保存到名为mask.dat的文件中:

char fpath[256] = ".\mask.dat";
FILE *pFile = 0;
pFile = fopen(fpath,"wb");
if (pFile) {
    fwrite(pcMask, sizeof(char), sizeX * sizeY, pFile);
    fclose(pFile);
    pFile = 0;
}

保存mask.dat后,我调用了Opencv API来显示如下图像:

IplImage *mask = cvCreateImageHeader(cvSize(sizeY,sizeX), IPL_DEPTH_8U, 1);
mask->imageData = pcMask;
// display image 
cvNamedWindow("test", CV_WINDOW_AUTOSIZE);
cvShowImage("test", mask);
cvWaitKey(0);
cvDestroyWindow("test");
cvReleaseImageHeader(&mask);

我实际上知道图像应该是什么样的。为了验证这一点,我编写了一个python脚本来加载“mask.dat”文件,并使用matplotlib对其进行了展示,它看起来很像this,但是,使用OpenCV显示的图像有很多不同,如this (不是彩色地图)。如您所见,两个图中的省略号完全不同。当他们使用来自同一个内存块的数据时,它们是否应该相同?

非常感谢!

更新 我现在认为OpenCV1.1中存在一个错误,'我将IplImage更改为CvMat,现在一切都很好

CvMat *mask = cvCreateMatHeader(sizeY,sizeX, CV_8UC1);
mask->data.ptr = pcMask;
// display image 
cvNamedWindow("test", CV_WINDOW_AUTOSIZE);
cvShowImage("test", mask);
cvWaitKey(0);
cvDestroyWindow("test");
cvReleaseImageHeader(&mask);

OpenCV2.X可能没有这样的问题,但我只能使用1.1来保持与整个程序的一致性。无论如何,我现在使用CvMat作为我的解决方案。

3 个答案:

答案 0 :(得分:3)

来自documentation

  

CvSize cvSize(int width,int height)

因此

IplImage *mask = cvCreateImageHeader(cvSize(sizeY, sizeX), IPL_DEPTH_8U, 1);

应该是

IplImage *mask = cvCreateImageHeader(cvSize(sizeX, sizeY), IPL_DEPTH_8U, 1);

修改

您不应直接设置mask->imageData,而是使用cvSetData()

cvSetData(mask, pcMask, sizeY); 

答案 1 :(得分:1)

角度拉伸使我认为这是图像格式/音高问题。根据具体情况,图像占用的内存量可能不等于sizeX * sizeY。确保你没有弄乱图像的保存(为什么不使用OpenCV的图像保存操作?),并确保你所处理的图像的数据格式正确。

答案 2 :(得分:0)

谢谢大家的帮助,但现在我相信这是OpenCV1.1的一个错误,请在帖子中查看我的新编辑,我使用的是CvMat,一切正常