您当前所在位置:首页安装教程「计算机视觉算法实战系列」2.OpenCV入门(上)

「计算机视觉算法实战系列」2.OpenCV入门(上)

更新:2023-08-09 09:43:48编辑:tooool归类:安装教程人气:62

来源 | Hands-On Algorithms for Computer Vision

「计算机视觉算法实战系列」2.OpenCV入门(上)

作者 | Amin Ahmadi

翻译 | sunshine

校对 | gongyouliu

编辑 | auroral-L

全文共5346字,预计阅读时间35分钟。

第二章 OpenCV 入门

1. 技术要求

2. OpenCV 概论

2.1 OpenCV 中的主要模块

3. 下载和创建/安装 OpenCV

4. 使用 OpenCV 与 C++ 或者 Python

在上一章「计算机视觉导论」中,我们介绍了计算机视觉,并举例说明了广泛使用计算机视觉改进服务和产品的行业。然后,我们学习了这个领域中最基本的概念,比如图像和像素。我们学习了颜色空间,并在本章结束时简要讨论了计算机视觉库和框架。我们将继续从上一节开始,向你介绍一个功能最强大、应用最广泛的计算机视觉库,叫做OpenCV。

OpenCV是用于构建跨平台计算机视觉应用程序的类、函数、模块和其他相关资源的巨大集合。在本章中,我们将学习OpenCV的结构、它包含的模块及其用途,以及它支持的编程语言。我们将学习如何获得以及在何处获得OpenCV,并简要介绍可以用来构建应用程序的工具。然后,我们将学习如何使用CMake的强大功能轻松创建使用OpenCV的项目。即使这意味着我们的重点将集中在C++类和函数上,我们也将在任何必要的地方介绍它们的Python实现方法,以便熟悉这两种语言的开发人员可以遵循本章中提出的主题。

在学习了使用OpenCV库的初始阶段之后,我们将继续学习Mat类。我们将看到上一章中介绍的关于图像的所有概念是如何嵌入到OpenCV中Mat类的结构中的。我们还将讨论与Mat类兼容(或密切相关)的各种其他类。OpenCV在函数中处理输入和输出参数的方法是一个非常重要的主题,我们将在本章后面的章节中介绍。最后,我们将学习如何使用OpenCV在计算机视觉应用程序中应用输入、处理和输出三个步骤。这需要学习如何使用OpenCV访问(并写入)图像和视频文件。

本章与前面的介绍性章节相同,将通过实际操作和实例来阐述学习计算机视觉算法的基础。

在本章中,我们将了解以下内容:

√ 什么是OpenCV,从哪里获得它,以及如何使用它?

√ 如何使用CMake创建OpenCV项目?

√ 了解Mat类以及如何使用它访问像素

√ 如何使用Mat、Matx和UMat类?

√ 如何使用imread和imwrite函数读写图像?

√ 如何使用VideoCapture和VideoWriter类读写视频?

√ 如何从网络访问摄像头和视频源(使用实时流协议(RTSP))?

1. 技术要求:

√ 微软Visual Studio、XCode或任何可以用来开发C++的IDE程序

√ Visual Studio代码或任何其他可用于编辑CMake文件的代码编辑器,Python源文件等

√ Python 3.X版

√ CMake 3.X版

√ OpenCV 3.X版

最好尝试使用最新版本的技术和软件。本书所涉及的主题,以及一般的计算机视觉都都应该用最新的技术和软件。所以一定要下载并安装上述软件的最新版本。

必要时,将提供一组简短的安装和配置说明。你可以使用以下URL下载本章的源代码和示例:https://github.com/PacktPublishing/Hands-On-Algorithms-for-Computer-Vision/tree/master/Chapter02

2. OpenCV简介

OpenCV或开源计算机视觉是一组库、工具和模块,其中包含构建计算机视觉应用程序所需的类和函数。OpenCV库被世界各地的计算机视觉开发人员下载了数百万次,速度很快,经过优化,可用于实际项目(包括商业项目)。在撰写本书时,OpenCV的最新版本是3.4.1,这也是我们将在本书的所有示例中使用的版本。OpenCV支持C/C++、Python和java语言,它可以用于构建桌面和移动操作系统的计算机视觉应用程序,包括Windows、Linux、MacOS、Android和iOS。

