这里做的就是使用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;