如何解决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,

最低0.47元/天 解锁文章
1132

被折叠的 条评论
为什么被折叠?



