win10 opencv gpu c++版本编译教程
win10 opencv gpu c++版本编译教程
一、环境准备:
cuda/cudnn
- 根据显卡选择合适版本
- cuda下载地址
- cudnn下载地址
cmake安装
- cmake下载地址
opencv 源码和 opencv_contrib
-
这里使用的是opencv4.8.0版本,
-
opencv下载
-
opencv_contrib下载
-
注意:opencv cmake编译过程会下载第三方库,网络不通会导致编译失败,使用完整的cache文件可加速编译。
注意:opencv cmake编译过程会下载第三方库,网络不通会导致编译失败,使用完整的cache文件可加速编译。
二、CMake编译
1、编译准备
- 把
.cache
复制到opencv4.8.0
源码目录
2、开始cmake编译
1、打开CMake,where is the source code是Opencv sources(opencv-4.8.0)的文件夹位置,where to build the binaries是编译opencv保存的文件夹位置(自定义),在左下角第一次点击Configure
。
2、在弹出的窗口选择编译器,选择对应vs的版本
3、显示Configuring done后,在Search搜索框搜索带cuda的关键字,全部勾选。
4、Search搜索框搜索OPENCV_EXTRA_MODULES_PATH
,添加解压的opencv_contrib
中的modules的路径。
5、选择build_opencv_world
可以将所有opencv的库都打包编译在一起,后续配置C++的opencv环境时不需要自己手动选择添加每个小模块。
6、对于python、java、js、tests相关选项的选择,用Search搜索框分别搜索“python”,“java”,“js”,“tests”,根据需要选中和取消相关选项,默认都是选中的,我们只需要c++相关的,因此都取消了,第二次点击Configure
。
7、显示Configuring done后,搜索arch
选择需要支持的显卡算力。
8、搜索ENABLE_FAST_MATH
勾选,第三次点击Configure。
9、显示Configuring done后,点击generate,显示generating done,成功完成cmake编译。
3、vs编译
1、需要选择release模式编译,配置管理器中勾选install
2、 ALL_BUILD 右键 点击生成,等待2-3小时编译。
3、同样在release|x64模式下,在解决方案资源管理器—>CMakeTargets—>右键点击INSTALL–>生成。
4、编译完成后,安装目录如下
三、测试gpu功能
简单测试c++代码
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <iostream>
int main()
{
// 检查CUDA是否可用
if (!cv::cuda::getCudaEnabledDeviceCount())
{
std::cerr << "CUDA is not available on this system." << std::endl;
return -1;
}
// 创建三个单通道GPU矩阵
cv::cuda::GpuMat gpuMat1(2, 2, CV_8UC1, cv::Scalar(10));
cv::cuda::GpuMat gpuMat2(2, 2, CV_8UC1, cv::Scalar(20));
cv::cuda::GpuMat gpuMat3(2, 2, CV_8UC1, cv::Scalar(30));
// 创建一个向量来保存这三个矩阵
std::vector<cv::cuda::GpuMat> gpuMats;
gpuMats.push_back(gpuMat1);
gpuMats.push_back(gpuMat2);
gpuMats.push_back(gpuMat3);
// 使用merge函数合并这三个矩阵到一个三通道GPU矩阵
cv::cuda::GpuMat mergedMat;
cv::cuda::merge(gpuMats, mergedMat);
// 创建一个输出矩阵来保存阈值操作的结果
cv::cuda::GpuMat thresholdMat;
// 应用阈值操作,阈值设置为50,最大值设置为100
cv::cuda::threshold(mergedMat, thresholdMat, 50, 100, cv::THRESH_BINARY);
// 将阈值操作的结果下载到CPU
cv::Mat cpuThresholdMat;
thresholdMat.download(cpuThresholdMat);
// 打印结果
std::cout << "Threshold result:\n" << cpuThresholdMat << std::endl;
return 0;
}
输出结果: