基于Windows VS2019 C++配置OpenCV 3.3.0及OpenCV 3.3.0 Contrib的一点经验

写在前面

最近要跑一个C++的demo,需要在VS中用到OpenCV 3.3.0及OpenCV 3.3.0 Contrib,我之前在VS2019中配置过OpenCV 4.5.0,但不需要Contrib,还是比较轻松加愉快的。这回还需要配置OpenCV Contrib,过程真是一把辛酸泪,网上搜了不少不少配置经验,可这些文章大多抄来抄去的,有的写得太过模糊,细节不清,有的关于遇到“坑”该如何处理也写得不够明确,难以提供有效参考,精华好帖少之又少(真诚地感谢用心写好帖的大佬)。在此我希望(主要为我自己,也顺便方便他人)写点我自己看得懂的配置(成功的)经验(失败的死胡同就不写在这了),但愿下次我再遇到相似的问题时不必如此焦头烂额。

1 下载CMake,Visual Studio,OpenCV,OpenCV Contrib

这一部分就简略写了,主要因为CMake和Visual Studio 2019我以前装过了,印象里之前下载安装的过程中没遇到啥坑,OpenCV和OpenCV Contrib的下载更没啥坑。

1.1 下载CMake

下载CMake的链接:https://cmake.org/download/

我之前下载安装的是Windows x64 Installer(即.msi后缀名)的3.20.1版本的。

1.2 下载Visual Studio

下载Visual Studio的链接:https://visualstudio.microsoft.com/zh-hans/downloads/

我之前下载安装的是Windows社区版的Visual Studio Community 2019。安装时要装哪些工具和功能就不多说了,网上很多指导的,没啥坑,装少了后面还可以加的(打开VS后菜单栏点击“工具”→“获取工具和功能”即可),装多了VS还是很占硬盘空间的。

1.3 下载OpenCV

下载OpenCV的链接:https://opencv.org/releases/

这次我需要下载的是OpenCV-3.3.0的(翻到了倒数第二页……),选择Windows而非Sources的下载,最终也能行。下载下来的是个.exe的,要装一下,我的路径是D:\editor\opencv330,然后我把D:\editor\opencv330\opencv这个文件夹里的东西掏了出来(别问我为什么,我也不知道⬅_⬅),这样opencv里的sources文件夹的路径就成了D:\editor\opencv330\sources。

1.4 下载OpenCV Contrib

下载OpenCV Contrib的链接:https://github.com/opencv/opencv_contrib/tags

注意OpenCV Contrib的版本要与OpenCV的版本一致,我下载的OpenCV-3.3.0,相应的就要下载OpenCV_Contrib-3.3.0(也在倒数第二页……),我下载的.zip的Source code。下载完解压一下,我的解压路径是D:\editor\opencv_contrib330。

github有时上不去,可以试试科学上网。

2 编译OpenCV和OpenCV Contrib

2.1 CMake编译之路径选择

打开安装好的CMake,选择源代码和build二进制文件的路径。

由于(在1.3中已述)我的opencv里sources的路径是D:\editor\opencv330\sources,所以这就是源代码的路径。

build路径我是在D:\editor\opencv330下新建了一个build文件夹,该文件夹路径为D:\editor\opencv330\build。

基于Windows VS2019 C++配置OpenCV 3.3.0及OpenCV 3.3.0 Contrib的一点经验_第1张图片

2.2 CMake编译之Configure OpenCV

点击configure,会弹出配置框,第一项generator选择自己的Visual Studio版本(就是1.2下载的VS版本),第二项generator的platform我选的x64。

再次点击configure,会运行sources文件中CMakeLists进行下载配置,之后上方大框会一片红,再次点击configure,上方大框变白。

这一步之后,下方大框中,我出现了4个红色的CMake Warning,是网络问题导致的4个文件下载失败,其中,3个是与ffmpeg相关的(2个.dll和1个.cmake),1个是与ippicv相关的(.zip)。

未成功的解决方案(特意列出来,我用这些方法没成功不代表其他人用这些方法无法成功):

①未成功的方式一:科学上网,configure两次;

②未成功的方式二:修改hosts,具体而言,打开C:\Windows\System32\drivers\etc,点击文件资源管理左上角的“文件”→光标移动至但不点击“打开 Windows PowerShell”→点击“以管理员身份打开 Windows PowerShell”→键入notepad hosts以用记事本打开hosts文件,之后访问https://www.ipaddress.com/并查询https://raw.githubusercontent.com/的IP地址,在刚才打开的hosts文件末尾,键入查询到的IP地址,点下Tab键,再键入对应的网址,保存并关闭hosts,再在CMake中configure两次。