需要注意的是,OpenCV库和OpenCV框架都是用来指代OpenCV的,在计算机视觉社区中,这些术语大多数时候是可以互换使用的。出于同样的原因,我们也将在本书中互换使用这些术语。然而,严格地说,框架通常是指为实现一个共同目标而工作的一组相关的库和工具,比如OpenCV。

OpenCV由以下两种类型的模块组成:

√ 主要模块:默认情况下,这些模块包含在OpenCV发行版中,它们包含所有核心OpenCV功能,以及用于图像处理任务、过滤、转换和我们将在本节中讨论的更多功能的模块。

√ 额外模块:这些模块包括所有默认情况下未包含在OpenCV库中的OpenCV功能,它们主要包括其他与计算机视觉相关的功能。例如,额外的模块包括用于文本识别的库和非自由特征检测器。请注意,我们的重点将放在主模块上,并涵盖其中所包含的功能,但是,在可能有帮助的地方,我们还将尝试参考额外模块中的可能选项,供你自己研究。

2.1 OpenCV的主要模块

如前所述,OpenCV包含了许多主要模块,这些模块包含了它的所有核心和默认功能。以下是这些模块的列表:

√ core:包含所有核心OpenCV功能。例如,所有基本的结构,包括Mat类(稍后我们将详细了解)和矩阵运算是嵌入到这个模块中的一些功能。

√ imgproc:这个模块包含所有的图像处理功能,比如过滤、变换和直方图。

√ imgcodecs:该模块包括用于读取和编辑图像的函数。

√ videoio:这与imgcodecs模块类似,顾名思义,这个模块用于处理视频。

√ highgui:这个模块,我们将在本书中广泛使用,包含用于显示结果和创建GUI的所有功能。注意,尽管highgui模块对于这本书和学习有关计算机视觉算法、可视化结果足够了,但是它仍然不适用于全面的应用。参考本章末尾的进一步阅读部分,那里提供了更多关于适用于全面的计算机视觉应用程序的GUI创建工具。

√ video:包含OpenCV的视频分析功能,如运动检测和跟踪,卡尔曼滤波,和臭名昭著的凸轮移动算法(用于对象跟踪)。

√ calib3d:该模块包括校准和三维重建功能。该模块功能的一个众所周知的例子是两个图像之间的转换。支持的关键点检测和描述符提取算法包含在本模块中。我们将在接下来的章节中学习,本模块包含一些最广泛使用的对象检测和分类算法。

√ features2d:本模块包括支持的关键点检测和描述符提取算法。本模块还包含一些我们将在接下来的章节中要学习的、最广泛使用的对象检测和分类算法。

√ objdetect:顾名思义,这个模块使用OpenCV进行目标检测。我们将在这本书的最后几章中了解本模块中包含的功能。

√ dnn:与objdetect模块类似,这个模块也用于对象检测和分类目的等。dnn模块相对简单,在OpenCV的主要模块列表中是新的,它包含了与深度学习相关的能力。

Ø ml:这个机器学习模块包含用于处理分类和回归的类和函数。简单地说,所有严格的机器学习相关功能都包含在本模块中。

Ø flann:这是OpenCV与近似近邻快速库(flann)的接口。FLANN包含一系列优化算法,用于处理大数据集中高维特征的最近邻搜索。这里提到的算法主要与其他模块中的算法结合使用,例如feature2d。

Ø photo:一个与摄影相关的计算机视觉的有趣模块,它包含用于处理任务的类和函数,例如去噪、HDR成像和使用其邻域恢复照片中的区域。

Ø stitching:这个模块包含用于图像拼接的类和函数。请注意,缝合本身是一项非常复杂的任务,它需要用于旋转估计和图像扭曲的函数,所有这些也是这个非常有趣的OpenCV模块的一部分。

Ø shape:本模块用于处理形状变换、匹配和与距离相关的主题。

Ø superres:属于分辨率增强范畴的算法,包含在超分辨率模块中。

Ø videostab:此模块包含用于视频稳定的算法。

Ø viz:又称为3D可视化器模块,它包含用于处理在3D可视化窗口上显示小部件的类和函数。本模块不属于本书讨论的主题,但我们会提到它。

