如何解决尝试使用OpenCV在图像之间写入时,CL_INVALID_KERNEL_ARGS
我决定尝试开始学习OpenCL。我花了很多时间进行编译等工作,最后我有了一个Qt项目,其中嵌入了OpenCV,并且OpenCL正常工作。互联网上有关下一步的信息虽然很少。使用其他stackoverflow帖子,我将这个内核搞混了,应该交换图像颜色通道。
这是我的内核:
__kernel void shift(
read_only image2d_t input,float shift_x,float shift_y,write_only image2d_t output,int dst_step,int dst_offset,int dst_rows,int dst_cols)
{
int2 coord = (get_global_id(1),get_global_id(0));
uint4 pixel = read_imageui(input,samplerLN,coord);
// create pixel with swapped channels
uint4 pixel2;
pixel2.s0 = pixel.s1;
pixel2.s1 = pixel.s2;
pixel2.s2 = pixel.s0;
write_imageui(output,coord,pixel2);
}
这是我尝试运行它的方式:
//! run gpu operation
cv::ocl::Device(context.device(0));
cv::Mat imageOpenCL = cv::imread("D:\\images\\20200424_162602.jpg",cv::IMREAD_GRAYSCALE);
imageOpenCL.convertTo(imageOpenCL,CV_32F,1.0 / 255);
cv::UMat umat_src = imageOpenCL.getUMat(cv::ACCESS_READ,cv::USAGE_ALLOCATE_DEVICE_MEMORY);
cv::UMat umat_dst(imageOpenCL.size(),cv::ACCESS_WRITE,cv::USAGE_ALLOCATE_DEVICE_MEMORY);
cv::ocl::ProgramSource program(source);
cv::ocl::Image2D imageCL(umat_src);
cv::ocl::Image2D imageCLOut(umat_dst);
float shift_x = 100.5;
float shift_y = -50.0;
cv::ocl::Kernel kernel("shift",program);
kernel.args(imageCL,shift_x,shift_y,imageCLOut);
size_t globalThreads[3] = { (size_t)imageOpenCL.cols,(size_t)imageOpenCL.rows,1 };
//size_t localThreads[3] = { 16,16,1 };
bool success = kernel.run(3,globalThreads,NULL,true);
if (!success){
std::cout << "Failed running the kernel..." << std::endl;
return;
}
// Download the dst data from the device (?)
cv::Mat mat_dst = umat_dst.getMat(cv::ACCESS_READ);
cv::imshow("src",imageOpenCL);
cv::imshow("dst",mat_dst);
我可能复制了错误的数据,但是我不确定该怎么做。我还尝试了其他类型的图像,而不是CV_32F
,例如CV_8U
和CV_8UC3
。
解决方法
您的内核有8个参数;您只需设置其中的4个。因此,CL_INVALID_KERNEL_ARGS错误。您似乎没有使用内核中的最后4个参数;此修补程序似乎是从内核参数列表中删除它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。