【翻译】Seeing With OpenCV - Part 1: Introduction to OpenCV
本文翻译自Robin Hewitt的《Seeing With OpenCV - A Five-Part Series》。
正如标题所表达的那样,通过连载的五篇文章,我们将通过step by step的方式,实现一个人脸识别的程序,即从原始图片中检测脸部,并通过某种算法从样本库中筛选近似的肖像加以匹配,这是相当有用&有趣的应用。
这是本系列的第一章,主要介绍OpenCV及其一些简单用法。
1、OpenCV简介
OpenCV是一款免费、开源、使用C&C++编写的计算机视觉库,可以从http://sourceforge.net/projects/opencvlibrary
下载获得。
Intel在1999年发布了OpenCV的第一个版本,当时它需要Intel的图形处理包。现在,这个限制已经被去除,你可以像使用任何一个标准库一样使用OpenCV。
OpenCV被设计为跨平台,同时支持Windows、Linux以及MacOSX。有一个例外,CVCAM(负责摄像头处理)被设计为平台相关,这点后面会讨论到。
2、特点
OpenCV具有强大的图形处理功能,庞大的API可能会让初学者产生畏惧感。因此,作为初学者,你只需要了解其中最常用的部分。
通用计算机视觉以及图形处理算法(中、低层API)
使用这些接口,无需复杂的编写图像算法就可以实现一些常用的图像处理功能,包括边缘&直线&角的检测、椭圆拟合、多分辨率的图形金字塔算法、模板匹配,各种变换(傅里叶、离散余弦、距离)等等。
高层计算机视觉模块
OpenCV包含了许多高层的功能,例如脸部检测&识别&跟踪等
人工智能与机器学习方法
计算机视觉的问题往往会涉及到一些机器学习以及人工智能的方法,这些都被包装在OpenCV的机器学习包里面
图像采样与视角变换
OpenCV提供了图像子区域提取、随机采样、图形缩放、包装、旋转以及透视变换等功能
二值化图像的创建和处理
OpenCV提供的二值化图像的创建和分析功能,在监控、形状检测以及物件计数等领域往往很有用
3D计算与处理
这些方法可以用于3D建模和定位,以及摄像机的多视角处理
用于图像处理、计算机视觉的数学库
OpenCV提供了大量常用的数学运算库,包括线性代数、统计学以及几何运算等等
作图
这些接口可以使你很方便地再图片上写字或者作画。可以通过它实现一些简单的水印功能,或者辅助其它更高阶的功能,例如在进行物体识别的同时,可以使用该接口标记检测出来的位置和区域。
GUI
OpenCV封装了许多跨平台的GUI接口作为API,你可以实现自己的应用,操作键盘、鼠标、滑块等控件。
数据结构与算法
使用这些接口,你可以有效地存储、查询、保存和操作一些常用的数据结构,比如链表、几何、树、图等
数据持久化
这些接口提供了将数据保存到本地以便日后读取的功能
下图展示了OpenCV的一些应用场景,包括脸部识别、轮廓检测以及边缘检测。
3、模块结构
OpenCV包含以下几个模块:
CXCORE包含了一些基本的数据类型的定义。例如,一些常见的图、点、矩形等数据结构定义在cxtypes.h中。CXCORE同时也包含含线性代数和统计等模块,以及持久化函数、错误句柄处理、以及画图等功能。
CV包含了图像处理以及摄像机校正、几何计算等方法。
CVAUX包含了一些实验型的方法,比如脸部识别等
ML主要是一些机器学习的方法
HighGUI包含了一些基本的IO操作以及一些跨平台的界面调用接口
CVCAM包含了一些视频处理的接口,使得你不必亲自去使用DirectX
4、OpenCV编程基础
关于头文件与库文件的引用
本文所介绍的大部分程序都需要引用cv.h和highgui.h。脸部识别的程序还需要添加cvaux.h。这些头文件自身引用了其余的大多数其它头文件。
你的连接器也需要添加cxcore.lib、cv.lib以及highgui.lib。对于脸部识别的程序,还需要添加cvaux.lib,它们都在OpenCV的lib目录下。
图片的读写
下面的实例代码说明了如何读取图片文件,并采用不同的压缩格式(jpg -> png)保存为另一个文件。
pixel[row][col] = (uchar*)(pImg->imageData + row*pImg->widthStep + col);
最后,如果遇到图片的位深大于8bit的情况(比如,IPL_DEPTH_32S),你需要将其转化为多字节的数据类型,并且将其width step乘以字节数作为其实际的位深(比如,对于IPL_DEPTH_32S来说,你需要将buffer转化为int*,并且将使用4倍的width step。)。尽管如此,实际情况下,很少会遇到需要直接操作多字节像素值的场景。
5、下一章预告
在Part 2,我将会介绍如何使用OpenCV来实现脸部检测,并且详细讲解其背后的算法,感谢你的阅读。