至于为啥是查询https://raw.githubusercontent.com/这个地址,是因为CMake Warning中给出了日志文件的路径,按照该路径打开如下图所示的日志文件,其中提及无法将以32位md5加密的opencv_ffmpeg.dll从https://raw.githubusercontent.com/巴拉巴拉拷贝至D:\editor\opencv330\build\3rdparty\ffmpeg路径下。实际上这时在D:\editor\opencv330\build\3rdparty路径下还不存在名为ffmpeg的文件夹,更别提该文件夹中的opencv_ffmpeg.dll文件了。又说核查D:\editor\opencv330\sources\.cache\ffmpeg下的79c35cc654778e66237444bc562afbca-opencv_ffmpeg.dll文件,按它说的打开该ffmpeg文件夹,可以发现由于未能成功下载,该.dll文件大小为0KB。实际上该文件夹中与ffmpeg相关的2个.dll文件和1个.cmake文件都为0KB,.cmake文件打开后空无一字。

基于Windows VS2019 C++配置OpenCV 3.3.0及OpenCV 3.3.0 Contrib的一点经验_第2张图片

成功的解决方案:

手动下载。既然D:\editor\opencv330\sources\.cache\ffmpeg中的文件无法顺利自动下载,那么手动下载这些文件并替换掉就好了,文件的下载链接可以在https://github.com/opencv/opencv_3rdparty的readme的Branches中找到。3个与ffmpeg相关的文件虽然没有版本要求(见上图),但我在上述github链接中查看较新版本的ffmpeg文件夹中的文件,与下载失败的3个文件的文件名对不上。由于(1.3中已述)下载的OpenCV版本是3.3.0,发布日期是2017-08-03,因而我在上述github链接中选择了不晚于该发布日期的最新版本的ffmpeg,即ffmpeg/master-20170704,点击它,再点击“Go to file”,根据3个下载失败的文件的名称,找到其在上述github链接中对应的文件,分别为opencv_ffmpeg.dll,opencv_ffmpeg_64.dll,ffmpeg_version.cmake。

对于2个.dll文件,直接点进去,再点“Download”就能下载了。

对于.cmake文件,点进去后,点“Raw”,再“右键”→“另存为”,默认会保存为.cmake.txt的文本文件,再将.txt的后缀名删去,使其变为.cmake后缀。

然后要将手动下载下来的3个与ffmpeg相关的文件替换掉D:\editor\opencv330\sources\.cache\ffmpeg中已有的3个0KB的文件。这里注意要重命名这些手动下载下来的文件,使其保留那32位的md5前缀以及-。

3个与ffmpeg相关的文件替换好了,再替换1个与ippicv相关的.zip文件。这里注意,在日志文件中明确给出了ippicv文件的版本,因此在https://github.com/opencv/opencv_3rdparty中查找并下载相应的ippicv文件时要注意版本保持一致,我这里对应下载的是ippicv_2017u2_win_intel64_20170418.zip文件。类似的,下载后替换掉D:\editor\opencv330\sources.cache\ippicv中0KB的.zip文件,同样要注意保留32位md5前缀以及-。

之后,在CMake中configure两次,4个提示下载失败的CMake Warning不再出现,说明成功了。

2.3 CMake编译之Configure OpenCV Contrib

在CMake的Search框中搜索BUILD_opencv_world并勾选,搜索OPENCV_ENABLE_NONFREE并勾选,搜索OPENCV_EXTRA_MODULES_PATH并选择(1.4中)下载并解压好的OpenCV Contrib中的modules的路径,我的路径是D:\editor\opencv_contrib330\modules。

在CMake中configure两次,若没出现下载失败的红色CMake Warning,那么恭喜你(可以转到2.4了)。

我这出现了7个与boostdesc相关文件下载失败以及4个与vgg相关文件下载失败,处理的方法(与2.1.2中类似)还是在https://github.com/opencv/opencv_3rdparty中查找并下载相应的文件,我在上述github的readme的Branches中选择并下载的是contrib_xfeatures2d_boostdesc_20161012中的7个对应的文件以及contrib_xfeatures2d_vgg_20160317中的4个对应的文件(好像也只有这几个),下载后替换掉D:\editor\opencv330\sources.cache\xfeatures2d\boostdesc中以及D:\editor\opencv330\sources.cache\xfeatures2d\vgg中的0KB文件,同样要注意保留32位md5前缀以及-。

之后,在CMake中configure两次,11个提示下载失败的CMake Warning不再出现,说明成功了。

2.4 CMake编译之Generate与Open Project

如小标题,先点一下Generate,Generating done后再点一下Open Project就行啦。

2.5 VS编译生成

在打开的VS中,在解决方案资源管理器中,右击“解决方案OpenCV巴拉巴拉”,点击“批生成”,在打开的Batch生成中,将ALL_BUILD的Release和Debug以及INSTALL的Release和Debug后面的共计4个“生成”对应的框勾选,点击“生成”按钮。(我这生成后报了1个错,不过好像没啥影响)

2.6 配置环境变量

直接在Windows搜索“环境变量”,点击“编辑系统环境变量”,在弹出的“系统属性”的“高级”中,点击右下方的“环境变量”进行配置,在“巴拉巴拉的用户变量”中,选中“Path”一栏,点击“编辑”,在弹出的“编辑系统变量”中,点击“新建”,将D:\editor\opencv330\build下成功生成的install的bin路径拷贝到此处,我的是D:\editor\opencv330\build\install\bin。

打开D:\editor\opencv330\build\install\bin文件夹,里面有数个动态链接库文件,我的有5个,分别是opencv_ffmpeg330_64.dll,opencv_img_hash330.dll,opencv_img_hash330d.dll,opencv_world330.dll,opencv_world330d.dll,将动态链接库文件拷贝到C:\Windows\System32中。

2.7 配置VS项目的包含目录、库目录以及附加依赖项

在VS中新建一个项目(我由于是要跑一个C++的demo所以直接打开了那个项目),在解决方案资源管理器中,右击项目名称,点击最下面的“属性”,在弹出的“巴拉巴拉属性页”中,点击“配置属性”中的“VC++ 目录”,打开“包含目录”→“<编辑…>”,点击右上角的文件夹符号“新行”,将D:\editor\opencv330\build下成功生成的install的include路径以及include的opencv2路径拷贝到此处(要“新行”两次,一行写一个路径),我的是D:\editor\opencv330\build\install\include以及D:\editor\opencv330\build\install\include\opencv2,点击“确定”。

别急着关闭“巴拉巴拉属性页”,在“包含目录”下面两行的“库目录”中,类似的操作,将D:\editor\opencv330\build下成功生成的install的lib路径拷贝到此处,我的是D:\editor\opencv330\build\install\lib,点击“确定”。

别急着关闭“巴拉巴拉属性页”,点击“配置属性”中的“链接器”,点击“输入”,编辑“附加依赖项”,将D:\editor\opencv330\build\install\bin中的动态链接库.dll文件添加至此处(一行写一个.dll,以回车分隔,有“d”结尾的是Debug的,没有“d”结尾的是Release的),点击“确定”。

之后就可以点击“巴拉巴拉属性页”右下角的“确定”“应用”以生效。

这时诸如OpenCV中的#include "opencv2/core/core.hpp"或是OpenCV Contrib中的#include "opencv2/ximgproc.hpp"应该都不会报错。

3 跑demo时遇到的其他坑

如前所述,我在VS中配置OpenCV 3.3.0及OpenCV 3.3.0 Contrib的目的是要跑一个C++的demo,OpenCV的问题解决完了之后,还遇到了其他一些小问题,这里顺便记录一下。

3.1 error MSB8036:无法找到 Windows SDK 版本 10.0.19041.0

由于demo比较老了,用的还是之前的Windows SDK,而我之前安装VS2019时恰巧没勾选安装这一个版本的SDK,结果报了这个error。

解决起来也方便,在VS后菜单栏点击“工具”→“获取工具和功能”,在“使用C++的桌面开发”或者“使用C++的游戏开发”的“可选”下,都可勾选并安装(修改)“Window 10 SDK (10.0.19041.0)”。

在解决方案资源管理器中,右击项目名称,点击最下面的“属性”,在弹出的“巴拉巴拉属性页”中,点击“常规”中的“Window SDK 版本”,可以选择安装好的10.0.19041.0版本了。

3.2 error MSB8020:无法找到 Visual Studio 2017 的生成工具(平台工具集 =“v141”)

我用的VS2019,它默认没有带VS2017的生成工具。

这个也好办,同样是在VS后菜单栏点击“工具”→“获取工具和功能”,在“使用C++的桌面开发”中,可以勾选并安装(修改)“MSVC v141 - VS 2017 C++ x64/x86 生成工具”。

在解决方案资源管理器中,右击项目名称,点击最下面的“属性”,在弹出的“巴拉巴拉属性页”中,点击“常规”中的“平台工具集”,可以选择安装好的Visual Studio 2017 (v141)了。

3.3 弹窗报错:无法定位程序输入点巴拉巴拉于动态链接库巴拉巴拉.exe上

这里我的解决方法可能不是比较好的。

打开报错的.exe文件所处的路径,将D:\editor\opencv330\build\install\bin中的动态链接库.dll文件拷贝至此处即可。

致谢

由衷感谢以下帖子的作者,你们的良心好帖使我少走了很多弯路、错路。

https://blog.csdn.net/weixin_46596757/article/details/123380245

https://blog.csdn.net/KayChanGEEK/article/details/79919417

https://www.cnblogs.com/huluwa508/p/10142718.html

https://blog.csdn.net/S1526/article/details/89817791

https://blog.csdn.net/qq_36993032/article/details/118462484

https://blog.csdn.net/qq_17769915/article/details/85256566

你可能感兴趣的:(配置,opencv,windows,c++)