在Windows10平台上,有时候只是想利用OpenCV完成一些小功能,或者测验其中某些函数。基于这个目的来说安装VisualStudio 显得过于庞大。 选用一些轻量级的代码编辑器更为合适,比如VSCode,其实sublime,notepad也可以,本文以VSCode为主。
Windows10
Visual Studio Code
- 1.44.2
openCV
- 3.3.0
MinGw
- 8.1.0(Posix)
CMake
- 3.17
1.安装/配置VSCode
官方下载地址:https://code.visualstudio.com/
安装完之后,在左边的功能栏,点击插件按钮,搜索并安装 C/C++ 插件。
实际上还需要编辑 task.json 和 c_cpp_properties.json这两个与工程编译相关的文件,下面的步骤我们再讲。
2.安装OpenCV
官方网址:https://opencv.org
官方提供了从openCV2.0---4.3.0的各种版本,我选择的是windows平台上的openCV3.3.0,因为这和我们公司内网服务器上的openCV版本是一样的。
下载完之后,打开。看上去是个.exe结尾的可执行文件,实际上双击之后的过程就是解压而已。
注意:不要把解压后的文件夹放在有空格的路径下,这样后面可能会出问题;也最好不要放在C盘。
解压完之后,你会发现有两个目录:
一个是source文件夹:这个是opencv C++源代码;
一个是build文件夹 : 这是官方根据源码编译好的动态链接库。
我看网上很多教程在配置VSCode和OpenCV的时候,都是把build文件夹内的东西当作动态链接库添加到系统路径,然而我试了N次,换了四五个openCV版本,都会报错,大部分都是提示 调用到的opencv的函数存在未定义的引用。
后来我换了思路,自己用CMake编译 source路径下的源代码,来手动生成动态链接库。
所以,下面一步是安装并配置MinGW和CMake。
3.安装MinGW(编译器)
MinGW,是Minimalist GNUfor Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。
下载地址:MinGW-w64
:https://sourceforge.net/projects/mingw-w64/files/
在这个下载页面可以看到很多MinGW的版本,下划
拉选择x86_64-posix-seh
(64位系统适用,32位请选择i686-posix-sjlj
),版本建议选择MinGW-W64 GCC-8.1.0
,不要太往前,C++的一些新特性在旧的编译器里可能不适用,导致编译的时候会报错。之所以选择posix版本,看到有博客说win32版本在编译或者运行的时候可能会有问题。
下载完之后,实际上是个压缩包,把压缩到解压到你想存放的路径上去,但是注意:不要存放在绝对路径名含空格的路径上,比如D:/program files/ 这样的路径, 否则后面编译/运行的时候会发生问题。
然后把 mingw64下bin文件夹的绝对路径添加系统环境变量中去。比如,mingw64解压后你存放在D:/下,那么bin文件夹的绝对路径就是D:/mingw64/bin 。
环境变量添加方法:右击桌面上 我的电脑 图标,选择 属性,然后点击左侧的 高级系统属性,在弹出框的右下方点击环境变量,然后单击选中PATH,点击 编辑--->新建,把对应的 bin目录的绝对路径添加进去。
至此,mingw就安装配置完了。 你可以在PowerShell或者CMD里输入命令 gcc -v。 如果显示结果如下图,则说明mingw配置成功。
4.安装CMake
首先下载CMake官网下载地址:https://cmake.org/download/
选择合适的版本进行下载,我的笔记本是64位系统,选择了 cmake-3.17.2-win64-x64.msi 。
下载完毕之后,双击进行安装,安装路径自己选择,值得注意的是:建议依然不要选择含有中文和空格的路径。
安装过程:双击打开 ----> 点击Next ----> 勾选“I accept this terms...",点击next ----> 选择"Add cmake to the system path for all users",勾选Create CMake desktop icon,点击 Next ----> 选择安装路径(不要放在含有空格和中文的路径下),Next ----> Install,等待安装完毕。
到此CMake3.17.2 安装工作就以完成。 因为在安装过程中选择了自动添加环境,所以安装完后不用手动添加环境了。可以打开PowerShell或者CMD,输入命令'CMake' ,若出现以下类似信息,则说明安装成功。
若没有出现如上的信息,请尝试重启电脑再试。
准备工作已经完成,开始手动编译OpenCV 3.3.0。
1.先建一个文件夹用于存放编译后的文件。 我是把目录放在 opencv/build/x64下的,新建的文件名位为mingw。
2.双击桌面CMake图标,打开CMake。
在第一行:Whers is the source code :选择 opencv/source的存放路径。
在第二行:Whers to build the binaries: 选择你刚刚新建的,用于存放编译后文件的路径。
然后点击左下方的 Configure.
3.最对话框中的下拉列表,选择:MinGW Makefiles ,并且勾选Specify native compilers.
点击Next,在新弹出的对话框中,C和C++分别选择 gcc.exe和g++.exe。
4.设置完毕点击 Finish,耐心等待进度条读完,直到输出窗口看到 Configuring done。
在搜索框中, 输入world,勾选BUILD_OPENCV_WORLD。这个选项是指编译动态链接库的时候,把所有的动态链接库都编译到 一个链接库中去,这样在后面我们编译 包含调用到opencv的代码的时候,只需要链接这一个动态链接库。PS:当然,你也可以不勾选这个,只不过这样的话,在编译运行调用了opencv接口的代码的时候,可能需要指定多个动态链接库,因为opencv不同类型的接口是包含在不同的动态链接库中的。
然后情况搜索框内容,再次点击configure, 红色全部消失的时候,点击 Generate, 等待进度条读完,出现Generating Done。
至此,编译opencv的Makefile文件就生成了。 你可以在你新建的目录下,看到生成的Makefile文件。
5.开始编译。 进入到你刚刚新建的文件,按住shift,同时右击空白处,选择 "在此处打开PowerShell窗口",输入命令 :
mingw32-cmake // 单线程编译,较慢
mingw32-cmake -j4 // 4线程编译,后边的数字根据你自己电脑的配置来指定
提醒:有的博主说使用多线程编译opencv会出现问题而且报错不明确,但我没遇到过。
不过如果你时间不是很着急,可以使用单线程编译。
如果一切顺利的话,大概30分钟左右可以编译完成。
6.编译完成之后,在PowerShell / CMD窗口继续输入安装命令:
mingw32-cmake install
最后把编出来的 bin/ 文件夹的绝对路径添加到环境变量中去。
至此,opencv就已经全部完成编译和安装了。
然而,常常在第5步编译的时候,会报各种各样的错误。在这里,我把我编译过程中遇到的错误和剞劂办法,列举如下:
1.sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA 错误 表现如下:
...opencv/sources/modules/videoio/src/cap_dshow.cpp...
... 'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA' was not declared in this scope ...
解决方法:修改cap_dshow.cpp文件,以我的路径为例: D:\opencv\sources\modules\videoio\src\cap_dshow.cpp
文件,
在#include "DShow.h"
这行的上面加上 #define NO_DSHOW_STRSAFE 和
#define STRSAFE_NO_DEPRECATE,如下图所示:
2. cmath:1157:11: error: '::hypot' has not been declared
看源码可以看出导致问题出现的原因是:hypot
被某段代码重命名为了 _hypot,致使
cmath 调用 hypot 的时候无法找到
。
解决方法:
修改Python.h的源码,在它的开头加上: #include "math.h"。
参考博客: https://blog.csdn.net/a3335581/article/details/68583030
3. MinGW编译OpenCV到 vs_version.rc.obj处出错
具体表现如下:
modules/core/CMakeFiles/opencv_core.dir/build.make:1642: recipe for target `modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj' failed
make[2]: *** [modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1
CMakeFiles/Makefile2:1512: recipe for target `modules/core/CMakeFiles/opencv_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
Makefile:162: recipe for target `all' failed
make: *** [all] Error 2
解决方法:
1.检查自己的mingw是否安装在了一个路径中含有空格或者中文的路径下,如果是,需要把mingw目录放到一个不含空格和中文的路径下,并且重新配置其环境变量。
2.如果不是 上面这个原因,请参考博客:https://www.jianshu.com/p/3c4b1af3837f
参考资料:
OpenCV使用CMake和MinGW的编译安装及其在Qt配置运行_人工智能_辉哈-CSDN博客 https://blog.csdn.net/huihut/article/details/78701814
(一)MinGW-w64编译OpenCV-3.4.5 - 简书 https://www.jianshu.com/p/4e1f1edabfda
将 VSCode 打造成 OpenCV 的 IDE(C++,window10 1803)_人工智能_zhaiax672的博客-CSDN博客 https://blog.csdn.net/zhaiax672/article/details/88971248
【原创】cmath:1157:11: error: ::hypot has not been declared_Python_a3335581的博客-CSDN博客 https://blog.csdn.net/a3335581/article/details/68583030
Python写C/C++扩展时,编译报错:error: ::hypot has not been declared_python_limingaoyu的博客-CSDN博客 https://blog.csdn.net/limingaoyu/article/details/101424262