编译带cuda, cudacodec 的opencv

windows下的编译情况

[写的比较乱,没有很好整理,主要给自己看的,见谅!]

电脑情况

Windows 11

之前安装过cuda, 忘了怎么安装的,是不是直接在安装Pytorch的时候安装的?总之,检查了cuda,版本号是10.2.89.

cudnn, 之前没有专门安装过,但是我用conda安装了pytorch-gpu,所以不需要安装cudnn,可能cuda 也不需要安装。

考虑到opencv 可能需要cudnn
参考主页:https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html 安装cudnn 【这个好像有点老了】
参考:https://blog.csdn.net/anmin8888/article/details/127910084
参考:https://blog.csdn.net/weixin_44128004/article/details/125795131?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125795131-blog-127133516.pc_relevant_landingrelevant&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125795131-blog-127133516.pc_relevant_landingrelevant&utm_relevant_index=1

  1. 找到最新的符合我的cuda 10.2版本的cudnn, 进行了下载。解压后,将里面的内容拷贝到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2
    (我暂时没有装zlib, 因为search了一下,似乎已经有很多zlib版本在电脑了)
    (另外,没有按照网上的说明,进一步设置系统的路径)

另外,检查了:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2
里面的sample, 有visual 2017 和 visual 2019,不知道是否支持2022

安装opencv

  1. 下载
    wget -O opencv-4.6.0.zip https://github.com/opencv/opencv/archive/4.6.0.zip
    wget -O opencv-4.6.0_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.6.0.zip

在这里插入图片描述
选定源文件文件夹和编译后的目标文件夹,然后点Configure

在这里插入图片描述
选了2017和x64, 然后点 Finish

在这里插入图片描述
结果如上图,Configure下面的信息中有warning,是关于python等,似乎不重要。然后进行勾选:
搜索CUDA,把带CUDA的选上。
搜索modules, 将OPENCV_EXTRA_MODULES_PATH 设为 opencv_contrib下面的modules目录,然后点configure,

搜索java, 将其去掉。应该可以去掉更多,但我暂时就这样吧。【参考https://www.cnblogs.com/Fish0403/p/16728393.html】
改变CUDA_ARCH_BIN里面的值,仅保留7.0, 7.5. 我的显卡是2060,应该就是用7.5
勾选 OPENCV_ENABLE_NONFREE
然后再次点configure, 然后点Generate

在这里插入图片描述
All_Build 右键生成 ,结果如下:

205>------ 已启动生成: 项目: ALL_BUILD, 配置: Debug x64 ------
========== 生成: 成功 203 个,失败 2 个,最新 0 个,跳过 0==========

最后,说有两个项目生成失败, 用error作为关键词搜索:

169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(323): error C2059: 语法错误:for169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(323): error C2143: 语法错误: 缺少“)(在“;”的前面)
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(323): error C2065: “i”: 未声明的标识符
166>dpm_cascade.cpp
166>dpm_cascade_detector.cpp
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(323): error C2059: 语法错误:)169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(325): error C2275: “std::string”: 将此类型用作表达式非法
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(325): note: 参见“std::string”的声明
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(325): error C2146: 语法错误: 缺少“)(在标识符“input_info”的前面)
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(327): error C2065: “input_info”: 未声明的标识符
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(349): error C2065: “input_info”: 未声明的标识符
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(349): error C2512: “testing::AssertionResult”: 没有合适的默认构造函数可用
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\ts\include\opencv2/ts/ts_gtest.h(19805): note: 参见“testing::AssertionResult”的声明 (编译源文件 D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp)
169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(511): error C2059: 语法错误:}169>D:\ResearchSoftware\opencv460\opencv-4.6.0\modules\objdetect\test\test_qrcode_encode.cpp(511): error C2143: 语法错误: 缺少“;(在“}”的前面)

203>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”

解决方案资源管理器—>CMakeTargets—>INSTALL—>生成”然后又是等,好在这次时间很短。完成后你的build文件夹中会出现一个install文件夹

同样的动作对Release再做一遍。这回只有一个error, 就是上面qrcode那个,python那个在Release下没有问题。

用vs2022 做一个试试

参考:https://www.cnblogs.com/Fish0403/p/16728393.html 进行了选择

2.2.2 再次Configure,在新生成的选项中,勾选/取消勾选相关内容:
1. 勾选WITH_TBB
2. 勾选CUDA相关
3. 取消选择 java 的编译选项(个人不需要) 
4. 勾选nonfree
5. 取消勾选TEST,加速编译
6. 勾选 BUILD_opencv_world 最终只生成一个动态链接库方便使用
7. 在 OPENCV_EXTRA_MODULES_PATH 中填入 OpenCV_contrib 解压文件夹 modules 的路径
8. 取消选择 OPENCV_GENERATE_SETUPVARS 
2.2.3 再次Configure,xfeatures和face报错,因为用不到,我取消了勾选。选择显卡算力,10系卡为6.120系卡为7.530系卡为8.6。 (这个地方不知道是不是opencv470, 没有出现)
(configure后可能会有红字,要多次点configure后才产生无误的)

编译失败了:

23>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include\crt/host_config.h(158): fatal error C1189: #error:  -- unsupported Microsoft Visual Studio version! Only the versions between 2015 and 2019 (inclusive) are supported!

原因是我的cuda不支持2022.

回到2017 编译 opencv 470

fatal error LNK 1210:已超过内部ILK大小限制,链接使用/INCREMENTAL:NO。
https://www.codenong.com/cs106881617/
解决方法:在opencv.sln中找到modules文件下对应的opencv_world工程,然后右键:属性->连接器->常规->启用增量链接:选择否(/INCREMENTAL:NO)。然后重新回到ALL_BUILD进行生成,然后INSTALL生成即可。

后续的测试

  1. 显示一个简单的图片(简单任务)
    vs2022 + opencv 470, vs 2017 + opencv 470 都OK。

  2. 做个yolov4的测试,就是opencv 自带的sample。
    opencv 470不行,出错。不管是用 vs2022 还是 vs2017编译器都有错,错误是说vector 有问题。 “vector subscript out of range”。这个问题就相对来说难查了,因为vector是系统的文件,基本上不能错,所以肯定中间某个地方出错了。具体出错的语句是:net.forward(outs, outNames); 这个比较难查了。

  3. 回到上面的460进行测试。
    没有办法,回到460。用vs2017 进行编辑调试,那个yolo sample 是OK的。然后为了验证cuda的效果,强制其用cuda, 结果就出错了。给出的信息是“bin\cudnn_cnn_infer64_8.dll”。模块已生成,不包含符号”。我以这个为信息,进行百度,看到如下文章说缺少zlibwapi.dll (我之间检测错误的时候,好像在错误信息里面看到说找不到zlibwapi.dll,但是我再回去找却找不到了,所以我觉得这个应该是有价值尝试一下)
    https://zhuanlan.zhihu.com/p/508176067,
    按照上面的说法,去官网 https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#install-zlib-windows
    下载了zlibwapi.
    果然,就OK了,然后用了cuda以后,检测速度明显提高很多。
    然后又尝试了用vs2022来调试这个例子,用了460,都很OK。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值