1

我有一个图像内存,我储存并保存在一个指针中,以免丢失它的地址。

我现在想通过以下函数memcpy将它分配给 IplImage (我已经测试过):

IplImage* img=cvCreateImage(cvSize(640, 480), IPL_DEPTH_16U, 1);
VOID* ImgMem;
memcpy(img->imageData, ImgMemory, (640*480));

它真的不起作用。它表示Unhandled exception at 0x001b96dd in ex4.exe: 0xC0000005: Access violation reading location 0x00000044

知道如何处理吗?

4

3 回答 3

0

您的代码中有两个问题。第一个问题是您没有初始化“ImgMem”。

VOID* ImgMem;
//    ^^^^^^ Points to whatever

如果在将数据复制到图像缓冲区之前需要使用缓冲区,则需要为其分配内存。

int bufferSize = 640*480*2;
char* ImgMem = new char[bufferSize];

确保在完成后删除内存,否则最终会泄漏内存。

delete[] ImgMem;

更好的选择是使用std::vector;

std::vector<char> ImgMem(bufferSize, 0);

memcpy(img->imageData, &ImgMem[0], ImgMem.size());

通过这种方式分配、管理和释放内存std::vector,您不必每次都这样做。

第二个问题是您试图将更多的内存复制到图像缓冲区中,而不是它可以容纳的。

memcpy(img->imageData, ImgMemory, (916*916));

img->imageData当只能保存 307,200 字节(假设8bpp)时,这将复制 839,056 字节。

[编辑:这个答案没有考虑IplImage结构提供的属性。这包括尺寸和对齐方式,这对于 memcpy. 有关成员的更多信息,IplImage请参见此处]

于 2013-04-16T15:28:20.260 回答
0

像素类型是无符号短 IPL_DEPTH_16U,它是 2 个字节,因此您需要相应地计算总字节大小:

int totalSize = 640*480*2;
char* ImgMemory = new char[totalSize];
memcpy(img->imageData, ImgMemory, (totalSize ));
于 2013-04-16T15:39:07.313 回答
0

您的图像是 640x480,但您复制了 916x916 像素。

于 2013-04-16T15:22:21.273 回答