【0-定义】
**计算机视觉:**一门研究如何使机器“看”的科学,更进一步的说,就是指用摄影机和计算机代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图像处理,用计算机处理成为更适合人眼观察或传送给仪器检测的图像。
【1-图像和视频的基础知识】
图像:彩色图像中,图像用二维矩阵表示,矩阵中的元素是RGB的值,每个值占一个字节(8位),值得取值范围是0~255。
三通道是用(255,0,0)代表红色,(0,255,0)代表绿色,(0,0,255)代表蓝色。
灰度图像中每个元素只有一个通道。(把白色与黑色之间按对数关系分为若干等级,称为灰度。)
分辨率:高像素宽像素,如10801440分辨率
DPI(Dots Per Inch,每英寸像素点数) :通过DPI和像素可以求出图片的实际尺寸,如1080*1440分辨率,DPI96,那么图片实际高为1080/96 = 11.25英寸,宽为1440/96=15英寸。
图片清晰程度不是由像素决定,而是用DPI来决定,DPI越大,清晰度越高。
图像深度:一张400*400的8位图,这张图的原始数据量是:400 * 400 * ( 8/8 )=160,000Bytes
图像格式与压缩:常见的图片格式JPEG,PNG,BMP等本质上都是图片的一种压缩编码方式
视频:原始视频=图片序列。
I帧:表示关键帧,可以理解为这一幅画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
P帧:表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
B帧:表示双向差别帧,记录的本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,要通过前后画面与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码比较麻烦。
【2-CPU和GPU】
CPU 跟 GPU 的差别主要在哪里呢? 它们的差别主要可以在两个方面去对比,第一个叫性能,第二个叫做吞吐量。
低延时性就是当你的性能越好,你处理分析的效率越高,相当于你的延时性就越低
吞吐量的意思就是你同时能够处理的数据量。
CPU 它是一个高性能,就是超低延时性的,他能够快速的去做复杂运算,并且能达到一个很好的性能要求。
GPU是以一个叫做运算单元为格式的,所以他的优点不在于低延时性,因为他确实不善于做复杂运算,他每一个处理器都非常的小,相对来说会很弱,但是它可以让它所有的弱处理器,同时去做处理,那相当于他就能够同时处理大量的数据,那这个就意味着它的吞吐量非常大,所以 CPU重视的是性能,GPU重视的是吞吐量。
所以大部分时候,GPU 他会跟另外一个词语联系在一起,叫做并行计算,意思就是它可以同时做大量的线程运算,为什么图像会特别适合用 GPU 运算呢?这是因为 GPU 它最开始的设计就是叫做图形处理单元,它的意思就是我可以把每一个像素,分割为一个线程去运算,每一个像素只做一些简单的运算,这个就是最开始图形处理器出现的原理。
它要做图形渲染的时候,要计算的是每一个像素的变换。所以每一个像素变换的计算量是很小很小的,可能就是一个公式的计算,计算量很少,可以放在一个简单的计算单元里面去做计算。
下面主要介绍机器视觉经典系统,常用领域以及机器视觉常用的图像处理库,希望以此和大家一起入门。
**1.机器视觉经典系统**
简单说来,机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。
那么一个经典的机器视觉系统长什么样呢?
其中,
- 为传送带上的被测物体
- 为合适的拍摄被测物的相机
- 为标准或定制的光源
- 为触发图像采集的光电传感器
- 为计算机或工控机
- 为相机-计算机接口
- 为驱动软件采集到的图像
- 机器视觉算法处理处理过程
- 为算法返回的检测结果
- 为数字I/O口
- PLC控制器
- 为现场总线接口
- 执行机构
上面系统的一般工作流程如下:
-
被测物体被传输到固定位置后,触发相机采集图像
-
采集到的图像传入计算机进行算法运算
-
将运算结果通过控制器返回到执行机构
**2.常见的机器视觉应用**
下面举几个常见的,必须有机器视觉系统参与的任务:
-
目标识别用来甄别不同的被测物体,比如物流控制或者根据不同目标进行的不同检测,识别有特殊识别特征的识别物,如字符串,条形码,二维码或被测物体的形状等特性。
-
位置探测用来控制机器人将产品组建放置在正确的位置上,如贴片机就是将元器件放置到印刷电路板(PCB)上的正确位置。根据不同应用,位置探测可以是二维的或者三维的。
-
完整性检测,通常用于产品装配进行到一定阶段的后期,比如当元器件安放在PCB板后要检测确保其产品的装配是正确的,也就是说正确的元组件在正确的位置上。
-
形状和尺寸检测,用于检测产品几何的参数,来保障其在允许的公差范围。这种检测可用于生产过程中,也可以用于产品使用一段时间之后,也可以用于产品使用一段时间之后,通过检测来确认产品经磨损后是否仍然满足要求。
-
表面检测,来检测产品是否存在缺陷,如划痕,断线,凹凸不平等。
**3.常用的图像处理库**
简单介绍下各家图像库的一些优缺点。OpenCV,Intel IPP,Halcon,MATLAB ,OpenGL,EmguCv,AForge.net,CxImage,FreeImage,paintlib,AGG,IPL,visDSK。不足之处,还请大家多多提建议,多谢!欢迎微信关注公众号“智能算法”,带您体验不一样的人生!
1. OpenCV
简介:OpenCV全称是:Open Source Computer Vision Library。是Intel®开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和一些C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。
- OpenCV功能
提供对图像数据操作,图像/视频的输入输出,基本图像处理,结构分析,摄像头定标,运动分析,目标识别以及基本的GUI等的函数接口。
- OpenCV模块
cv – 核心函数库;
cvaux – 辅助函数库;
cxcore – 数据结构与线性代数库;
highgui – GUI函数库;
ml – 机器学习函数库
- 特点:
免费,源代码公开,是一个跨平台的中、高层API 构成,它不依赖与其它的外部库,尽管也可以使用某些外部库。为了完全独立于IPL (INTEL的图像处理库) OpenCV 复制了IplImage 和其它一些结构变量的声明。
OpenCV 为Intel® Integrated PerformancePrimitives (IPP) 提供了透明的用户使用接口。它对IPP不存在任何依赖。但如果安装了IPP,那么OpenCV将会通过自动载入IPP动态链接库来获取IPP的优势,来提升速度。
2. Intel IPP
简介:IPP“Intel Integrated Performance Primitives” ( Intel IPP )是一套跨平台的软件函数库,
他提供了广泛的多媒体功能:音频解码器(例如: H263 、 MPEG-4 )、图像处理 (JPEG) 、信号处理、语音压缩(例如: G723 、 GSM 、 AMR )和加密机制。
Intel IPP 针对大量的 Intel Microprocessor (微处理器)进行优化: Intel Pentium 4 处理器,采用 Intel Centrino 移动运算技术的 Intel Pentium M 处理器组件, Intel Itanium 2 处理器、 Intel Xeon 处理器以及采用 Intel XScale 技术的 Intel PCA 应用处理器。采用一套跨平台结构的通用 API ,使用者除了不需要担心平台兼容性的问题,更节省了开发成本以及研发时间,使用者可以轻轻松松移植原有应用程序。
特点:
- IPP收费源代码不公开
- 函数库:信号处理,图像处理,多媒体,向量处理等
- 跨平台和OS的通用 API
- 高性能代码,不需要写汇编代码,获得优化的应用程序,速度快,效率高。
3.Halcon
简介:德国MVtec公司的图像处理软件HALCON,是世界公认具有最佳效能的机器视觉软件。它发源自学术界,有别于市面一些商用软件包。事实上,这是一套图像处理库,由一千多个各自独立的函数,以及底层的数据管理核心构成。其中包含了各类滤波、色彩分析以及几何、数学变换、形态学计算分析、校正、分类、辨识、形状搜索等等基本的几何以及图像计算功能,由于这些功能大多并非针对特定工作设计的,因此只要用得到图像处理的地方,就可以用HALCON强大的计算分析能力来完成工作。应用范围几乎没有限制,涵盖医学、遥感探测、监拎、及工业上的各类自动化检测。近年来,由于机器视觉技术的发展,这种可以”取代人眼”,对重复工作不会疲劳,精度高且稳定的特质,促进了高科技业的发展,例如电子业产量的大幅提升。而MVTec公司更是不断的与学术界合作,并且将最新的学术研究成果纳入其中,不但使自己的技术处于业界领导地位,同时也将机器视觉技术推向更高的境界。
机器视觉软件HALCON在世界范围内被广泛的使用,用户可以利用其开放式结构快速开发图像处理和机器视觉应用。
一个专业的图像处理工具不只包含一个图像处理函数库。图像处理任务的解决只是整个机器视觉解决方案的一部分,还包括处理控件和或者数据库连接等软件部分,图像获取及其照明等硬件部分。因此,图像处理系统简单易用,并且能活嵌入到开发项目中是非常重要的。Halcon充分考虑到这些方面。
它有如下的特点:
- 1). HALCON包含了一套交互式的程序设计接口HDevelop,可在其中以HALCON程序代码直接编写、修改、执行程序,并且可以查看计算过程中的所有变量,设计完成后,可以直接输出C/C++,或是COM(visual basic)程序代码,嵌入到应用程序程序中。
- 2). HALCON不限制取像设备,可以自行挑选合适的设备。原厂己提供了4 0余种相机的驱动,即使是尚未支持的相机**,除了可以透过指针(pointer)轻易的抓取影像,还可以利用HALOCN开放性的架构,自行编写DLL文件和系统连接。**
- 3). 使用HALCON有最好的投资效益。这套软件支持的操作系统除了微软的NT/XP/2000,还有Linux, Solaris7, 181X6. 5, "1’ru64 UN1X5. 1等等,当需要开发出一套系统,就可以轻易转换作业平台,以符合需求。为了加快速度,还可以使用多处理器的计算机,所编写的程序不必更动。
- 4). 使用HALOCN,在设计人机接口时没有特别的限制,也不需要特别的可视化组件,可以完全使用开发环境下的程序语言,例如Mircosoft Visual Studio等等,架构自己的接口,最终用户看不到开发工具,而且在执行软件的机器上,只需要很少的资源。
4. MATLAB
简介:MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
特点:
1). 高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来;
2). 具有完备的图形处理功能,实现计算结果和编程的可视化;
3). 友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握;
4). 功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等) ,为用户提供了大量方便实用的处理工具。
功能十分强大,正版软件价钱昂贵,适用于学术研究,仿真和演示。在软件开发,工程应用方面有一定的局限性。
5. OpenGL
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
OpenGL 是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。OpenGL™ 是独立于视窗操作系统或其它操作系统的,亦是网络透明的。在包含CAD、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL™ 帮助程序员实现在 PC、工作站、超级计算机等硬件设备上的高性能、极具冲击力的高视觉表现力图形处理软件的开发。
特点:
1). 与C语言紧密结合。
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。
2). 强大的可移植性。
微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。
3). 高性能的图形渲染。
OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。
总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。
6. EmguCv
EmguCV 是.NET 平台下对OpenCV 图像处理库的封装。也就是OpenCV的.NET 版。它运行在.NET 兼容的编程语言下调用OpenCV 的函数,如C#、VB、VC++、IronPython 等。这个封装库可以在Mono 下编译和在Linux / Mac OSX 上运行。EmguCV 全部用 C#编写 ,它可以在Mono环境里编 译,在 任何 Mono支持的平台 (如 Linux, Solaris,MacOSX ) 上 运 行 。EmguCV 的其他优势还有,支持通用颜色和深度的图像类,自动垃圾收集,可XML序列化的图像,XML 文档和 Intel license 支持, 自由选择图像类或 OpenCV 的 direct invoke 函数 ,图像象 素上的通用操作等。 也就是说 ,EmguCV 不仅继承了 OpenCV 的所有功能和特点 ,而且在跨平台支持方面也有更大的突破 。
将OpenCv的绝大部分功能都包装成了.net类、结构或者枚举。不过文档不全,还是得对照OpenCv的文档去看才行。
7. AForge.net
AForge.NET 是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。
这个框架由一系列的类库和例子组成。其中包括的特征有:
AForge.Imaging -一些日常的图像处理和过滤器
AForge.Vision -计算机视觉应用类库
AForge.Neuro -神经网络计算库
AForge.Genetic -进化算法编程库
AForge.MachineLearning -机器学习类库
AForge.Robotics -提供一些机器学习的工具类库
AForge.Video -一系列的视频处理类库(很方便)
纯.net类库,接口简单,用起来很方便。
8. CxImage
CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage,PaintLib等等,它们可谓是功能强大,齐全,没必要用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所束缚。在这点上,CxImage类库是完全免费的。另外,在使用上述类库时,你会遇到重重麻烦。因为它们大部分是平台无关的,且用C语言写成,有的还夹杂着基本的C++ wrapper和成堆的编译选项的声明需要你去处理。而CxImage类库在这方面做得很好。作者完全公开了源代码。相对于那些封装好的图形库和GDI+来说,这一点使我们可以进一步学习各种编解码技术,而不再浮于各种技术的表面。
9. FreeImage
FreeImage 是一款免费的、开源的、跨平台(Windows 、Linux 和Mac OS X )的,支持20 多种图像类型的(如BMP 、JPEG 、GIF 、PNG 、TIFF 等)图像处理库。其最大优点就是采用插件驱动型架构,具有快速、灵活、简单易用的特点,得到了广泛使用。
FreeImage 的主要功能有多格式位图的读写;方便的位图信息获取;位深度转换;位图页面访问;基本的几何变换和点处理;通道合并与混合等。FreeImage 暂时不支持矢量图形和高级图像处理,位图绘制需要由用户来完成。
FreeImage 中的所有函数都以FreeImage_ 开头,如图像文件的读写函数分别为FreeImage_Load 和FreeImage_Save 。FIBITMAP 数据结构保存着位图信息和像素数据,是FreeImage 的核心。
10. paintlib
paintlib是一个可移植的用于图像加载、保存和处理的C++类库。可从BMP, GIF, JPEG, PCX, PGM, PICT, PNG, PSD, TGA, TIFF和WMF文件中加载图像,且可保存为BMP, JPEG, PNG和TIFF格式。既可通过在过滤器类中执行过滤, 也可通过直接访问位图来进行图像处理。提供了完整的C++源码。
11. AGG
AGG,全名:Anti-Grain Geometry,是一个开源的、高效的2D图形库
AGG是一个高效的、高质量的、开源的矢量图形库,类似的有:GTK+的Cairo,Microsoft的GDI+。在三者中,AGG的性能是最高的(不讨论Skia和Direct2D,他们有OGL和DX的硬件加速,绘图速度根本不是一个档次的)。
特点:
AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行.
AGG的功能
1). 支持ALPHA、GAMMA等变色处理,以及用户自定义的变色处理;
2). 支持任意2D图形变换;
3). 支持SVG和PostScript描述,适于网上图形生成;
4). 支持高质量的图形处理,支持反走样插值等高级功能;
5). 支持任意方式的惭变色处理;
6). 支持所有颜色格式;
7). 支持对位图的多种处理;
8). 支持直线的多种处理,类似于GDI+;
9). 支持GPC,即通用多边形裁剪方法;
10). 支持多种字体输出,包括汉字的处理;
效率高,质量高(有反锯齿),功能强大,跨平台和平台GUI支持,缺点:没有硬件加速,文档少,门槛略高。
12. IPL
Intel 的IPL image library虽然没有开源但是进行普通的图像处理非常好用,像拉布拉斯算子,索贝尔算子等等边缘提取和锐化的函数。 如果目标平台是PC机或者工控机又是Intel的CPU,这是一个非常不错的选择。
现在已经没有IPL了,IPL已经是IPP的一部分了,不过还是可以下载早期版本。IPP的教育版50$,不是很贵,集成大部分算法1D signal processing, 语音信号处理;2D signal prodessing, image processing, video processing. Open CV的模式将很类似于IPL.
特点:
IPL 图象处理库,免费,起初开源,后来不开源。
13. visDSK
MICROSOFT图像处理库,免费、开源。OpenCV未出现时很受追捧,但是现在visDSK能做的OpenCV都可以做,在速度上,OpenCV还有Intel公司的优化支持。visDSK的时代已然成为过去。
参考文献:
http://wenku.baidu.com/view/e5dced5b90c69ec3d5bb75ba.html?from=search
http://wenku.baidu.com/view/11c961dcc1c708a1284a44bf.html?from=search
http://wenku.baidu.com/view/bd2fd40df12d2af90242e6d0.html?from=search
http://wenku.baidu.com/view/7b70e3afdd3383c4bb4cd211.html
http://wenku.baidu.com/view/7bacd7651ed9ad51f01df29b.html
http://wenku.baidu.com/view/59257440011ca300a6c3903a.html?from=search
http://wenku.baidu.com/view/21b46653ad02de80d5d84004.html?from=searc