cmake+OpenCV4.8.0+contrib4.8.0+cuda 12.2编译踩坑
准备工具
- cmake (去官网下载)
- OpenCV 我下载的是官网发布最新的稳定版本对应的源码,官网目前是4.8.0,github下一个(连不上的可以网上找找资源或者科学上网)
- OpenCV contrib4.8.0 扩展库,同样是github下载,这个库是扩展库,包括nonfree这类不在标准发布中的内容,用不到的可以不下
- cuda 看你的显卡支持的版本对应下,cuda支持的vs版本有区别,vs2015只能支持9.0,cuda 12.1以上的版本才支持vs2022(可以参考这个网址中的版本介绍:https://blog.csdn.net/m0_55334148/article/details/132880560)
- cudnn cuda的深度学习架构,找到官网对应下一个
- GDCM 这个是用于dicom的库,如果用不到可以忽略
- ippicv 这个东西挺坑的,我用camke编译始终下不下来,没办法自己下了一个(大概率需要科学上网),这个如果下载失败会在cmake显示一个网址,用那个网址去下
- face_landmark_model 这个东西是face模块的,如果用不到也可以考虑去掉,这个也是大概率下不下来的东西,cmake提示后手动去下载
编译以及问题的解决
cmake 的各种设置
先将下载的代码文件解压,然后创建一个build文件夹用于存放cmake之后的内容
打开cmake,选择OpenCV源码的路径以及生成结果存放路径
第一次点击configuration会弹出需要选择编译器,这个时候需要根据cuda支持的版本确定需要使用的vs版本,同时下方会有选择是x64还是win32的选项
等待第一次配置完成,会有许多红色提示,根据我们的需求配置这些内容。
首先,为了之后的生成速度,我不需要test和sample相关的内容,所以这些标签可以去掉
java和python的库我也不需要,搜索之后取消勾选
然后搜索world,勾选,这个选项可以将dll生成到一个文件里,方便使用,否则会出现好多dll配工程的时候比较麻烦
搜索nonfree,这个控制是否编译扩展库,如果使用contrib则需要勾选并填写extraPath,如果不使用可以省略这一步
extraPath的目录需要配到mmodules
需要cuda的内容,搜索cuda都选了,如果使用dnn则需要先安装cudnn
cudnn安装,解压后将对应文件夹中的内容复制到安装cuda文件夹中对应的位置.
cudnn解压后包含以下内容
一般cuda的安装路径都在下面的路径中,这个路径中会包含不同版本的cuda,找到cudnn对应的版本的文件夹,如果找不到路径就去查看环境变量中cuda的路径
按照文件夹名称对应复制就行
在cmake中搜索dcm,勾选
点击configuration,第二次配置之后会出现一些新的选项,包含cuda和dcm的内容。
这个时候下方会有一些报错提示,ippicv的这个一般都是因为下载不成功,手动下载 ,之后解压到opencv的3rdparty中,之后点击configuration就可以检测到这个文件了
如果提示face_landmark_model 下载不成功,则根据报错的网址手动下载,并将文件保存到下面的目录中,同时将文件夹中带有校验码的文件名拷贝后给下载的文件进行重命名
如果提示CMP0146或者CMP0148的错误,则需要修改OpenCV4.8文件夹中的cmakelist文件,可以在其中看到许多类似这种格式的代码,在其中加入关于上方数字相同的内容
if(POLICY CMP0146)
cmake_policy(SET CMP0146 OLD)
endif()
if(POLICY CMP0148)
cmake_policy(SET CMP0148 OLD)
endif()
点击configuration就可以消除这些报错。这类报错如果不去掉的话后期编译代码的时候会报错。
在使用vs2022编译的时候报了一个转换类型的错误
这里的解决方式是找到代码的位置然后增加
static_cast<T>
进行类型转化可以解决,搜了一下原因,可能与cuda的新旧版本有关,适用于cuda12.1和cuda12.2,这里原本可能存在一个隐式转换函数,但是新版本没有了,所以编译的时候会有问题。
之后进行正常的all_build和install就可以正常使用,先build,然后仅用于install得到install文件夹,其中包含所需要的dll等内容