OpenCV
【🔧更新中🔧】基于 Qt 和 OpenCV 的计算机视觉示例实现及教程
Install / Use
/learn @nekosilverfox/OpenCVREADME
[toc]
如果你不了解 Qt 这个框架,建议先学习:
关于 Qt 无比详细教程及案例实现:https://github.com/NekoSilverFox/Qt 其中不仅涵盖了 Qt 基本控件的使用及讲解,还包含了大学和培训机构不会讲到的:插件设计及实现、基于 QTest 的静态动态、动态测试、CI/CD的使用、Qt 函数/方法注意事项等
如果你对 OpenGL 计算机图形学感兴趣:
- 基于 Qt & OpenGL 的案例实现及详细教程:[https://github.com/NekoSilverFox/OpenGL](https://github.com/NekoSilverFox/OpenGL
前言
参考:
原文:Computer Vision with OpenCV 3 and Qt5
https://github.com/apachecn/apachecn-cv-zh/blob/0f2e14ca582d398ba3be22a1fff949077f4c85c0/docs/cv-opencv3-qt5
原文:Qt 5 and OpenCV 4 Computer Vision Projects
https://github.com/apachecn/apachecn-cv-zh/tree/0f2e14ca582d398ba3be22a1fff949077f4c85c0/docs/qt5-opencv4-cv-proj
只要环顾四周,就很可能会看到至少两个不同的设备,例如计算机,智能手机,智能手表或平板电脑,上面运行着一些应用,可以帮助您完成各种日常任务或娱乐音乐,看电影 ,视频游戏等。 每年,市场上都会引入数百种新设备,并且需要新版本的操作系统来跟上它们,以便为应用开发人员提供更好的界面,以创建可更好地利用诸如高分辨率等基础资源的软件。 显示器,各种传感器等。 结果,软件开发框架必须适应并支持不断增长的平台。 考虑到这一点,Qt 可能是同时提供功能,速度,灵活性和易用性的最成功的跨平台软件开发框架之一,在创建需要以下功能的软件时,它是首选。 在各种平台上都具有吸引力和一致性。
近年来,特别是随着功能更强大的处理器以较低的价格出现,台式计算机及其手持式对等设备的角色已转向执行更苛刻和更复杂的任务,例如计算机视觉。 无论是用于智能电影或照片编辑,保护敏感建筑物,对生产线中的物体计数,还是通过自动驾驶汽车检测交通标志,车道或行人,计算机视觉正越来越多地用于解决此类实时问题。 曾经只能由人类解决的问题。 这是 OpenCV 框架进入现场的地方。 在过去的几年中,OpenCV 已成长为功能完善的跨平台计算机视觉框架,其重点是速度和性能。 在世界各地,开发人员和研究人员都在使用 OpenCV 来实现其计算机视觉应用的思想和算法。
本书旨在帮助您掌握 Qt 和 OpenCV 框架的基本概念,使您轻松地自己继续开发和交付跨多种平台的计算机视觉应用。 能够轻松遵循本书所涵盖主题的唯一假设是,您熟悉并熟悉 C++ 编程概念,例如类,模板,继承等。 即使整本书中涵盖的教程,屏幕截图和示例都是基于 Windows 操作系统的,但仍会在必要时提及 MacOS 和 Linux 操作系统的区别。
这本书是给谁的
本书面向有兴趣构建计算机视觉应用的读者。 期望具备 C++ 编程的中级知识。 即使没有 Qt5 和 OpenCV 3 知识,但如果您熟悉这些框架,您也会受益
本书涵盖的内容
-
第1章,OpenCV和Qt简介 介绍了所有必要的初始化步骤。从在哪里以及如何获取Qt和OpenCV框架开始,本章将描述如何安装、配置,以及确保你的开发环境设置正确。
-
第2章,创建我们的第一个Qt和OpenCV项目 带领你通过Qt Creator IDE,我们将使用它开发我们所有的应用程序。在本章中,你将学习如何创建和运行你的应用程序项目。
-
第3章,创建一个全面的Qt+OpenCV项目 通过最常见的功能需求,为一个全面的应用程序,包括样式、国际化、支持各种语言、插件等。通过这个过程,我们将自己创建一个全面的计算机视觉应用程序。
-
第4章,Mat和QImage 奠定基础并教你编写计算机视觉应用程序所需的基本概念。在这一章中,你将了解所有关于OpenCV Mat类和Qt QImage类,如何在两个框架之间转换和传递它们,以及更多。
-
第5章,图形视图框架 教你如何使用Qt Graphics View框架及其底层类,以便在应用程序中轻松高效地显示和操作图形。
-
第6章,OpenCV中的图像处理 带你了解OpenCV框架提供的图像处理功能。你将学习关于变换、过滤器、颜色空间、模板匹配等。
-
第7章,特征和描述符 全面讲解从图像中检测关键点,从关键点提取描述符,并将它们相互匹配。在本章中,你将学习各种关键点和描述符提取算法,并使用它们来检测和定位图像中的已知对象。
-
第8章,多线程 教你Qt框架提供的所有关于多线程的能力。你将学习关于互斥锁、读写锁、信号量和各种线程同步工具。这章还会教你关于Qt中低级(QThread)和高级(QtConcurrent)多线程技术。
-
第9章,视频分析 覆盖了使用Qt和OpenCV框架正确处理视频的方法。你将学习使用MeanShift和CAMShift算法进行对象跟踪等视频处理功能。本章还包括视频处理的所有基本和必要概念的综合概述,如直方图和反向投影图像。
-
第10章,调试和测试 带你了解Qt Creator IDE的调试功能,以及它是如何配置和设置的。在本章中,你还将学习Qt框架提供的单元测试能力,通过编写示例单元测试,这些测试可以手动或每次项目构建时自动运行。
-
第11章,链接和部署 教你动态或静态地构建OpenCV和Qt框架。在这一章中,你还将学习在各种平台上部署Qt和OpenCV应用程序。在本章的最后,我们将使用Qt Installer Framework创建一个安装程序。
-
第12章,Qt Quick应用程序 介绍你Qt Quick应用程序和QML语言。在本章中,你将学习QML语言语法,以及如何与Qt Quick Designer一起使用它来为桌面和移动平台创建漂亮的Qt Quick应用程序。你还将学习在本章中整合QML和C++。
为了充分利用本书
尽管书的初章已经涵盖了每一个所需的工具和软件、正确的版本,以及它们是如何被安装和配置的,以下是一个可以作为快速参考的列表:
- 一台安装了最新版本Windows、macOS或Linux(例如Ubuntu)操作系统的常规计算机。
- 微软Visual Studio(在Windows上)
- Xcode(在macOS上)
- CMake
- Qt框架
- OpenCV框架
下载示例代码文件
你可以从你在www.packtpub.com的账户下载本书的示例代码文件。如果你是在别处购买的这本书,你可以访问www.packtpub.com/support并注册,以直接将文件通过电子邮件发送给你。 你可以按照以下步骤下载代码文件:
- 在www.packtpub.com登录或注册。
- 选择SUPPORT标签。
- 点击Code Downloads & Errata。
- 在搜索框中输入书名并按照屏幕上的指示操作。
一旦文件下载完成,请确保你使用最新版本的以下软件解压或提取文件夹:
- 对于Windows,使用WinRAR/7-Zip
- 对于Mac,使用Zipeg/iZip/UnRarX
- 对于Linux,使用7-Zip/PeaZip
本书的代码包也托管在GitHub上 https://github.com/PacktPublishing/Computer-Vision-with-OpenCV-3-and-Qt5。我们也在https://github.com/PacktPublishing/ 上提供了我们丰富的图书和视频目录中的其他代码包。去看看吧!
下载彩色图片
我们还提供了一个PDF文件,其中包含了本书使用的截图/图表的彩色图片。你可以在这里下载它:https://www.packtpub.com/sites/default/files/downloads/ComputerVisionwithOpenCV3andQt5_ColorImages.pdf
使用的约定
本书中使用了多种文本约定。
-
CodeInText:表示文中的代码词汇、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚构的URL、用户输入和Twitter句柄。这里有一个例子:"QApplication类是负责控制应用程序的控制流、设置等的主类。" -
代码块如下所示:
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } -
当我们希望把你的注意力吸引到代码块的特定部分时,相关的行或项将以加粗形式展示:
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; **w.show();** return a.exec(); } -
任何命令行输入或输出如下所写:
binarycreator -p packages -c config.xml myinstaller -
加粗:表示一个新术语、一个重要词汇或你在屏幕上看到的词汇。例如,菜单或对话框中的词汇在文本中如此显示。这里有一个例子:"点击
Next按钮将你移动到下一个屏幕。"
第一章、OpenCV 和 Qt 简介
在其最基本的形式和结构中,计算机视觉是一个术语,用来识别所有用于赋予数字设备视觉感知能力的方法和算法。这意味着什么?嗯,这确实意味着它听起来的样子。理想情况下,计算机应该能够通过标准摄像机的镜头(或任何其他类型的摄像机)看到世界,并通过应用各种计算机视觉算法,它们应该能够检测到人脸,甚至识别它们,在图像中计数物体,检测视频流中的运动等等,这些起初可能只被期望人类能够做到。因此,要了解计算机视觉真正是什么,最好了解计算机视觉旨在开发实现所提到的理想的方法,赋予数字设备看到和理解周围环境的能力。值得注意的是,大多数情况下,计算机视觉和图像处理是可以互换使用的(尽管,对该主题的历史研究可能证明应该有所不同)。但无论如何,在本书中,我们将坚持使用计算机视觉这个术语,因为这是当今计算机科学社区中更受欢迎和广泛使用的术语,而且正如我们将在本章后面看到的那样,图像处理是 OpenCV 库的一个模块,我们将在本章的接下来的页面中介绍它,并且它也将在一个完整的章节中进行详细介绍。
计算机视觉是当今计算机科学中最受欢迎的主题之一,它被应用于各种应用程序中,从检测癌组织的医疗工具到帮助制作所有那些闪亮音乐视频和电影的视频编辑软件,再到军用级别的目标检测器,帮助在地图上找到特定位置,以及帮助无人驾驶汽车找到路线的交通标志检测器。嗯,很明显我们无法列出计算机视觉的所有可能性,但我们可以肯定它是一个有趣的主题,将在很长一段时间内存在。还值得一提的是,计算机视觉领域的工作和职业市场正在迅速扩展,而且正在日益增长。
在计算机视觉开发人员和专家中最受欢迎的工具中,有两个最突出的开源框架,它们也是您手头书籍的标题中的两个框架,即 OpenCV 和 Qt。每天,全世界成千上万的开发人员,从成熟的公司到创新的初创公司,都在使用这两个框架来为各种行业构建应用程序,比如我们提到的那些行业,而这正是您将在本书中学到的内容。
在本章中,我们将涵盖以下主题:
- 介绍 Qt,一个开源的跨平台应用程序开发框架
- 介绍 OpenCV,一个开源的跨平台计算机视觉框架
- 【省略】如何在 Windows、macOS 和 Linux 操作系统上安装 Qt
- 如何从源代码构建 OpenCV 在 Windows、macOS 和 Linux 操作系统上
- 配置您的开发环境以构建使用 Qt 和 OpenCV 框架的应用程序
- 使用 Qt 和 OpenCV 构建您的第一个应用程序
需要什么:
这是在本章介绍中提到的最明显的问题,但对它的回答也是我们学习计算机视觉的第一步。本书面向熟悉 C++ 编程语言并希望在不费力气的情况下开发强大且外观优美的计算机视觉应用程序的开发人员。本书旨在通过不同的计算机视觉主题带领您进行一场充满乐趣的旅程,重点放在实践练习和逐步开发您所学内容上。
任何有足够 C++ 经验的人都知道,使用原始的 C++ 代码并依赖于特定于操作系统的 API 来编写视觉丰富的应用程序并不是一件容易的任务。因此,几乎每个 C++ 开发人员(或至少是在 C++ 领域有积极职业生涯的严肃开发人员)都会使用一个或多个框架来简化这个过程。在为 C++ 开发的最广泛知名的框架中,Qt 是其中之一。事实上,如果不是最佳选择,那么它肯定是其中之一的最佳选择。另一方面,如果您的目标是开发处理图像或可视化数据集的应用程序,那么 OpenCV 框架可能是您首选的第一个(也许是最受欢迎的)地址。因此,这就是本书专注于 Qt 和 OpenCV 结合使用的原因。开发适用于不同桌面和移动平台的计算机视觉应用程序,以最高可能的性能运行,这是不可能的,而不使用像 Qt 和 OpenCV 这样的强大框架的组合。
总结所说的,确保您至少具有 C++ 编程语言的中级水平知识。如果诸如类、抽象类、继承、模板或指针等术语对您来说听起来很陌生,那么考虑先阅读一本关于 C++ 的书籍。对于所有其他涉及的主题,特别是所有涉及的实践主题,本书承诺为所有包含的示例和教程提供清晰明了的解释(或指向特定文档页面的引用)。当然,要详细深入地了解 Qt 和 OpenCV 中的模块和类是如何实现的,您需要熟悉更多的资源、研究,有时甚至是硬核的数学计算或对计算机或操作系统在现实世界中执行的低级理解,这完全超出了本书的范围。然而,对于本书涵盖的所有算法和方法,您将得到它们是什么,如何以及何时何地使用它们的简要描述,以及足够的指导,让您如果愿意的话可以继续深入挖掘。
Qt 简介
你可能已经听说过它,甚至在不知情的情况下使用过它。它是许多世界著名的商业和开源应用程序的基础,例如 VLC 播放器、Calibre 等等。Qt 框架被所谓的财富 500 强公司的大多数公司使用,我们甚至无法开始定义它在世界上许多应用程序开发团队和公司中的广泛使用和受欢迎程度。因此,我们将从介绍开始,然后逐步深入。
首先,让我们通过对 Qt 框架的简要介绍来使我们站稳脚跟。没有什么比在脑海中清晰地描绘整个框架更能让您感到舒适的了。所以,我们开始吧,目前由 The Qt Company 构建和管理,Qt 框架是一个开源应用程序开发框架,被广泛用于创建视觉丰富且跨平台的应用程序,这些应用程序可以在不同的操作系统或设备上非常轻松地运行,甚至几乎不需要任何努力。进一步分解,开源是其中最明显的部分。这意味着您可以访问 Qt 的所有源代码。所谓的视觉丰富,是指 Qt 框架中具有足够的资源和功能,可以编写非常漂亮的应用程序。至于最后一部分,跨平台,这基本上意味着,如果您使用 Qt 框架模块和类为 Microsoft Windows 操作系统开发应用程序,那么它可以像原样编译和构建为 macOS 或 Linux,而无需更改一行代码(几乎),前提是您的应用程序不使用任何非 Qt 或特定于平台的库。
在编写本书时,Qt 框架(从现在起简称为 Qt)的版本是 5.9.X,它包含许多模块,几乎可以用于开发应用程序的任何目的。Qt 将这些模块划分为以下四个主要类别:
- Qt Essentials
- Qt Add-Ons
- Value-Add Modules
- Technology Preview Modules
让我们看看它们是什么以及它们包含了什么,因为我们将在本书中经常处理它们。
Qt Essentials
这些是 Qt 所承诺在所有支持的平台上可用的模块。它们基本上是 Qt 的基础,包含了几乎所有 Qt 应用程序使用的大多数类。要真正关注 通用 这两个词,因为这正是这些模块的用途。以下是现有模块的快速研究和以后参考的简要列表:
| 模块 | 描述 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | Qt Core | 这些是其他模块使用的核心非图形类。 | | Qt GUI | 这些是用于图形用户界面 (GUI) 组件的基本类。包括 OpenGL。 | | Qt Multimedia | 这些是用于音频、视频、收音机和摄像头功能的类。 | | Qt Multimedia Widgets | 这些是基于窗口小部件的类,用于实现多媒体功能。 | | Qt Network | 这些是使网络编程更轻松和更可移植的类。 | | Qt QML | 这些是用于 QML 和 JavaScript 语言的类。 | | Qt Quick | 这是一个声明性框架,用于构建具有自定义用户界面的高度动态的应用程序。 | | Qt Quick Controls | 这些是基于 Qt Quick 的可重用 UI 控件,用于创建经典的桌面风格用户界面。 | | Qt Quick Dialogs | 这些是用于从 Qt Quick 应用程序创建和与系统对话框交互的类型。 | | Qt Quick Layouts | 这些布局是用于在用户界面中排列基于 Qt Quick 2 的项目的项目。 | | Qt SQL | 这些是用于使用 SQL 进行数据库集成的类。 | | [
Related Skills
node-connect
345.9kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
106.4kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
345.9kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
345.9kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
