编译OpenCV——Windows平台,适应VS版本

其他平台参考:编译OpenCV——jetson嵌入式平台 - 夕西行 - 博客园

 

使用CMake来编译OpenCV,以匹配自己使用的VS版本。

主要有两步:

  1. CMake编译OpenCV源码得到OpenCV.sln工程文件。
  2. 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);

 

posted @ 2019-11-13 12:20  夕西行  阅读(13971)  评论(10编辑  收藏  举报