我正在尝试使用 OpenCL 在 i.mx6 平台上改进拜耳到 rgb 的转换。我正在使用这个OpenCL 着色器进行转换。我预计 OpenCL 版本将比 OpenCV 的 cvtColor 拜耳到 rgb 转换(使用 for 循环)更快。但事实证明,OpenCL 版本比 OpenCV 基于 CPU 的转换要慢得多。
OpenCV:1280 * 960 图像为 28.3 fps OpenCL:1280 * 960 图像为 7.15 fps
size_t global[] = {1280, 960};
Mat bayer = Mat(960, 1280, CV_8UC1);
Mat rgb_image = Mat(960, 1280, CV_8UC3);
cl_input = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, width * height, bayer.data , &ret);
if(ret != CL_SUCCESS){
cout << "OpenCL Buffer Allocation Error\n" ;
exit(0);
}
cl_output = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, width * height * 3, rgb_image.data, &ret);
if(ret != CL_SUCCESS){
cout << "OpenCL OP Buffer Error\n" ;
exit(0);
}
while(true){
capture_image(bayer);
ret = clEnqueueNDRangeKernel(cq, kernel, 2, NULL, global, NULL, 0, NULL, NULL);
if(ret != CL_SUCCESS){
cout << ret << " OpenCL kernel exec Error\n" ;
exit(0);
}
ret = clEnqueueReadBuffer(cq, cl_output, CL_TRUE, 0, width * height * 3, rgb_image.data, 0, NULL, NULL);
if(ret != CL_SUCCESS){
cout << "OpenCL OP Buffer read Error\n" ;
exit(0);
}
}
在配置方面我有什么遗漏吗?我是 OpenCL 新手,不知道如何在循环内调用 openCL 内核。平台信息如下:
- 平台名称:Vivante OpenCL 平台
- 平台配置文件:EMBEDDED_PROFILE
- 平台版本:OpenCL 1.1
平台供应商:Vivante Corporation
设备名称:Vivante OpenCL 设备
- 设备配置文件:EMBEDDED_PROFILE
- 设备版本:OpenCL 1.1
- 设备供应商:Vivante Corporation
- 设备最大工作项尺寸:3-D
- 设备最大工作组大小:1024
PS:我无法在 OpenCV 中使用 OpenCL 支持,因为 i.mx6 没有 OpenCL 完整配置文件,这是 OpenCV 中的 OpenCL 支持所需的