除了我们刚才介绍的模块外,OpenCV还包含许多基于CUDA(Nvidia创建的API)的主要模块。这些模块的名称很容易区分,它们以cuda这个词开头。由于这些模块的可用性完全取决于特定类型的硬件,而且这些模块中的几乎所有功能都以某种方式被其他模块覆盖,因此我们现在将跳过它们。但值得注意的是,使用OpenCV cuda模块可以显著提高应用程序的性能,前提是你需要的算法在这些模块中实现,并且你的硬件满足它们的最低要求。

3. 下载并构建/安装OpenCV

OpenCV在很大程度上没有一个预构建的即用版本(我们将在本节中介绍一些例外情况),与大多数开放源码库类似,它需要从源代码进行配置和构建。在本节中,我们将快速描述如何在计算机上构建(和安装)OpenCV。但是首先,你需要在你的计算机上获得OpenCV源代码。你可以使用以下链接进行此操作:https://opencv.org/releases.html

在这个页面上,你可以找到OpenCV的发布版本。在写这本书的时候,最新的版本是3.4.1,所以你应该下载它,或者如果有更高的版本,那就下载最新版本。

如以下屏幕截图所示,对于每个版本的OpenCV版本,都有各种可下载的条目,如Win、iOS和Android软件包,但你应该下载源代码并根据你想要使用的平台自行构建OpenCV:

默认情况下,OpenCV3.4.1提供Android、iOS和64位MSVC14和MSVC15(与微软Visual C++ 2015和微软Visual C++ 2017)库的预构建版本。因此,如果你想为这些平台中的任何一个构建应用程序,你可以下载相关包并完全跳过OpenCV构建过程。

要从源代码构建OpenCV,你的计算机上需要以下工具:

Ø C/C++编译器,用C++ 11支持:在Windows上,这意味着最新的微软Visual C++编译器,如MSVC15(2017)或MSVC14(2015)。在Linux操作系统上,可以使用最新的GCC,在macOS上,可以使用包含所有必需工具的XCode命令行工具。

Ø CMake:尽管可以使用cmake3.1和更早版本,但为了安全起见,请确保使用最新版本的CMake,如3.10。

Ø Python:如果你打算使用Python编程语言,这是特别重要的。

OpenCV包含大量的工具和库,可以用许多不同的方式自定义你的构建。例如,你可以使用Qt框架、英特尔线程构建块(TBB)、英特尔集成性能原件(IPP)和其他第三方库来进一步增强和自定义OpenCV构建,但由于我们将使用带有默认设置和工具集的OpenCV,我们忽略了需求列表中前面提到的第三方工具。

在获得了我们刚才提到的所有先决条件之后,你可以使用CMake和相应的编译器来配置和构建OpenCV,具体取决于你的操作系统和所需的平台。

下面的屏幕截图显示了一组默认配置可见的CMake工具。通常,你不需要对配置进行任何更改,除非你希望将自己的自定义设置应用于OpenCV构建:

请注意,当CMake第一次打开时,你需要设置在前面的屏幕截图中可见的source和build文件夹,分别设置为source code和Where to build the binaries。点击Configure按钮后,需要设置生成器并应用设置,然后按Generate。

生成后,你只需使用终端或命令提示符切换到CMake output文件夹,然后执行以下命令:

makemakeinstall

请注意,根据计算机的速度和配置,运行这些命令可能需要一些时间。另外,make命令可能会有所不同,具体取决于要使用的工具集。例如,如果你使用的是Microsoft Visual Studio,则需要用nmake替换make,或者如果你使用的是MinGW,则必须用mingw32 make替换make。

构建过程完成后,可以开始使用OpenCV。唯一需要注意的是配置C++项目,以便他们可以使用OpenCV库。

在Windows操作系统上,你需要确保正在构建的应用程序可以访问OpenCV DLL文件。这可以通过将所有必需的DLL复制到正在构建应用程序的同一文件夹中来实现,也可以通过将OpenCV DLL文件的路径添加到path环境变量中来实现。请确保在继续下一步前处理好这一点,否则即使它们可能成功构建并且在编译时不会报告任何问题,但是应用程序在执行时依然会崩溃。

