opencl+opencv实现sobel算法

这几天在看opencl编程指南,照着书中的例子实现了sobel算法:

1.结合opencv读取图像,保存到缓冲区中;

2.编写和编译内核,并保存显示处理后的结果。

内核:

const sampler_t sampler = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
kernel void sobel_rgb(read_only image2d_t src,write_only image2d_t dst)
{
	int x = (int)get_global_id(0);
	int y = (int)get_global_id(1);
	if (x >= get_image_width(src) || y >= get_image_height(src))
		return;
	float4 p00 = read_imagef(src, sampler, (int2)(x - 1, y - 1));
	float4 p10 = read_imagef(src, sampler, (int2)(x, y - 1));
	float4 p20 = read_imagef(src, sampler, (int2)(x + 1, y - 1));
	float4 p01 = read_imagef(src, sampler, (int2)(x - 1, y));
	float4 p21 = read_imagef(src, sampler, (int2)(x + 1, y));
	float4 p02 = read_imagef(src, sampler, (int2)(x - 1, y + 1));
	float4 p12 = read_imagef(src, sampler, (int2)(x, y + 1));
	float4 p22 = read_imagef(src, sampler, (int2)(x + 1, y + 1));
	float3 gx = -p00.xyz + p20.xyz + 2.0*(p21.xyz - p01.xyz) - p02.xyz + p22.xyz;
	float3 gy = -p00.xyz + p02.xyz + 2.0*(p21.xyz - p10.xyz) - p20.xyz + p22.xyz;
	float3 g = native_sqrt(gx*gx + gy*gy);
	write_imagef(dst,(int2)(x,y),(float4)(g.x,g.y,g.z,1.0f));
}
// TODO: Add OpenCL kernel code here.

c++源码:

//
// Book:      OpenCL(R) Programming Guide
// Authors:   Aaftab Munshi, Benedict Gaster, Timothy Mattson, James Fung, Dan Ginsburg
// ISBN-10:   0-321-74964-2
// ISBN-13:   978-0-321-74964-2
// Publisher: Addison-Wesley Professional
// URLs:      http://safari.informit.com/9780132488006/
//            http://www.openclprogrammingguide.com
//

// ImageFilter2D.cpp
//
//    This example demonstrates performing gaussian filtering on a 2D image using
//    OpenCL
//
//    Requires FreeImage library for image I/O:
//      http://freeimage.sourceforge.net/

#include <iostream>
#include <fstream>
#include <sstream>
#include <string.h>
#include <opencv.hpp>

#ifdef __APPLE__
#include <OpenCL/cl.h>
#else
#include <CL/cl.h>
#endif

#include "FreeImage.h"

///
//  Create an OpenCL context on the first available platform using
//  either a GPU or CPU depending on what is available.
//
cl_context CreateContext()
{
	cl_int errNum;
	cl_uint numPlatforms;
	cl_platform_id firstPlatformId;
	cl_context context = NULL;

	// First, select an OpenCL platform to run on.  For this example, we
	// simply choose the first available platform.  Normally, you would
	// query for all available platforms and select the most appropriate one.
	errNum = clGetPlatformIDs(1, &firstPlatformId, &numPlatforms);
	if (errNum != CL_SUCCESS || numPlatforms <= 0)
	{
		std::cerr << "Failed to find any OpenCL platforms." << std::endl;
		return NULL;
	}

	// Next, create an OpenCL context on the platform.  Attempt to
	// create a GPU-based context, and if that fails, try to create
	// a 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值