我已经通过以下 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/