编译OpenCV——Windows平台,适应VS版本
其他平台参考:编译OpenCV——jetson嵌入式平台 - 夕西行 - 博客园
使用CMake来编译OpenCV,以匹配自己使用的VS版本。
主要有两步:
- CMake编译OpenCV源码得到OpenCV.sln工程文件。
- VS编译OpenCV.sln。
以最新的cmake-3.16.0-rc1-win64-x64、opencv-3.4.8、opencv_contrib-3.4.8为例,编译适合VS2013的x64版本。
【下载软件】解压后我都放到了D盘根目录
1、cmake-3.16.0-rc1-win64-x64.zip,解压直接可用
2、opencv-3.4.8源码文件Sources,解压即可
3、contrib库(下载opencv同版本,注意下边要点击选项卡选版本,别直接下载)
4.1、安装python(参考此链接1、2步),即便纯使用C++,也建议把python装上,深度学习必不可少。
4.2、安装numpy,打开cmd,输入 pip install numpy
【编译步骤】
1、cmake编译opencv源文件,生成OpenCV.sln。
以管理员身份运行D:\cmake-3.16.0-rc1-win64-x64cmake-gui.exe
单击一次Configure后,Search里筛选信息,带test的都不勾选,带java的都不勾选,其他参考上图红字。
留意下是否有BUILD_opencv_python3,如果没有说明此版本的opencv不支持python,如opencv4.2。
多次Configure后,打开D:\1\CMakeDownloadLog.txt,如果里边有https开头的东西,说明有文件下载失败。那么需要自己复制链接到迅雷下载。
定位CMakeDownloadLog.txt中出现copy的地方,把下载的文件放到对应的紧挨着copy的那个目录中,它会自动把文件重命名(MD5码-原名)放到相应的地方的。
如果没有出现copy,那么根据提示如D:/source/opencv-3.4.9/.cache/ippicv/1d222685246896fe089f88b8858e4b2f-ippicv_2019_win_intel64_20180723_general.zip,就把下载的ippicv文件放到它指定的目录,文件名用它指定的。
删掉D:\1\CMakeDownloadLog.txt,再次Configure,查看自动生成的CMakeDownloadLog.txt内容,没有https开头的东西,说明所有文件全部成功。单击Generate。
2、VS打开OpenCV.sln,菜单栏:生成——批生成,勾选下图四个,生成,等待完成即可。
最终编译的结果在自动生成的D:\1\install文件夹中(适用于C++)。把install文件夹中include、x64文件夹拷贝到在D盘新建的文件夹opencv中,其他文件可以统统删除。
之后参考博文一次配置永久使用vs2013配置opencv2.4.13(txt中复制粘贴即可,一次配置永久使用),注意没有build目录了,找自己对应的目录即可。
【python说明】适用于python的文件cv2.cp37-win_amd64.pyd,会自动出现在你安装的python目录中D:\Python\Python37\Lib\site-packages\cv2\python-3.7。
注意会提醒——无法打开文件“python37_d.lib”,debug都会出现此问题,无关紧要,因为成功生成了release版(cmake生成目录D:\1\lib\python3\Release,若*.pyd没有出现在你的python目录中,就自己拷贝过去)。
【实战】https://blog.csdn.net/nnnnnnnnnnnny/article/details/52182091
【可能出现的问题解决方案】
问题都出现在VS编译OpenCV.sln阶段,而且都是quirc.c、quirc.h引起的。
1、如果出现下图inline相关的错误,在解决方案资源管理器中打开quirc.h,在最顶部加入如下代码后,重新第2步。
#if defined(WIN32) && !defined(__cplusplus) #define inline __inline #endif
2、出现size_t(quirc.c中)有关的错误,打开quirc.c(上图箭头下方的Source Files中能找到),把size_t改成如下unsigned long long。重新第2步。
unsigned long long olddim = q->w * q->h; unsigned long long newdim = w * h; unsigned long long min = (olddim < newdim ? olddim : newdim);