什么是OpenCV?
- 是一个开源的计算机视觉库,可以从官网获取。
- 是用C和C++语言编写,可以在Windows、Linux、Mac OS X等系统运行。同时也在积极开发Python、Java、Matlab以及其它一些语言接口。
- 设计用于进行高效的计算,十分强调实时应用的开发。
- 目标是提供易于使用的计算机视觉接口,帮助人们快速建立精巧的视觉应用。
应用领域
- 工业产品质量检验。
- 医学图像处理。
- 安保领域。
- 交互操作。
- 相机校正。
- 双目视觉。
- 机器人学。
OpenCV怎么用?
OpenCV的开源许可允许任何人利用OpenCV包含的任何组件构建商业产品。
什么是计算机视觉?
计算机视觉技术可以将静止图像或视频数据转换为一种决策或新的表示。所有的这种转换都是为了完成某种特定的目的而进行的。
场景信息—>相机(或硬盘)—>栅格状排列的数字
目前不成熟的地方:
- 机器视觉系统不存在一个预先建立的模式识别机制。没有自动控制焦距和光圈,也不能将多年的视觉经验联系在一起。
- 给定一个对于3D世界的二维(2D)观测,不存在一个唯一的方式来重建三维信号。即使数据是完美的,相同的二维图像也可能表示一个无限的3D场景组合中的任一种情况。
- 数据会被噪声和畸变所污染。这样的污染源于现实生活中的很多方面(天气、光线、折射率和运动),还有传感器中的电路噪声以及其它的一些电路系统影响,还有采集之后对于图像的压缩产生的影响。
目标:
为计算机视觉需要解决的问题提供工具。
开发步骤:
- 开发粗糙的解决方案。
- 发现解决方案存在的缺陷。
- 修复缺陷,不断改进完善。
OpenCV的起源
起源于英特尔想要增强CPU集群性能的研究。在英特尔团队的帮助下,OpenCV最初的核心代码和算法规范是英特尔俄罗斯实验室团队完成的。从英特尔软件性能的实验室研究开始,俄罗斯的专家负责实现和优化。
想要完成的一些目标
- 为高级的视觉研究提供开源并且优化过的基础代码,不再需要重复造轮子。
- 以提供开发者可以在此基础上进行开发的通用接口为手段传播视觉相关知识,这样代码有更强的可读性和移植性。
- 以创建可移植的、优化过的免费开源代码来推动基于高级视觉的商业应用,这些代码可以自由使用,不要求商业应用程序的开放或免费。
OpenCV的结构
OpenCV和操作系统的交互 | |
OpenCV Contrib | fact,text,rgbd,… |
OpenCV | core,imgproc,objdetect,… |
OpenCV HAL | SSE,NEON,IPP,OpenCL,CUDA,OpenCV4Tegra,… |
使用IPP来加速OpenCV
如果在英特尔的处理器上使用,OpenCV就会自动使用一种免费的英特尔集成性能原语库(IPP)的子集,IPP 8.x(IPPICV)。IPPICV可以在编译阶段链接到OpenCV,这样会替代相应的低级优化的C语言代码(在cmake中设置WITH_IPP=ON/OFF开启或关闭这一功能,默认情况为开启)。
谁拥有OpenCV
开源并且免费,并且无论是研究还是商业目的代码都可以(全部或部分的)使用或者被嵌入到其它程序中。
下载和安装OpenCV
在OpenCV官方网站(http://opencv.org/)可以下载最新且完整的源码以及大部分release版本源码。下载链接可以通过下载页面(https://opencv.org/releases/)访问。当然,最新的代码会在github(https:///opencv/opencv)上进行即时更新。如果想要获取最新的高级函数功能,也可以下载和编译opencv_contrib模块(https:///opencv/opencv_contrib)。
安装
下一章提供在Windows系统安装的教程。
更多的OpenCV文档
OpenCV基础文档可以在http://opencv.org/获取。另外,在http://docs.opencv.org/2.4.13/doc/tutorials/tutorials.html,也可以获取更多深入教程,OpenCV的维基网站页面现在位于https:///opencv/opencv/wiki。
在线文档和维基资源
- 参考(http://opencv.org/)
这个部分包含函数、它们的参数以及如何使用它们的一些信息。 - 教程(http://docs.opencv.org/trunk/d9/df8/tutorial_root.html)
这个部分是许多教程的集合,这些教程会告诉你如何完成各种各样的事情。这里有一些基础课程的教程(比如如何在不同平台上安装OpenCV或者创建OpenCV项目)以及一些更高级的话题(比如目标检测的背景提取算法)。 - 速查表(http://docs.opencv.org/3.0-last-rst/opencv_cheatsheet.pdf)
只有一页篇幅的PDF文档,包含整个库的高度压缩的参考。 - 维基(https:///opencv/opencv/wiki)
维基包含所有你可能想要的东西,甚至可能超乎你的想象。在这里,可以找到路线图、新闻、开放问题、bug追踪以及无数个更深入的主题,比如如何成为OpenCV的贡献者。 - 问答社区(https://answers.opencv.org/questions)
问答社区是一个庞大的、包含数千人遇到过的问题的档案集合。可以向OpenCV社区提问,或者通过问答问题帮助他人。
模块
- Core
该模块包含OpenCV库的基础结构以及基本操作。 - Improc
图像处理模块包含基本的图像转换,包括滤波以及类似的卷积操作。 - Highgui
这个模块包含可以用来显示图像或者简单的输入的用户交互函数。这可以看作是一个非常轻量级的Windows UI工具包。 - Video
该模块包含读取和写视频流的函数。 - Calib3d
这个模块包括校准单个、双目以及多个相机的算法实现。 - Feature2d
这个模块包含检测特定目标,比如人脸或行人的算法。也可以训练检测器并用来检测其它物体。 - Ml
机器学习模块本身是一个非常完备的模块,包含大量的机器学习算法实现并且这些算法都能和OpenCV的数据类型自然交互。 - Flann
Flann的意思是”快速最邻近库“。这个库包含一些你也许不会直接使用的方法,但是其它模块中的函数会调用它在数据集中进行最邻近搜索。 - GPU
GPU模块主要函数在CUDA GPU上的优化实现,此外,还有一些仅用于GPU的功能。其中一些函数能够返回很好的结果,但是需要足够好的计算资源,如果硬件没有GPU,则不会有什么提升。 - Photo
这是一个相当新的模块,包含计算摄影学的一些函数工具。 - Stitching
本模块是一个精巧的图像拼接流程实现。这是库中的新功能,但是,就像Photo一样,这个领域未来预计有很大的增长。 - NonFree
OpenCV包含一些受到专利保护的或者受使用限制的(比如SIFT算法)算法。这些算法被隔离到它们自己的模块中,以表明你需要做一些特殊的工作,才可以在商业产品中使用它们。 - Contrib
这个模块包含一些新的,还没有被集成进OpenCV库的东西。 - Legacy
这个模块包含一些老的尚未被完全取消的东西。 - Ocl
这是一个较新的模块,可以认为它和GPU模块相似,它实现了开放并行编程的Khronos OpenCL标准。虽然现在模块的特性比GPU模块少很多,但Ocl模块的目标是提供可以运行在任何GPU或者其它可以搭载Khronos的并行设备。这与GPU模块形成了鲜明的对比,后者使用Nividia CUDA工具包进行开发,因此只能在Nividia GPU设备上工作。
Contrib模块
- Dnn
深度神经网络 - Face
人脸识别 - Text
文本检测以及识别,基于许多开源的OCR算法。 - Rgbd
处理由Kinect或者其它深度传感器(或者简单由双目匹配得到的)获取RGB+深度图像。 - Bioinspired
一些基于生物学启发的视觉技术。 - ximgproc和xphoto
先进的图像处理以及计算摄影学方法。 - Tracking
现代目标追踪算法。
可移植性
- OpenCV基于可移植的理念设计,最初可以被任意通用的C++编译器编译。这表示它的C和C++代码都必须是相当标准的,以便跨平台支持更加容易。
- OpenCV对于Intel和AMD 32位,64位(x86,x64)的支持是最成熟的,对ARM的支持也在迅速改善中。
- 对于操作系统,OpenCV完全支持Windows、Linux、OS X、Android和iOS。