這里做的就是使用OpenCL對圖象旋轉90度,也算是1個比較入門級別的程序。希望對大家有所幫助吧,看著看著這些代碼就熟習了。
圖象旋轉是指把定義的圖象繞某1點以逆時針或順時針方向旋轉1定的角度,通常是指繞圖象的中心以逆時針方向旋轉。假定圖象的左上角為(left, top),右下角為(right, bottom),則圖象上任意點(x0, y0) 繞其中心(xcenter, ycenter) 逆時針旋轉angle 角度后,新的坐標位置(x′, y′) 的計算公式為:
需要對圖象進行處理,那末在這里介紹1個庫給大家:FreeImage。
不熟習的請看:請點這里。
使用這個庫的方法:(通用方法,極有效)
屬性->C/C++->常規->附加包括目錄:添加.h的路徑。
鏈接器->常規->附加庫目錄: 添加lib路徑。
鏈接器->輸入->附加依賴項: 添加需要的lib名稱。
將dll文件放入exe路徑下。
#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串行處理比較1下可以得到以下:
//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;
for(i = 0; i < h; i++)
{
for(j=0; j< w; j++)
{
int xpos = ( j-xc)*cosTheta - (i-yc)*sinTheta+xc;
int ypos = (j-xc)*sinTheta + ( i-yc)*cosTheta+yc;
if(xpos>=0&&ypos>=0&&xpos<w&&ypos<h)
outbuf[ypos*w + xpos] = inbuf[i*w+j];
}
}
}
對照以后我們發現OpenCL寫kernel的時候循環沒有了,取而代之的就是給出global_id便可。
這里還觸及到1些圖片的操作,具體請看FreeImage的使用。
#include "stdafx.h"
#include <CL/cl.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include "gFreeImage.h"
using namespace std;
#define NWITEMS 4
#pragma comment (lib,"OpenCL.lib")
#pragma comment (lib,"FreeImage.lib")
//把文本文件讀入1個string中,其實就是把運行程序傳給從機
int convertToString(const char *filename, std::string& s)
{
size_t size;
char* str;
std::fstream f(filename, (std::fstream::in | std::fstream::binary));
if(f.is_open())
{
size_t fileSize;
f.seekg(0, std::fstream::end);
size = fileSize = (size_t)f.tellg();
f.seekg(0, std::fstream::beg);
str = new char[size+1];
if(!str)
{
f.close();
return NULL;
}
f.read(str, fileSize);
f.close();
str[size] = '
主站蜘蛛池模板:
亚洲人网站
|
国产永久免费爽视频在线
|
jizzjizz黄色|
xxxxxx国产精品视频
|
羞羞视频免费入口
|
国产一级淫片a免费播放口欧美
|
欧美freesex10一|3
|
亚洲经典在线观看
|
aa级国产女人毛片好多水
|
黄色wwwcom|
国产一区二区亚洲精品天堂
|
理论片亚洲
|
亚洲国产成人久久综合一区
|
亚洲欧美日韩中文字幕一区二区三区
|
日韩最新视频一区二区三
|
欧美一区二区三区免费
|
中文字幕在线看视频一区二区三区
|
中文字幕在线二区
|
91精品久久久久久久久久
|
性感美女视频免费网站午夜
|
中文字幕在线视频网站
|
xxxx性xxxx|
最近免费中文字幕大全高清片
|
国内精品一区二区三区αv
国内精品一区二区三区东京
|
欧美自拍视频在线
|
欧美美女free
|
国产毛片不卡
|
夜夜精品视频一区二区
|
武则天a级在线观看
|
欧美视频福利
|
最近中文字幕免费mv视频8
|
99精品小视频
|
国内精品免费视频精选在线观看
|
一级做a爰片性色毛片视频图片
|
免费成年人视频在线观看
|
午夜色综合
|
国产精品国产三级国产无毒
|
欧美一二区视频
|
99干99|
伊人情人综合
|
精品久久久久久中文字幕女
|