使用OpenCV进行复制时指定指针

Specifying the pointer when copying with OpenCV

本文关键字:定指 指针 复制 OpenCV 使用      更新时间:2023-10-16

我有一个图像内存,我将其储存并保存在一个指针中,以防丢失其地址。

我现在想通过以下函数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

知道怎么处理吗?

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

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

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

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

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

确保在处理完内存后将其删除,否则将导致内存泄漏。

delete[] ImgMem;

一个更好的替代方案是使用CCD_ 2;

std::vector<char> ImgMem(bufferSize, 0);
memcpy(img->imageData, &ImgMem[0], ImgMem.size());

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

第二个问题是,您试图将超出其容量的内存复制到图像缓冲区中。

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

img->imageData只能容纳307200个字节(假设8bpp(时,这将复制839056个字节。

[编辑:这个答案不考虑IplImage结构提供的属性。这包括大小和对齐,这在这里对memcpy非常重要。有关IplImage成员的更多信息,请参阅此处]

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

int totalSize = 640*480*2;
char* ImgMemory = new char[totalSize];
memcpy(img->imageData, ImgMemory, (totalSize ));