网站设计与网页制作项目教程,长春市城乡建设部网站,HTML发布网站,溧阳网站建设制作opencv大多数只使用到了cpu的版本#xff0c;实际上对于复杂的图像处理过程用cuda#xff08;特别是高分辨率的图像#xff09;可能会有加速效果。是否需要使用cuda需要思考#xff1a;
1、opencv的cuda库是否提供了想要的算子。在CUDA-accelerated Computer Vision你可以…opencv大多数只使用到了cpu的版本实际上对于复杂的图像处理过程用cuda特别是高分辨率的图像可能会有加速效果。是否需要使用cuda需要思考
1、opencv的cuda库是否提供了想要的算子。在CUDA-accelerated Computer Vision你可以看到cv的cuda库提供了哪些方法。2、如果要使用cv的cuda库会涉及到数据从cpu和gpu之间的交换。一张图片首先会被cpu读取到内存中然后通过api将cpu中的数据搬运到gpu中而cpu和gpu之间的数据搬运也是很耗时的比如gpu_dst.download(dst_cpu)将gpu_dst数据搬运到dst_cpu数据是8976*4960*3耗时约37ms如果你的图像处理比较简单说不定数据搬运的耗时比直接在cpu上运行更长。
1、带cuda的opencv安装
这里的前提是你的nvidia驱动、cuda以及cudnn都安装完成可以正常使用。
首先下载版本一致的opencv和opencv-contribcuda库所在包然后解压待用。
然后查询你显卡的Compute Capability进入opencv-4.8.1后创建build文件夹终端在build中打开后执行
cmake \
-D CMAKE_BUILD_TYPERELEASE \
-D BUILD_CUDA_STUBSON \
-D WITH_CUDAON \
-D CUDA_ARCH_BIN8.9 \
-D OPENCV_EXTRA_MODULES_PATH../../opencv_contrib-4.8.1/modules .. 注意CUDA_ARCH_BIN是你查询到自己显卡的Compute CapabilityOPENCV_EXTRA_MODULES_PATH指向你的opencv_contrib-4.8.1/modules。最后的..不能省略 可以看到成功检测到我的11.8的cuda但是没有cuDNN。不知道是不是新版的原因我安装好cudnn后通过命令cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2查询cudnn版本没有任何输出但是确实存在cudnn.h并在在使用cuda时也没有问题就没有后面在opencv使用cuda也没有报错。
然后:sudo make –j15表示使用15个线程make因cpu而异。 最后sudo make install。
后续的操作参考ubuntu20.04opencvvscode添加环境变量。
2、测试
编写c代码测试
#include opencv2/opencv.hpp
#include opencv2/core/cuda.hppint main()
{cv::cuda::printCudaDeviceInfo(cv::cuda::getDevice());int count cv::cuda::getCudaEnabledDeviceCount();printf(GPU Device Count : %d \n, count);return 0;
}如果是不支持cuda的cv则会报错error: (-216:No CUDA support) The library is compiled without CUDA support in function throw_no_cuda
3、在gpu上旋转图像
实际上在gpu上使用cv总体分为三步1将内存中的数据搬运到gpu上2使用cuda方法进行图像处理3将处理结果搬运到cpu上
下面是一个将图像逆时针旋转90度的代码其中Timer类是一个计时器从创建起计时到离开作用域被销毁时的耗时。对于4960*8976\的图像进行测试RGB指3通道Gray指单通道测量upload、rotate和download三个阶段的耗时
RGB(ms)Gray(ms)upload93rotate43download3712
可以看到对于简单的操作实际上耗时在数据的上传和下载。
#include opencv2/opencv.hpp
#include opencv2/cudawarping.hpp
#include timer.hint main(int argc, char *argv[])
{if (argc ! 2){ // 检查是否传入图片路径std::cout 参数错误 std::endl;}// 以灰度图模式读取输入图像cv::Mat src cv::imread(argv[1]);if (src.empty()){std::cerr Failed to read input image! std::endl;return -1;}cv::Mat dst_cpu; // 在cpu创建一个Mat接受处理后的图像结果cv::cuda::GpuMat gpu_src, gpu_dst; // 在gpu创建两个Mat分别储存旋转前后的图像因为旋转前后尺寸不一样所以必须要两个Matgpu_dst.create(8976, 4960, CV_8UC3); // 定义旋转后图像尺寸的Matcv::Mat colorImage(8976, 4960, CV_8UC3); // 在cpu创建Mat一个将灰度图转为RGB图的Mat{{Timer time(upload);gpu_src.upload(src); // 将cpu上的src搬运到gpu的gpu_src中}{Timer time(rotate); // 计时器从此刻计时直到离开作用域被销毁// 逆时针旋转90度将4960*8976转8976*4960流程是按左上角旋转后向下平移8976然后用8976*4960的Mat接受cv::cuda::rotate(gpu_src, gpu_dst, gpu_dst.size(), 90, 0, 8976);}// 将gpu的gpu_dst数据搬运到dst_cpu中好像只有gpu的数据才有方法{Timer time(download);gpu_dst.download(dst_cpu); // gpu到cpu搬运数据很耗时RGB数据耗时37msGray数据耗时12ms}}return 0;
}# CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
set(CMAKE_BUILD_TYPE Debug)
project(MyProject)# 添加可执行文件
add_executable(draft draft.cpp src/timer.cpp)# 设置包含目录
target_include_directories(draft PRIVATE src)# 查找 OpenCV 库
find_package(OpenCV REQUIRED)# 将 OpenCV 库链接到可执行文件
target_link_libraries(draft PRIVATE ${OpenCV_LIBS} opencv_cudawarping)