使用OpenCV进行复制时指定指针
Specifying the pointer when copying with OpenCV
我有一个图像内存,我将其储存并保存在一个指针中,以防丢失其地址。
我现在想通过以下函数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 ));
相关文章:
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 与简单地创建派生类指针相比,将基类绑定到派生类有什么优点?
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 努力将指向成员函数的指针绑定到类模板的T成员,然后在槽中调用
- 将引用绑定到指针的语法是什么?(各种)
- 为什么 VS 无法将右值引用绑定到指针?
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 函数参数绑定通过参考与传递指针传递数组的规则
- 排序时引用绑定到 'value_type' 类型的 null 指针
- PyBind11:绑定使用双指针的函数
- C++绑定函数到指针
- 如何破坏包含自指指针的对象
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 如何将函数指针传递给绑定
- 指向成员的指针如何知道它绑定了哪个成员
- RValue 引用在将其绑定(非指针)对象分配给另一个指针后是否会删除该对象?
- 取消绑定此指针有什么问题
- 为什么 GCC 5.3.0 在将引用绑定到指针时发出警告"this"