2017-06-29 31 views
1

我已经创建了一个存储器对象上的共享存储器具有以下的OpenCL函数的调用memoryarea:保存垫(OpenCV的)的数据上位于由指针

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指向的数据区域?位于由buffer_img_GAUSS_TEST区域有确切需要的模板

的数据换句话说大小: 我想更换代码,从图像copys数据的地址指向src_pointer的这一部分。

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

回答

1

号 根据cv::Mat设计是不可能在指定存储器位置加载的图像数据。

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