OpenCV和Cuda结合编程
创始人
2024-03-30 00:35:42
0

一、利用OpenCV中提供的GPU模块

  目前,OpenCV中已提供了许多GPU函数,直接使用OpenCV提供的GPU模块,可以完成大部分图像处理的加速操作。

  基本使用方法,请参考:http://www.cnblogs.com/dwdxdy/p/3244508.html

  该方法的优点是使用简单,利用GpuMat管理CPU与GPU之间的数据传输,而且不需要关注内核函数调用参数的设置,使用过程中,只需要关注处理的逻辑操作。

  缺点是受限于OpenCV库的发展和更新,当需要完成一些自定义的操作时(OpenCV中没有提供相应的库),难以满足应用的需求,需要自己实现自定义操作的并行实现。此外,针对一些特殊需求,OpenCV提供并行处理函数,其性能优化并不是最优的,在具体的应用时,可能需要进一步优化,提高性能。

二、单独使用Cuda API编程

  利用Cuda Runtime API、Cuda Driver API实现一些操作的并行加速,使用过程需要管理CPU与GPU之间的数据传输,内核函数调用参数的设置,内核函数的优化等。

  优点是处理过程受控于用户,用户可以实现更多的并行加速处理操作。

  缺点是使用复杂,代码编写量较多,需要熟悉Cuda相关资料和API接口。下面是简单的示例程序:

__global__ void swap_rb_kernel(const uchar3* src,uchar3* dst,int width,int height)
{int x = threadIdx.x + blockIdx.x * blockDim.x;int y = threadIdx.x + blockIdx.y * blockDim.y;if(x < width && y < height){uchar3 v = src[y * width + x];dst[y * width + x].x = v.z;dst[y * width + x].y = v.y;dst[y * width + x].z = v.x;}
}void swap_rb_caller(const uchar3* src,uchar3* dst,int width,int height)
{dim3 block(32,8);dim3 grid((width + block.x - 1)/block.x,(height + block.y - 1)/block.y);swap_rb_kernel<<>>(src,dst,width,height);cudaThreadSynchronize();
}int main()
{Mat image = imread("lena.jpg");imshow("src",image);size_t memSize = image.cols*image.rows*sizeof(uchar3);uchar3* d_src = NULL;uchar3* d_dst = NULL;CUDA_SAFE_CALL(cudaMalloc((void**)&d_src,memSize));CUDA_SAFE_CALL(cudaMalloc((void**)&d_dst,memSize));CUDA_SAFE_CALL(cudaMempcy(d_src,image.data,memSize,cudaMemcpyHostToDevice));swap_rb_caller(d_src,d_dst,image.cols,image.rows);CUDA_SAFE_CALL(cudaMempcy(image.data,d_dst,memSize,cudaMemcpyDeviceToHost));imshow("gpu",image);waitKey(0);CUDA_SAFE_CALL(cudaFree(d_src));CUDA_SAFE_CALL(cudaFree(d_dst));return 0;
}

  上述代码中,使用cudaMalloc,cudaMemcpy,cudaFree管理内存的分配、传输和释放。

  注意:若image.data包含字节对齐的空白数据,上述程序无法完成正常的处理操作。

三、利用OpenCV中提供接口,并结合Cuda API编程

  利用OpenCV已经提供的部分接口,完成一些Cuda编程的基本处理,简化编程的复杂程度;只是根据自己业务需求,自定义内核函数或扩展OpenCV已提供的内核函数。这样既可以充分利用OpenCV的特性,又可以满足业务的不同需求,使用方便,且易于扩展。下面是简单的示例程序:

//swap_rb.cu
#include 
using namespace cv;
using namespace cv::gpu;
//自定义内核函数
__global__ void swap_rb_kernel(const PtrStepSz src,PtrStep dst)
{int x = threadIdx.x + blockIdx.x * blockDim.x;int y = threadIdx.y + blockIdx.y * blockDim.y;if(x < src.cols && y < src.rows){uchar3 v = src(y,x);dst(y,x) = make_uchar3(v.z,v.y,v.x);}
}void swap_rb_caller(const PtrStepSz& src,PtrStep dst,cudaStream_t stream)
{dim3 block(32,8);dim3 grid((src.cols + block.x - 1)/block.x,(src.rows + block.y - 1)/block.y);swap_rb_kernel<<>>(src,dst);if(stream == 0)cudaDeviceSynchronize();
}
//swap_rb.cpp
#include 
#include 
using namespace cv;
using namespace cv::gpu;void swap_rb_caller(const PtrStepSz& src,PtrStep dst,cudaStream_t stream);void swap_rb(const GpuMat& src,GpuMat& dst,Stream& stream = Stream::Null())
{CV_Assert(src.type() == CV_8UC3);dst.create(src.size(),src.type());cudaStream_t s = StreamAccessor::getStream(stream);swap_rb_caller(src,dst,s);
}
//main.cpp
#include 
#include 
#include 
using namespace cv;
using namespace cv::gpu;
void swap_rb(const GpuMat& src,GpuMat& dst,Stream& stream = Stream::Null());
int main()
{Mat image = imread("lena.jpg");imshow("src",image);GpuMat gpuMat,output;gpuMat.upload(image);swap_rb(gpuMat,output);output.download(image);imshow("gpu",image);waitKey(0);return 0;
}

  swap_rb.cu文件定义了内核函数和内核函数的调用函数,在调用函数中,设置内核函数的调用参数。

  swap_rb.cpp文件定义了并行操作的入口函数,即主程序完成并行操作的需要调用的函数,其主要是封装内核函数的调用函数,并添加输入参数的验证、根据输入参数选择不同内核函数等操作。

  main.cpp文件主程序,完成数据的输入、业务的处理和数据的输出。

