图像融合(三)__C++和CUDA做加速处理

针对图像融合的矩阵变化速度较慢的情况做cuda加速处理,本文是自己学习后加入自己深入理解的总结记录,方便自己以后查看。

如何解决opencv算法cpu处理较慢的问题,我这边利用cuda编程在GPU上并行计算加快速度

一、方法一

使用c++先将通道图片从host拷贝到device中,使用cuda核函数做通道融合和阈值加减,再将核函数的输出从device中转到host,c++调用直接cv::mat生成图片,python调用同样用cv2.mat(),C#调用使用BitmapToByte和ByteToBitmap转换成bitmap格式(后面附带转换方法)

1、cuda核函数

__global__ void merge_image(uchar* src1, uchar* src2, uchar* src3, uchar* drc, int rows, int clos, int value_b, int value_g, int value_r)
{
	//blockDim.x一个线程格中的网格指标,默认一维。blockIdx一个网格中的线程块指标,默认是一维。threadIdx一个线程块中的线程指标,默认是一维。1800*600
	int id = blockIdx.x * blockDim.x + threadIdx.x;
	if (id < clos * rows)
	{
		if (value_b > 0 && (255 - src1[id]) < value_b)
			drc[id * 3] = 255;
		else if(value_b < 0 && src1[id]<=(-1* value_b))
			drc[id * 3] = 0;
		else
			drc[id * 3] = src1[id]+value_b;
		if (value_g > 0 && (255 - src2[id]) < value_g)
			drc[id * 3+1] = 255;
		else if (value_g < 0 && src2[id] <= (-1 * value_g))
			drc[id * 3+1] = 0;
		else
			drc[id * 3+1] = src2[id] + value_g;
		if (value_r > 0 && (255 - src3[id]) < value_r)
			drc[id * 3 + 2] = 255;
		else if (value_r < 0 && src3[id] <= (-1 * value_r))
			drc[id * 3 + 2] = 0;
		else
			drc[id * 3 + 2] = src3[id] + value_r;
	}
}
uchar* merge_cuda_process(uchar* src1, uchar* src2, uchar* src3, uchar* drc, int rows, int clos, int value_b, int value_g ,int value_r) {
	int block = rows;
	int grid = (clos * rows + block - 1) / block;
	//grid---网格大小,block---线程块大小(线程格->线程块->线程)线程数=网格大小*线程块大小
	merge_image << <grid, block >> > (src1, src2, 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值