文章目录
- 0.前言
- 0.1 视觉库的发展(计算优化)
- 0.2 MMX,IPP和Opencv
- 0.3 书籍及配套代码
- 0.4 阅读建议
- 1. 概述
- 1.1 计算机视觉任务
- 1.2 Opencv
- 1.2.1 目标
- 1.2.2 起源和发展
- 1.3 Opencv代码库
- 1.3.1 基本信息
- 1.3.2 整体架构
- 参考
0.前言
- opencv的全名:Open Source Computer Vision Library (OpenCV)
- 是Intel公司的,主要是Intel公司里的一个俄罗斯软件团队开发的,项目的主要负责人:
- 2001年之后开始为人熟知和使用,1999年1月发布alpha版本
- Opencv库有500多个函数,涵盖工业检测,医学成像,摄像机标定,立体视觉和机器人等。
- 卫星地图和电子地图的拼接;
- 医学图像去噪;
- 物体分析,安全和入侵检测,自动监视和安全系统(现在都用深度学习了)
- 摄像机标定等。
- 更详细的介绍见:1.2 Opencv
0.1 视觉库的发展(计算优化)
计算机视觉需要的计算量一般都很大,因此运算速度很重要,而早期计算效率成为这一领域的瓶颈。
直到后来,Interl在1996年发布了MMX,multi media extended技术,其后又出现了SSE,Streaming SIMD Extensions,才使得这个领域看到了曙光。这种基于单指令多数据的多媒体指令集使得图像处理算法的运行速度几倍甚至十几倍的提高,但是要使用这种指令集需要汇编语言。
因此,后续出现了很多使用MMX或者SSE技术优化过的图像处理库,比如:Intel的IPL以及IPP。但是这些库都是很基础的图像处理函数,不能满足复杂的应用技术快速开发的要求,同时这些并不开放源代码。
opencv的优点因此得以凸显,①完全开源;②包含丰富的图像处理及识别函数,且这些函数一般都使用MMX及SSE技术进行了很好的优化。
除了Interl的IPP库和Opencv库,其实还有很多别的库,比如:高校用的matlab,商业软件halcon,visionpro等。
0.2 MMX,IPP和Opencv
这里关于Opencv的函数用MMX及SSE技术优化需要注意:
- Opencv里的所有函数并不都是被优化过的,其中只有IPP(不开源的图像处理库)的一部分子集,根据回答What’s exactly the OpenCV IPP integration?,详见:
- Intel® IPP - Open Source Computer Vision Library (OpenCV) FAQ
,主要意思是:对于Opencv3.x及以上,Intel® IPP提供了自己的一个子集——IPP-ICV,其可以很方便的和Opencv一起使用,这个子集的自动集成是由Opencv负责的 - Installation by Making Your Own Libraries from the Source Files,主要提到的点: Opencv用了Intel Threading Building Blocks (TBB) 技术来帮助利用cpu的多核,②Intel Integrated Performance Primitives (IPP) 技术用来提高 OpenCV 库的颜色转换、Haar 训练和 DFT 函数的性能。需要注意的是,此项技术并不是免费的
- Intel® IPP - Open Source Computer Vision Library (OpenCV) FAQ
- 在以前比较旧的版本里,IPPICV是需要额外配置的,详见:Enabling Intel® IPP on OpenCV* (Windows* and Ubuntu*),但是后来的opencv默认集成了IPPICV。
其实在编译opencv时,可以看到以下内容(会自动下载安装ippicv):... -- IPPICV: Downloading ippicv_2021.8_mac_intel64_20230330_general.tgz from https://raw.githubusercontent.com/opencv/opencv_3rdparty/1224f78da6684df04397ac0f40c961ed37f79ccb/ippicv/ippicv_2021.8_mac_intel64_20230330_general.tgz -- found Intel IPP (ICV version): 2021.8.0 [2021.8] -- at: /Users/XXX/Documents/DailyStudy/cpp/lib/build_opecv/3rdparty/ippicv/ippicv_mac/iw ... -- Parallel framework: GCD -- -- Trace: YES (with Intel ITT) -- -- Other third-party libraries: -- Intel IPP: 2021.8 [2021.8.0] -- at: /Users/XX/Documents/DailyStudy/cpp/lib/build_opecv/3rdparty/ippicv/ippicv_mac/icv -- Intel IPP IW: sources (2021.8.0) -- at: /Users/XX/Documents/DailyStudy/cpp/lib/build_opecv/3rdparty/ippicv/ippicv_mac/iw -- Lapack: YES (/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Accelerate.framework -lm -ldl) -- Eigen: NO -- Custom HAL: NO -- Protobuf: build (3.19.1) -- Flatbuffers: builtin/3rdparty (23.5.9) -- -- OpenCL: YES (no extra features) -- Include path: NO -- Link libraries: -framework OpenCL
0.3 书籍及配套代码
- 英文原版书籍主页:Learning OpenCV
- 代码仓库:Learning OpenCV-gitlab
0.4 阅读建议
- 一星期只读两章,一边读一边上手,建议2个月内读完。
- 不一定非要按照顺序,11和12章除外;也不是非要看完,1~3章看完后,就可以挑感兴趣的看了。
1. 概述
1.1 计算机视觉任务
视觉问题不可解(是个病态问题)
- 给出3d对象的2d视图,是没有固定方法来重建出3d信息的,理论上,这种病态问题没有唯一和确定的解。
- 视觉问题的病态本质:随着视点的变化,物体的二维外观的变化会很大
上下文信息的使用:
- 在设计实际系统时,为了克服视觉传感器的限制,通常会使用一些上下文信息。
- 比如:让机器人寻找订书机,在设计系统时,给一个优先去桌子上寻找的规则(先验知识)。这样可以屏蔽很多无关的位置,以及其它与订书机形状类似,但是在桌子以外的地方的物体。
- 但是在图像检索任务中,数据库里的订书机图像都是对着真正的订书机拍的,同时基本都是位于画面中央。因此由人拍摄的图像中,具有相当多的隐含信息。
- 对计算机视觉应用环境的约束越多,则越能够使用这些约束来简化问题(先验知识)
建模上下文信息:
- 用机器学习对上下文信息显示的建模
- 隐含的变量,例如物体的大小,重力方向或者其他变量,都可以通过标记好的训练数据集的数值来校正;或者可以通过传感器来测量隐含的变量,例如:激光扫描仪可以精确测量出一个物体的大小
引入环境信息带来的噪声
- 但是传感器数据会不可避免的带来很多噪声,
- 例如:摄像机在采集图像时,受到真实世界变化的影响(天气,光线,运动等);镜头和机械结构的不完美,传感器上的长时间感应(运动模糊),传感器上和其它电子器件上的电子噪声;以及图像采集后图像压缩引入的变化。
- 一般使用统计的方法来克服噪声。例如:
- 一般不可能通过比较一个点和它紧密相邻的点来检测边缘,但是基于局部区域的统计特征的话,进行边缘检测则会比较容易,即局部区域卷积的响应连成的点串,构成边缘
- 也可以用时间维度上的统计来抑制早上,比如:视频的前后帧
- 也可以从数据中学习显示模型来解决噪声和畸变问题
- 例如:镜头畸变,可以通过学习一个简单多项式模型的参数来描述这种畸变,这种方式几乎可以完全矫正这种畸变。
1.2 Opencv
1.2.1 目标
- 为解决计算机视觉问题提供基本工具;
- 在某些情况下,其提供的高层函数也可以高效的解决一些复杂问题。
- 没有高层函数时,依靠其提供的基本函数也足以为大多数计算机视觉问题创建一个完整的解决方案。
- 解决实际遇到的问题,而不是你想象出来的问题(一定是先出来一个基本版本,然后基于此再逐步改进)
1.2.2 起源和发展
- 1998年,Intel内部有了创建一个开发视觉库的想法;
- 1999年,OpenCV开源
- 2000年,在CVPR2000会议上,第一个公开的release版本发布
- 2005年,OpenCV团队获得DARPA挑战赛的胜利,10小时内机器自动穿越160km的沙漠,详见:人类早期驯服野生自动驾驶汽车的珍贵史料
- 2006年10月,OpenCV1.0发布
- 2008年,Itseez和Willow Garage这两个机构开始支持OpenCV的开发(后者支持了5年)
- 2009~2010年,C++成为OpenCV的主要语言,python和java的接口也基本完成
- 2012年中,Android和IOS端侧的OpenCV库支持提上日程
- 2012年末,OpenCV项目迁移到了Github
- 2015年,OpenCV3.0发布,接口有了很大的提升,同时包括了基于OpenCL的T-API,以及Intel、AMD和NVIDIA等平台的优化(所以从3.x版本之后,改动就没有很大了,更多是对深度学习和其他平台、语言的支持,详见1.3.2 整体架构介绍)
- 2016年中,Opencv的核心人员从Itseez又回到了Intel,相较于最初1998年人员规模增加了3倍
- 2016年末,提供了DNN模块和JavaScript支持
- 2018年中,使用OpenVINO作为OpenCV的DNN模块后端的版本发布
- 2018年末,OpenCV4.0发布,使用了C++11的语法(C++11是2011年发布的C++标准)。新加入了3D重构和QR码检测
- 2019年开始,有了三个开发团队,分别是Intel,OpenCV China和Xperience AI
- 最近,开始CV课程,Opencv.AI和硬件
参考:
- Opencv-anniversary,页面搜索
Timeline
- Opencv的Contributer——提PR的个人开发者:
- https://github.com/opencv/opencv/graphs/contributors
- https://github.com/opencv/opencv/wiki/Individual-Contributors,这个页面并不怎么更新
- 提供支持的机构:
- https://github.com/opencv/opencv/wiki/Contributors
1.3 Opencv代码库
1.3.1 基本信息
- 遵循BSD协议,
- 详见BSD协议,简单来说,就是可以商用,但是希望发布内容中包含原先库的BSD协议信息。
- 但是有一些专利保护的算法,被单独放在了
“non-free” module
。,- 并不是确实有一个实际的文件夹形式的module叫做
non-free
,只是说把受到专利保护的方法,放在一起了。 - 但是并不是说不能用,如果是商业使用,需要从拥有者那里购买或者获得许可;如果是个人研究学习的目的,则可以用
- 最著名的一个受专利保护的:SIFT算法,在2020年之后,专利到期了,也就可以使用了。详见:喜大普奔 | 专利到期!SIFT算法免费可用了
- 可以在之前的记录中看到:opencv_contrib/modules/xfeatures2d/README.md
- 现在受保护的除了之前的几个,还新加了几个,
- 并不是确实有一个实际的文件夹形式的module叫做
- 支持主流平台,包括Android,IOS和Windows(有编译好的sdk,Windows的是release版本的,如果要debug版本的话还是要自己编译),以及linux和macOS(需要自己编译),跨平台便携的API
- C++写的(实时性能),但是有python、java和matlab等的接口
- 2500+的算法和函数
- 应用:谷歌街景,NASA的火星机器人探索,中国用来进行硬币的质检
1.3.2 整体架构
这部分内容有点长,写到扩展里去了,详见:学习Opencv(蝴蝶书/C++)相关——1. 前言 和 第1章.概述
参考
- http://16423.courses.cs.cmu.edu/slides/Lecture_2.pdf
- 学习OpenCV(中文版) .pdf
- 细致理解 OpenCV