我正在尝试确定两个图像之间的“错误”(目前只是一个平方差。)我在我的第一个内核中计算并返回单个图像(黑色=完美匹配,白色=完美错误)。我现在想要将该图像减少到第二个内核中的单个“错误”值。我的第一个游戏计划是将“错误”图像传递给第二个内核以进行缩减,但我发现我无法读取/写入同一内核中的图像...所以我想将图像复制到缓冲区,我认为1d数组缓冲区上的简化内核比2d数组更容易。我可以简单地将第一个内核中的像素值返回到1d数组中,但是我无法轻松调试(通过查看返回的“错误”图像。)
我找不到明确的答案,我的代码似乎编译和运行(还没有完成,只是几个构建步骤),但我只是想确定clEnqueueCopyImageToBuffer可以用于2d在我继续前进之前,将图像转换为1d缓冲区副本。
伪代码:
// Create (or load) an OpenCV mat
Mat IMAGE (y, x, CV_32FC1, Scalar(0.0));
// Create the CL Image
image = clCreateImage2D(context, CL_MEM_READ_WRITE | CL_MEMCOPY_HOST_PTR,
& format, IMAGE.cols, IMAGE.rows,0,(void*)IMAGE.data, &err);
// Create a buffer to copy the image to after I do some work in a kernel
size_t image_size = {IMAGE.cols * IMAGE.rows * 1};
// Probably not the most correct way to create the buffer, but it works:
image_mem = clCreateBuffer(context, CL_MEM_READ_WRITE |
CL_MEM_COPY_HOST_PTR, image_size,(void*)IMAGE.data, &err);
...
// Run first kernel on image then
clEnqueueCopyImageToBuffer(ocl_queue, image, image_mem,
origin, region, 0, 0, NULL, NULL);
// Run second kernel on the buffer
这对我来说似乎是合乎逻辑的,但我之前已做出逻辑假设。
谢谢!
答案 0 :(得分:0)
是的,您当然可以将2D图像复制到1D缓冲区(无论如何,所有OpenCL缓冲区都是1D)。
如果您的OpenCV图片类型为CV_32FC1
,则您的image_size
定义必须为IMAGE.cols * IMAGE.rows * sizeof(float)
。
然而,为什么不只是对2D图像进行缩小,然后将最终结果写入缓冲区,而不是产生额外的副本? 2D减少的逻辑并不比1D减少困难,并且这不要求您从同一图像读取/写入。