如果你打算使用Python构建计算机视觉应用程序,那么事情将非常简单,因为你可以使用pip(软件包管理器)安装OpenCV for Python,使用以下命令:

pipinstall opencv-python

这将自动为你获取最新的OpenCV版本及其所有依赖项(如NumPy),或者,如果你已经安装了OpenCV,则可以使用以下命令确保已将其升级到最新版本:

pipinstall--upgrade opencv-python

当然,你需要连接互联网,这些命令才能工作。

4. 使用C++或Python的OpenCV

在本节中,我们将演示如何在C++或Python项目中使用OpenCV,我们将调用一个非常简单的示例,我们将调用HeloLoCencv。你可能已经知道,这样一个项目的目的是:

Ø 开始使用以前从未使用过的新库,如OpenCV

Ø 确保OpenCV安装正常工作

因此,即使你不是一个OpenCV初学者,仍然值得阅读以下说明并运行本节中的简单示例来测试你的OpenCV构建或安装。

我们将从C++项目中使用OpenCV的步骤开始:

1. 创建一个名为HelloOpenCV的新文件夹

2. 在此文件夹中创建两个新文本文件,并将它们命名为CMakeLists.txt和main.cpp

3. 确保CMakeLists.txt文件包含以下内容:

cmake_minimum_required(VERSION 3.1) 


project(HelloOpenCV)set(OpenCV_DIR"path_to_opencv") 
find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS})  


add_executable(${PROJECT_NAME}"main.cpp") 


target_link_libraries(${PROJECT_NAME}${OpenCV_LIBS})

在前面的代码中,你需要将路径path _to_opencv替换为用包含OpenCVConfig.cmake和OpenCVConfig-version.cmake文件的文件夹,该文件夹与你安装opencv库的文件夹相同。如果你使用的是Linux操作系统和预构建的OpenCV库,那么你可能不需要OpenCV文件夹的确切路径。

4、 对于Me.CPP文件,确保它包含以下内容,这是我们要运行的实际C++代码:

includeincludeusingnamespacestd;usingnamespacecv;intmain(){
Mat image = imread("MyImage.png");if(!image.empty())
{
imshow("image", image);
waitKey();
}else{cout<<"Empty image!"<<endl;
}return0;
}

在本章和接下来的章节中,我们将单独讨论前面代码中使用的函数,但是现在需要注意的是,这个程序正在尝试打开并显示保存在磁盘上的图像。如果成功,则图像将一直显示到按任意键为止,否则将显示Empty image!字符串。注意,在正常情况下,这个程序不应该崩溃,它应该成功地构建。因此,如果你在操作时发现程序崩溃,那么你需要浏览本章前面讨论的内容。

5、我们的C++项目已经准备好了。现在,我们可以使用CMake生成visualstudio或任何其他类型的项目(取决于我们要使用的平台、编译器和IDE),然后构建和运行它。请注意,CMake只是用来确保跨平台和IDE独立C++项目被创建。

通过运行这个示例项目,你的输入图像(在本例中是MyImage.png)将被读取和显示,直到按下键盘上的任何键。如果在读取图像的过程中出现任何问题,将会显示空图像。

我们可以使用以下代码在Python中创建和运行相同的项目:

importcv2
image = cv2.imread("MyImage.png")ifimageisnotNone:
cv2.imshow("image", image)
cv2.waitKey()else:
print("Empty image!")

这里的相似之处是很明显的。在相同代码的Python版本中也使用了完全相同的imshow和waitKey函数。正如前面提到的,现在不要费心的去想使用任何函数的精确方法,只要专注于确保你能够运行这些程序,无论是C++还是Python,或者两者都可以,并且你能看到显示的图像。

如果你能够在本节中成功地运行HelloOpenCV示例项目,那么你就可以毫无问题地学习本章的下一节和本书的下一章了。如果你在目前讨论的主题上仍然面临问题,或者你觉得你需要对这些主题有更深入的理解,你可以从本章开始再看一遍,或者你可以参考本章结尾的进一步阅读部分中提到的其他书籍。

我告诉你msdn版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

Windows10提示“无线适配器或访问点有问题”如何处理 StatCounter最新数据:Win10桌面版所占份额已超20%

游客 回复需填写必要信息