【问题标题】:(OpenCL+ OpenCV) How to use the offset of clEnqueueWriteBuffer?(OpenCL+ OpenCV) 如何使用clEnqueueWriteBuffer的偏移量?
【发布时间】:2014-12-17 16:18:45
【问题描述】:

输入图像是imageA。我想将中间的 1/3 数据(imageB)复制到 opencl 缓冲区中。

我使用 clEnqueueWriteBuffer 函数。(我使用缓冲区而不是图像)

    clEnqueueWriteBuffer(queue, 
                cl_buffer_input, // opencl buffer
                1,
                0, // NOW offset is 0
                WIDTH_IMAGE*(HEIGHT_IMAGE/3))*COLOR_IMAGE_CHANNEL*sizeof(cl_uchar),//1/3 image height
                (void*)(image_input.data), // input data
                 0, 0, NULL);

之后,我复制的缓冲区是图像C的数据。

所以我想用偏移量来复制图片B。

我使用的代码是

  clEnqueueWriteBuffer(queue, 
                cl_buffer_input, // opencl buffer
                1,
                (HEIGHT_IMAGE/3))*COLOR_IMAGE_CHANNEL*sizeof(cl_uchar), // NOW offset is the offset of data
                WIDTH_IMAGE*(HEIGHT_IMAGE/3))*COLOR_IMAGE_CHANNEL*sizeof(cl_uchar),//1/3 image height
                (void*)(image_input.data), // input data
                 0, 0, NULL);

但结果无法更新!即使我把offset改成1,结果也是静止的。(视频中的新帧数据不能上传,结果只有第一帧,位置和图片C一样)。

所以我改变了图像数据的起始指针,让偏移量为0

新的代码是这样的:

  clEnqueueWriteBuffer(queue, 
                cl_buffer_input, // opencl buffer
                1,
                0, // NOW offset is the offset of data
                WIDTH_IMAGE*(HEIGHT_IMAGE/3))*COLOR_IMAGE_CHANNEL*sizeof(cl_uchar),//1/3 image height
                (void*)(image_input.data+(HEIGHT_IMAGE/3))*COLOR_IMAGE_CHANNEL), // input data's pointer changed
                 0, 0, NULL);

而且...新结果就像 imageD! 它只有X线的偏移量。

那么...我该怎么做才能将图像的中间 1/3 数据复制到 opencl 缓冲区中? 谢谢~

【问题讨论】:

    标签: c image opencv buffer opencl


    【解决方案1】:

    你没有得到任何奇怪的东西,你运行的代码的结果是好的。 但是,如果要复制 B 部分,则需要这段代码:

    clEnqueueWriteBuffer(queue, 
                cl_buffer_input, // opencl buffer
                CL_TRUE, //Blocking?
                0, // No offset inside the buffer (the image will start at 0 inside the cl_buffer)
                WIDTH_IMAGE*(HEIGHT_IMAGE/3))*COLOR_IMAGE_CHANNEL*sizeof(cl_uchar),//Copy only 1/3 of image size
                (void*)(image_input.data+WIDTH_IMAGE*(HEIGHT_IMAGE/3))*COLOR_IMAGE_CHANNEL), // Offset the input data by 1/3 as well (the first data to copy is at 1/3 inside the array)
                 0, 0, NULL);
    

    详细说明:你需要复制图片的1/3,所以大小是1/3。缓冲区偏移量为 0,因为您不想在缓冲区末尾写入图像,而是在开头。并且将数据复制到哪里的 ptr 必须具有图像的 1/3 的偏移量。这样您就可以将指针 1/3 到 2/3 的部分复制到缓冲区中。 (缓冲区将有原始图像大小的 1/3)

    【讨论】:

    • 谢谢!优秀的答案!很有帮助!
    猜你喜欢
    • 2014-11-11
    • 2022-06-27
    • 2021-08-07
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2015-11-24
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多