OpenCL之图片旋转的实现

这篇博客介绍了如何使用OpenCL对图像进行90度旋转的实现过程,包括旋转原理、前期准备(如使用FreeImage库)、kernel编写、配置文件设置及处理效果对比。适合OpenCL初学者学习。
摘要由CSDN通过智能技术生成

这里做的就是使用OpenCL对图像旋转90度,也算是一个比较入门级别的程序。希望对大家有所帮助吧,看着看着这些代码就熟悉了。

原理

图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x0, y0) 绕其中心(xcenter, ycenter) 逆时针旋转angle 角度后,新的坐标位置(x′, y′) 的计算公式为:

公式

前期

需要对图像进行处理,那么在这里介绍一个库给大家:FreeImage。
不熟悉的请看:请点这里。
使用这个库的方法:(通用方法,极有效)

  • 属性->C/C++->常规->附加包含目录:添加.h的路径。

  • 链接器->常规->附加库目录: 添加lib路径。

  • 链接器->输入->附加依赖项: 添加需要的lib名称。

  • 将dll文件放入exe路径下。

kernel

#pragma OPENCL EXTENSION cl_amd_printf : enable
__kernel  void image_rotate(    
    __global uchar * src_data, 
    __global uchar * dest_data, 
    //Data in global memory
    int W,    
    int H,              
    //Image Dimensions
    float sinTheta, 
    float cosTheta )                    
    //Rotation Parameters
{    
    //Thread gets its index within index space
    const int ix = get_global_id(0); 
    const int iy = get_global_id(1);    

    int xc = W/2;
    int yc = H/2;

    int xpos =  ( ix-xc)*cosTheta - (iy-yc)*sinTheta+xc;    
    int ypos =  ( ix-xc)*sinTheta + (iy-yc)*cosTheta+yc; 

    if ((xpos>=0) && (xpos< W)  && (ypos>=0) && (ypos< H))  //Bound Checking 
    {
        dest_data[ypos*W+xpos]= src_data[iy*W+ix]; 
     }
}

我们把这个东西和CPU串行处理比较一下可以得到如下:

//CPU旋转图像:使用CPU来旋转图片
void cpu_rotate(unsigned char* inbuf, unsigned char* outbuf, int w, int h,float sinTheta, float cosTheta)
{
    int i, j;
    int xc = w/2;
    int yc = h/2;

    
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值