赞
踩
之前的学习都是针对cuda语法理论的,今天跟大家分享OpenCV CUDA库的使用。
OpenCV CUDA库使用GpuMat存储图像矩阵,OpenCV CUDA库使用框架大致如下:
这里使用了共享内存,同步以及原子加法操作的概念实现直方图统计
详细代码如下所示:
#include <stdio.h> #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/cudacodec.hpp> #include <opencv2/cudaarithm.hpp> #include <opencv2/cudaimgproc.hpp> using namespace std; using namespace cv; int main() { //定义CPU 图像矩阵变量 cv::Mat h_img1, h_img2, h_result; //OpenCV读取图像 h_img1 = imread("D:\\Programming\\Repos\\DNN\\DTTNN\\resources\\opencv\\apple.jpg"); h_img2 = imread("D:\\Programming\\Repos\\DNN\\DTTNN\\resources\\opencv\\orange.jpg"); //定义GPU 图像矩阵变量 cv::cuda::GpuMat d_img1, d_img2, d_result; //将CPU图像数据拷贝到GPU图像矩阵变量中 d_img1.upload(h_img1); d_img2.upload(h_img2); //执行OpenCV CUDA函数 cv::cuda::add(d_img1, d_img2, d_result); //将GPU图像数据拷贝到CPU图像矩阵中 d_result.download(h_result); //在CPU终端窗口显示图像 imshow("img1", h_img1); imshow("img2", h_img2); imshow("result", h_result); waitKey(0); //销毁所有图像窗口 destroyAllWindows(); return 0; }
apple.jpg
orange.jpg
图像加法操作结果:
从上面的例子来看,使用OpenCV CUDA库还是比较简单的,具体的CUDA加速细节对调用者来说是透明的,也不需要了解CUDA的具体语法,使用简单方便,缺点可能是扩展性不好,对于OpenCV不支持的CUDA加速操作,调用者没法自己扩充(OpenCV没有提供相应的扩展接口,个人目前没有找到OpenCV提供的扩展接口)。
本人也是刚接触,上面描述如有错误,还请谅解并能指正,谢谢!
《基于GPU加速的计算机视觉编程》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。