如何使用OpenCV将数据保存到图像中?

如何使用OpenCV将数据保存到图像中?,opencv,Opencv,我使用cvLoadImage将图像(原始图像)读取到CvMat中,并通过中间数据块将其数据指针指定给另一个CvMat,然后使用cvShowImage显示此CvMat,但在与原始图像大小相同的窗口中仅显示了原始图像的一小部分 char* filename = "image\\neuron.tif"; // an 8bits grayscale image IplImage* iplImage = cvLoadImage(filename); int width = iplImage->wi

我使用cvLoadImage将图像(原始图像)读取到CvMat中,并通过中间数据块将其数据指针指定给另一个CvMat,然后使用cvShowImage显示此CvMat,但在与原始图像大小相同的窗口中仅显示了原始图像的一小部分

char* filename = "image\\neuron.tif"; // an 8bits grayscale image
IplImage*  iplImage = cvLoadImage(filename);
int width = iplImage->width;
int height = iplImage->height;
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE);
cvShowImage("Original", iplImage);  // showed properly
cvWaitKey();

CvMat* header = cvCreateMatHeader(height, width, CV_8UC1);
CvMat* img_mat = cvGetMat(iplImage, header);


unsigned char* img_host = (unsigned char*)malloc(height * width * sizeof(unsigned char));// the intermediate data block, on which I need to apply a cuda operation
img_host = img_mat->data.ptr;
CvMat* blur_mat = cvCreateMat(height, width, CV_8UC1);
blur_mat->data.ptr = img_host;
cvNamedWindow("Blurred", CV_WINDOW_AUTOSIZE);
cvShowImage("Blurred", blur_mat);  // the problem described
cvWaitKey();

事实上,当我尝试“img\u host=img\u mat->data.ptr”时,问题就出现了,但我不知道是怎么回事。

您的问题是,您的输入图像实际上不是单通道灰度
8UC1
图像。您看到的是图像的前三分之一,其中每个BGR像素显示为3个灰度像素

要解决此问题,您可以按照@eyllanesc在注释中的建议,以灰度读取输入:
cvLoadImage(文件名,CV\u LOAD\u IMAGE\u grayscale)

或者,您需要将目标声明为
8UC3

在任何情况下,您的代码都非常混乱,这里至少有两个内存泄漏:

unsigned char* img_host = (unsigned char*)malloc(height * width * sizeof(unsigned char));// the intermediate data block, on which I need to apply a cuda operation
img_host = img_mat->data.ptr; // LEAKS malloced buffer data 

CvMat* blur_mat = cvCreateMat(height, width, CV_8UC1);
blur_mat->data.ptr = img_host; // LEAKS cvCreateMat() buffer data

<>我真的建议你使用更高级的C++ API,使用< Cave> CV::Mat < /C> > .< /P>将CVoLaDimaIE(文件名)改为CVoLaDimaIE(文件名,CVHLoad IMAGEY灰度);你使用过时的C api有什么特别的原因吗?@Miki我想对图像数据矩阵进行其他CUDA操作,所以我选择了C api。。。我真的很惭愧我贴了这么乱七八糟的代码