opencv - 将 Mat (OpenCV) 的数据保存在指针所在的 memoryarea 上

标签 opencv pointers opencl mat

我已经通过以下 OpenCL 函数调用在共享内存上创建了一个内存对象:

cl_mem buffer_img_GAUSS_TEST = clCreateBuffer(context, CL_MEM_ALLOC_HOST_PTR, sizeof(uchar) * size_cols * size_rows,NULL,&status);

此函数的调用为我提供了指针:

uchar *src_ptr;
src_ptr  = (uchar *)clEnqueueMapBuffer(cmdQueue, buffer_img_GAUSS_TEST, CL_TRUE, CL_MAP_READ, 0, sizeof(uchar) * size_cols* size_rows, 0, NULL, NULL, &status);

现在我想通过以下 OpenCV 函数调用读取图像:

Mat img= imread( "scene.jpg", IMREAD_GRAYSCALE );

是否可以“说”图片的数据应该放在src_ptr指向的data-area? buffer_img_GAUSS_TEST所在的区域恰好是Template数据所需要的大小

换句话说: 我想替换这部分代码,它将数据从 Image 复制到 src_pointer 指向的地址。

memcpy ( src_ptr, img.data, sizeof(uchar) * img.cols * img.rows);

最佳答案

没有。 根据cv::Mat设计无法在指定的内存位置加载图像数据。

正确的方法是使用 memcpy(正如您所做的那样)。 cv::Mat 的移动语义未定义(至少我没有看到类似的东西,文档中没有信息)。 另一种解决方案是提供指向 img 数据的指针(通过调用 cv::Mat::data())而不创建图像副本,如果您使用的其他库中有这种能力的话。在这种情况下,您应该实现某种共享所有权,并且在使用指向其数据的指针时不要释放 cv::Mat。

关于opencv - 将 Mat (OpenCV) 的数据保存在指针所在的 memoryarea 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44817885/

相关文章:

具有临时消除功能的 C++ OpenCL 矩阵库

multithreading - 本地和全局大小对程序执行的影响 - OpenCl

c++ - 访问 opencv 矩阵 CV_32S 元素

c - C 中带有指针的 string.h 和 strncpy

python - OpenCV NoneType 对象没有属性形状

c - 简单链表构建代码说明

c - 指针指向 mpz_t 数组的双重错误

c - 将 OpenCL 设备与 NVAPI 设备相关联

python - Python 和 OpenCV 的 IOError

c++ - 使用 OpenCV 将灰度图像转换为负片