【问题标题】:OpenCL leading with OpenCVOpenCL 领先于 OpenCV
【发布时间】:2013-09-12 06:56:56
【问题描述】:

我正在尝试使用 OpenCL 实现图像处理算法,因此我认为使用 OpenCV 可能是一个好主意。

我有以下几点:

cv::Mat image = cv::imread("lena.bmp");
width = image.rows;
height = image.cols;

char *buffer = reinterpret_cast<char *>(image.data);

cl::Image2D clImage(context,
                        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                        cl::ImageFormat(CL_RGBA, CL_UNORM_INT8),
                        width,
                        height,
                        0,
                        buffer);

return clImage;

但是当我运行程序时,它给了我一个段错误:

Segmentation fault (core dumped)

我正在阅读 OpenCL Programming Guide 源代码,它实现了我测试过的非常相似的代码,并且运行良好,但它使用了 freeimage:

char *buffer = new char[width * height * 4];
memcpy(buffer, FreeImage_GetBits(image), width * height * 4);

FreeImage_Unload(image);

// Create OpenCL image
cl_image_format clImageFormat;
clImageFormat.image_channel_order = CL_RGBA;
clImageFormat.image_channel_data_type = CL_UNORM_INT8;

cl_int errNum;
cl_mem clImage;
clImage = clCreateImage2D(context,
                        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                        &clImageFormat,
                        width,
                        height,
                        0,
                        buffer,
                        &errNum);

那么,有什么问题吗?我该如何解决?

【问题讨论】:

  • 我的猜测:您的图像实际上有 3 通道 (rgb);您将 CL_RGBA 作为图像格式(4 通道)传递,CL 为您的输入数据 buffer 计算错误的维度,并读取超出范围。

标签: c++ image opencv opencl gpu


【解决方案1】:

感谢@sbabbi,我意识到我可以做到以下几点:

cv::Mat image = cv::imread("lena.bmp", CV_LOAD_IMAGE_COLOR);
cv::Mat imageRGBA;

width = image.rows;
height = image.cols;

cv::cvtColor(image, imageRGBA, CV_BGR2RGBA);
char *buffer = reinterpret_cast<char *>(imageRGBA.data);

cl::Image2D clImage(context,
                        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
                        cl::ImageFormat(CL_RGBA, CL_UNORM_INT8),
                        width,
                        height,
                        0,
                        buffer);

return clImage;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2015-09-23
    • 2011-12-28
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多