总结

  编程简易性和可控性是相对的,编程越方便,就越不容易控制。实际应用过程中,应当寻求编程简易性和可控性的平衡点,应根据应用需求,选取适当的方法,一般建议采用方法三。

相关内容

热门资讯

中金黄金相关公司新增一项195... (转自:快查一企业中标了)快查APP显示,中金黄金相关公司河南金源黄金矿业有限责任公司于2025年5...
申万菱信专精特新主题混合型发起... 申万菱信专精特新主题混合型发起式证券投资基金(简称:申万菱信专精特新主题混合型发起式C,代码0159...
华西优选成长一年持有混合净值下... 华西优选成长一年持有期混合型证券投资基金(简称:华西优选成长一年持有混合,代码019281)公布5月...
高端能源装备企业看好成都 转自:成都日报锦观坚定投资布局高端能源装备企业看好成都 5月9日,2025中国产业转移发展对接...
申万菱信数字产业股票型发起式A... 申万菱信数字产业股票型发起式证券投资基金(简称:申万菱信数字产业股票型发起式A,代码018048)公...
500万元公益林补偿收益权质押... 转自:成都日报锦观全省首笔500万元公益林补偿收益权质押贷款落地 本报讯 (成都日报锦观新闻记...
印度称在边境多处地点发现无人机 △资料图总台记者当地时间10日获悉,印度国防部发表声明称,在印度与巴基斯坦接壤的边境地区及印巴实控线...
中欧瑾和灵活配置混合A净值下跌... 中欧瑾和灵活配置混合型证券投资基金(简称:中欧瑾和灵活配置混合A,代码001173)公布5月9日最新...
在成都打造无线电领域的“智能手... 转自:成都日报锦观成都彬鸿科技有限公司创始人何宗彬:在成都打造无线电领域的“智能手机” 何宗彬...
方正富邦科技创新A净值下跌3.... 方正富邦科技创新混合型证券投资基金(简称:方正富邦科技创新A,代码008640)公布5月9日最新净值...
前海开源沪港深新硬件C净值下跌... 前海开源沪港深新硬件主题灵活配置混合型证券投资基金(简称:前海开源沪港深新硬件C,代码004315)...
诺德兴新趋势A净值下跌3.42... 诺德兴新趋势混合型证券投资基金(简称:诺德兴新趋势A,代码016772)公布5月9日最新净值,下跌3...
特一药业集团股份有限公司关于提... 股票代码:002728 股票简称:特一药业 公告编号:2025-029特一药业集团股份有限公司关于...
华泰保兴产业升级混合发起A净值... 华泰保兴产业升级混合型发起式证券投资基金(简称:华泰保兴产业升级混合发起A,代码021792)公布5...
关注·全国防灾减灾日 转自:法治日报▲ 为进一步提高在校师生应急避险能力和意识,在全国防灾减灾日来临之际,江苏省淮安市公安...
辽宁港口股份有限公司关于召开2... 证券代码:601880 证券简称:辽港股份 公告编号:临2025-026辽宁港口股份有限公司关于召...
Goldman Sachs 增... 吴说获悉,根据最新 13F 文件,截至 3 月 31 日,Goldman Sachs 持有 IBIT...
北京海淀检察构建模型矩阵助力刑... 转自:法治日报本报讯 记者黄洁 张雪泓 记者近日从北京市海淀区人民检察院了解到,为推动刑事侦查监督工...
辽宁政法系统开展大练兵大比武活... 转自:法治日报本报讯 记者张国强 韩宇 为加强政法队伍作风建设、能力建设,近日,辽宁省委政法委在全省...
炼石航空科技股份有限公司关于公... 证券代码:000697 证券简称:ST炼石 公告编号:2025-026炼石航空科技股份有限公司关于公...