一、opencv详细介绍
文章目录
opencv官方资料教程地址: https://opencv.org/
1.1 什么是opencv
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
1.2 opencv历史
1999 年,Gary Bradski(加里·布拉德斯基)当时在英特尔任职,怀着通过为计算机视觉和人工智能的从业者提供稳定的基础架构并以此来推动产业发展的美好愿景,他启动了 OpenCV 项目。
OpenCV 库用C语言和 C++ 语言编写,可以在 Windows、Linux、Mac OS X 等系统运行。同时也在积极开发 Python、Java、Matlab 以及其他一些语言的接口,将库导入安卓和 iOS 中为移动设备开发应用。
OpenCV 自项目成立以来获得了来自英特尔和谷歌的大力支持,尤其需要感谢 Itseez,该公司完成了早期开发的大部分工作。此后,Arraiy 团队加入该项目并负责维护始终开源和免费的 OpenCV.org。
Itseez 是俄罗斯的一家视觉公司,专门从事计算机视觉算法。2016 年 5 月,英特尔收购该公司,以“帮助英特尔的用户打造创新型深度学习的 CV 应用,如果自动驾驶、数字安全监控和工业检测”(英特尔物联网总经理 Doug Dacies 如此说)
1.3 为什么用OpenCV
计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:
- 研究代码(慢,不稳定,独立并与其他库不兼容)
- 耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
- 依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。
OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。
IPPICV 加速
如果希望得到更多在英特尔架构上的自动优化,可以购买英特尔的集成性能基元(IPP)库,该库包含了许多算法领域的底层优化程序。在库安装完毕的情况下 OpenCV 在运行的时候会自动调用合适的 IPP 库。
从 OpenCV 3.0 开始,英特尔许可 OpenCV 研发团队和 OpenCV 社区拥有一个免费的 IPP 库的子库(称 IPPICV),该子库默认集成在 OpenCV 中并在运算时发挥效用。
如果你使用的是英特尔的处理器,那么 OpenCV 会自动调用 IPPICV。
IPPICV 可以在编译阶段链接到 OpenCV,这样一来,会替代相应的低级优化的C语言代码(在 cmake 中设置
WITH_IPP=ON/OFF
来开启或者关闭这一功能,默认情况为开启)。使用 IPP 获得的速度提升非常可观。
1.4 opencv的应用场景
https://paperswithcode.com/sota 这个网站非常详细划分了 16 个大方向,包括总共 1081 个子方向。如果想进入机器学习领域,首先还是选择一个方向领域,然后了解和熟悉该方向领域内所需要的算法,特定的解决技巧等。
计算机视觉可以分为以下几大方向:图像识别、目标检测、图像分割、风格迁移、图像重构、超分辨率、图像生成、人脸识别、其他。
1、图像分类
(Image Classification):也称图像识别,就是辨别图像是什么,或者说图像中的物体属于什么类别。
图像分类根据不同分类标准可以划分为很多种子方向;比如根据类别标签,可以划分为
-
二分类问题:比如判断图片中是否包含人脸;
-
多分类问题:比如鸟类识别;
-
多标签分类,每个类别都包含多种属性的标签:比如对于服饰分类,可以加上衣服颜色、纹理、袖长等标签,输出的不只是单一的类别,还可以包括多个属性。
2、目标检测
(Object Detection):目标检测通常包含两方面的工作,首先是找到目标,然后就是识别目标。
目标检测可以分为单物体检测和多物体检测,即图像中目标的数量,例子如下所示:
3、图像分割
(Object Segmentation):图像分割是基于图像检测的,需要检测到目标物体,然后把物体分割出来。
图像分割可以分为三种:
- 普通分割:将不同分属于不同物体的像素区域分开,比如前景区域和后景区域的分割;
- 语义分割:普通分割的基础上,在像素级别上的分类,属于同一类的像素都要被归为一类,比如分割出不同类别的物体;
- 实例分割:语义分割的基础上,分割出每个实例物体,比如对图片中的多只狗都分割出来,识别出来它们是不同的个体,不仅仅是属于哪个类别。
一个图形分割的例子如下所示,下图就是一个实例分割的例子,用不同的颜色表示不同的实例
4、风格迁移
(Style Transfer):风格迁移是指将一个领域或者几张图片的风格应用到其他领域或者图片上。比如将抽象派的风格应用到写实派的图片上。
一个风格迁移的例子如下, 图 A 是原图,后面的 B-D 三幅图都是根据不同风格得到的结果
5、图像重构
(Image Reconstruction):也称为图像修复(Image Inpainting),其目的就是修复图像中缺失的地方,比如可以用于修复一些老的有损坏的黑白照片和影片。通常会采用常用的数据集,然后人为制造图片中需要修复的地方。
一个修复的例子如下所示,总共是四张需要修复的图片
6、超分辨率
(Super-Resolution):超分辨率是指生成一个比原图分辨率更高、细节更清晰的任务。一个例子如下图所示
通常超分辨率的模型也可以用于解决图像恢复(image restoration)和修复(inpainting),因为它们都是解决比较关联的问题。
7、图像生成
(Image Synthesis):图像生成是根据一张图片生成修改部分区域的图片或者是全新的图片的任务。这个应用最近几年快速发展,主要原因也是由于 GANs 是最近几年非常热门的研究方向,而图像生成就是 GANs 的一大应用。
一个图像生成例子如下:
8、人脸识别
人脸方面的应用,包括人脸识别、人脸检测、人脸匹配、人脸对齐等等,这应该是计算机视觉方面最热门也是发展最成熟的应用,而且已经比较广泛的应用在各种安全、身份认证等,比如人脸支付、人脸解锁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1MZGE96D-1638193524522)(opencv图像处理(c++)/1604244708687.png)]
9、其他
opencv实际上还有其他很多方向应用,包括:
- 图文生成(Image Captioning):给图片生成一段描述。
- 文本生成图片(Text to Image):基于文本来生成图片。
- 图片上色(Image Colorization):将图片从黑白变为彩色图。
- 人体姿态估计(human pose estimation):识别人的行为动作
- 还有包括 3D、视频、医学图像、问答、自动驾驶、追踪等等方向