使用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作为我的解决方案。
答案 0 :(得分:3)
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,一切正常