OpenCV 学习笔记(1) - Windows系统安装OpenCV
文章目录
本文较为啰嗦,有时间阅读详情的请按顺序阅读,若觉得只想看骨干部分请跳转至 第4节要点总结
1 系统说明
以下安装教程均于Windows OS下完成,OpenCV官网的Tutorials是基于Windows 7 SP1完成,笔者写作此文时,微软已停止维护Windows7系统. 但笔者在Windows10上的安装方式并没有本质区别.
官网提供两种安装方法:1)使用预编译库进行安装;2)使用源代码进行自主编译安装.
其中,使用预编译库进行安装较为简单,但该方法只能在使用最新版的Microsoft Visual Studio开发环境时,才能工作. 不能发挥集成在OpenCV库中的先进功能.
2 使用预编译库进行安装
笔者也比较小白,所以先尝试最简单明了的办法,即使用预编译库文件进行安装.
2.1 前往OpenCV官网下载预编译库文件
在此界面上可以看到目前可以下载的众多版本. 笔者尝了个鲜,下载了最新的版本. opencv-4.5.1
2.2 解压预编译库文件
双击下载得到的exe文件,这是一个.7z格式的自解压文件,解压后得到一个文件夹. 该文件夹包含的就是当前版本的预编译库文件. 作为本机的运行库文件,建议将这个文件路径放置在非系统盘(因为该文件体积较大且没有要求一定要放在系统盘下).
2.3 设置系统的环境变量
设置系统的环境变量也适用于使用源代码编译安装之后的情况。这里出于行文逻辑的考虑将该节置于此处。
官网的环境变量设置说明可能对大多数小白来说有点迷惑,毕竟和我们通过系统控制面板设置环境变量的方式出入很大。这其中其实也只有两个不太熟悉的事物,一个是setx
命令,一个是PathEditor环境变量配置工具。其实我们也完全可以绕过这两个方法,通过系统控制面板的方式来设置环境变量。只不过对于一个想成为极客的小白来说,愿意付出尝试,才是学习的正确姿势。
先来介绍官网的设置方法,首先以管理员权限打开CMD,在命令行中输入以下内容(假设你的OpenCV解压在D:\OpenCV\
路径下):
setx -m OPENCV_DIR D:\OpenCV\Build\x86\vc11 (suggested for Visual Studio 2012 - 32 bit Windows)
setx -m OPENCV_DIR D:\OpenCV\Build\x64\vc11 (suggested for Visual Studio 2012 - 64 bit Windows)
setx -m OPENCV_DIR D:\OpenCV\Build\x86\vc12 (suggested for Visual Studio 2013 - 32 bit Windows)
setx -m OPENCV_DIR D:\OpenCV\Build\x64\vc12 (suggested for Visual Studio 2013 - 64 bit Windows)
setx -m OPENCV_DIR D:\OpenCV\Build\x64\vc14 (suggested for Visual Studio 2015 - 64 bit Windows)
setx -m OPENCV_DIR D:\OpenCV\Build\x64\vc15 (suggested for Visual Studio 2017 - 64 bit Windows)
注意这里的六行代码,只需要根据需要使用其中的一行即可,因为这些指令分别对应的是不同版本的IDE开发工具。笔者尝鲜使用的4.5.1版本包,只支持vc14和vc15,所以要求在配置的系统上至少有预先安装VS2015或VS2017.
这一步用到了setx命令,这一命令的功能是设置一个可扩展的环境变量,在此例中,即以OPENCV_DIR
表示后面的具体路径(如D:\OpenCV\Build\x64\vc15
)。setx命令是Windows系统官方命令,可以在微软的官网上查到详细的说明,详情请看参考文献中的【2】注释。这一命令设置的是一个永久性质的环境变量,如果需要进行更改,则还应通过setx指令来完成,如果需要删除,则需要在控制面板里进行手动删除,而且要注意的是,这个变量如果进行了更改,则需要把使用这个变量的环境变量也进行手动刷新,因为它不会自动更新所有用到它作为扩展变量的环境变量。
我想之所以会使用setx命令进行操作,最重要的一点是这个命令会写入注册表。另外一个好处就是当你更新OpenCV版本的时候,可以直接通过setx命令对这个环境变量进行快速替换。最重要的是,建立起来的环境变量可以让你在设置时少敲很多次路径。
然后我们还需要用一个叫作PathEditor的工具,它是一个环境变量配置工具,可以在参考文献中【3】注释对应的网站进行下载。安装好之后,我们可以看到以下图标:
这个图标看起来像某度的logo,不知道有没有什么关联。
打开这个工具后你会发现,它是一个环境变量配置工具,从界面上看,与控制面板的环境变量配置界面很像,但是多出了一些快速处理的按钮,并且可以对注册表进行快速更改。从这个意义上说这个工具应该会有一些额外的优势。
具体的做法是,在上述界面的上方框里的最后一条右键点击,可以看到Insert New Item
的选项:
点击新增一条记录:%OPENCV_DIR%\bin
这样就把opencv的静态路径表给建好了。
如果你更换了OPENCV库的安装路径,或者你需要使用另一个版本的OPENCV库,则只需要使用setx命令对OPENCV_DIR环境变量进行修改覆盖即可。
2.4 在Microsoft Visual Studio中建立一个OpenCV项目
我们解压的OpenCV库在Microsoft Windows操作系统中,它们在动态链接库(DLL)中。使用动态链接库的优点是,库的所有内容仅在运行时按需加载,并且无数程序可能使用相同的库文件。这意味着,如果你有10个应用程序使用OpenCV库,则无需为其中每个应用程序提供一个版本。当然,你需要在要运行应用程序的所有系统上安装OpenCV的dll。
另一种方法就是使用具有lib扩展的静态库。可以使用源文件构建这些文件,如 Windows 安装教程中所述。使用此选项时,库将内置于exe文件中。因此,由于某种原因,用户不可能删除它们。作为一个缺点,应用程序将更大,并且,在它启动时将需要更多的时间来加载。
使用OPENCV来编译应用,我们需要做两件事情:
-
告诉编译器OpenCV库长得啥样。你需要通过使用头文件来做这件事。
-
需要的时候,告诉链接器哪里能得到OpenCV的数据结构和函数结构。
如果使用 lib 系统,则必须设置库文件的路径,并指定要查找其中一个文件。在生成过程中,链接器将查找这些库,并将所有使用函数和数据结构的定义和实现添加到可执行文件中。
如果使用 DLL 系统,则必须再次指定所有这些,但是现在由于不同的原因。这是微软操作系统特定的东西。似乎链接器需要知道,在DLL的什么地方在运行时搜索数据结构或函数。此信息存储在 lib 文件中。然而,它们不是静态库。它们被称为导入库。这就是为什么当你在 Windows 中创建一些 DLL 时,您最终也会获得一些 lib 扩展库。好消息是,在运行时只需要 DLL。
要将所有这些信息传递给 Visual Studio IDE,您可以全局执行(以便所有未来的项目都将获得此信息)或在本地(因此仅供您当前项目使用)。全局性的优势在于,你只需要做一次;但是,将所有项目与所有这些信息一起进行可能是不可取的。在全局的情况下,你如何做到这一点取决于你使用的VS版本。
Visual Studio 中项目的基本项是一个解决方案(Solution)。解决方案可能包含多个项目(Projects)。项目是应用程序的构建基块。每个项目将实现的东西,你将有一个主要项目,你可以把这个项目拼图。在许多简单的应用程序(如许多教程)的情况下,您不需要将应用程序分解为模块。在这些情况下,您的主项目将是唯一现有的项目。现在,通过浏览Files->New->Project菜单选择,在 Visual 工作室中创建一个新解决方案。选择 Win32 控制台应用程序作为类型。输入其名称并选择创建它的路径。然后在即将到来的对话框中,请确保创建一个空项目。
2.4.1 局部设置方法
每个项目都是与其他项目分开构建的。因此,每个项目都有自己的规则包。在此规则包中存储 IDE 构建项目所需的所有信息。对于任何应用程序,至少有两种生成模式:一种是发布模式(Release),另一种是"调试模式"(Debug)。调试有许多功能存在,因此您可以在应用程序中查找和解决更简单的 Bug。相比之下,版本是一个优化的版本,其目标是使应用程序尽可能快地运行或尽可能小。您可能会认为这些模式还需要在生成期间使用不同的规则。因此,每种生成模式都有不同的规则包。这些规则包在 IDE 中作为项目属性调用,您可以使用属性管理器查看和修改它们。您可以使用View -> Project Pages(对于 2013 年以后的 Visual Studio,请转到View -> Other Windows -> Property Manager)。展开它,您可以看到现有的规则包(称为属性表Property Sheets)。
这些真正有用的东西是,你可以创建一个规则包一次,你以后可以只是把它添加到你的新项目。创建一次,以后再重用。我们希望创建一个新的属性表,其中包含编译器和链接器需要知道的所有规则。当然,我们需要一个单独的调试和发布版本。从调试开始,如下图所示,右键“添加新项目属性表”:
例如,使用OpenCV_Debug名称。然后通过选择工作表右键单击->属性。在下面的章节中,我将展示在本地设置 OpenCV 规则,因为我觉得没有必要用“我不使用它的自定义规则”污染项目。转到C++常规条目,并在 * “附加包含目录”* 下将路径添加到 OpenCV include中。如果没有 *“C/C++”*组,应向项目中添加.c.cpp/文件。
$(OPENCV_DIR)\..\..\include
可以看到,这里方便地使用了前面设置好的环境变量值。
接下来一步,转向链接器 -> 常规 -> 附加库目录,添加链接库文件的路径
在“附加库目录”里添加以下:
$(OPENCV_DIR)\lib
在 链接器 -> 输入 -> 附加依赖项中添加:
opencv_world451d.lib
感谢opencv升级后的简化,如果是支持vc14以下的版本,需要添加如下:
opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videoio300d.lib
opencv_videostab300d.lib
库文件的命名格式是
opencv_(模块名)(版本号)d.lib
d 表示的是debug版本,表示这些是调试所需的库。现在单击"确定"以保存发布规则部分中的新属性并完成相同的操作。请确保省略库名称中的 d 字母,并保存属性表,上面带有保存图标。
OpenCV官方建议把这些属性表文件保存到特定的路径下面:
当你需要新建一个OpenCV项目时,则可以直接把这些属性表添加到项目中去,这样省去了重复建立属性表的问题。
2.4.2 全局设置方法
如果你觉得每次都需要添加属性表是一件很麻烦的事情,那么还有一种全局的设置方法将opencv库添加到所有的vs项目环境中,如下所示,可以在刚才建立的项目中找到一张表:
这张表就是全局属性表,全局属性表里在通用属性->VC++目录->包含目录里加入OPENCV_DIR变量.(但我没这么加,下图你也能看到,因为我并不想所有的项目都采用这种懒人设置方法)
2.5 一个hello world
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
if (argc != 2)
{
cout << " Usage: " << argv[0] << " ImageToLoadAndDisplay" << endl;
return -1;
}
Mat image;
image = imread(argv[1], IMREAD_COLOR); // Read the file
if (image.empty()) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl;
return -1;
}
namedWindow("Display window", WINDOW_AUTOSIZE); // Create a window for display.
imshow("Display window", image); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
注意此程序需要一个输入参数,即打开图像的地址,可以直接在命令行中使用命令方式运行,或者在VS中设置函数的输入参数
运行后的结果:
3 要点总结
OK,以上就是我们采用已编译好的安装包来配置OPENCV开发环境的一些内容,要点总结如下:
- 下载并解压安装包
- setx命令设置环境变量作为OpenCV库路径的缩写
- 使用PathEditor设置环境变量(或者直接控制面板里设置)
- 建立OpenCV项目,在项目中设置属性表,通过环境变量可以快速设置
4 参考文献
【1】OpenCV官网Tutorials之如何在Windows下安装OpenCV
【3】PathEditor下载
【4】如何在Visual Studio中建立一个OpenCV项目
5 其他
Windows系统安装OPENCV还有一种方式是自己编译OPENCV库,需要自行下载gitbash和CMAKE工具,或通过源码,再行编译。这一部分内容也尝试踩坑,但是目前失败。失败的原因分析了一下,可能是编译时相应的版本需要相应的依赖环境。(笔者尝试时所用的环境中python已被升级到3.9版本,因此在编译库文件时总是会涉及到python版本错误,不知道这块是否对最后的失败构成了影响,总之是没有成功)此内容有待进一步尝试,特此说明。
严格意义上说,采用自己编译的库的好处是,当新版本发布时,只需要重新编译,并重新配置环境变量即可。是一种比较geek的方法。笔者迟早还会再进行尝试,如果成功的话会再更新成博客作为本系列文章的补充。