一、简介
1、OpenCV的特点
OpenCV可用于实时处理图像;具有良好的移植性;可以进行图像/视频载入、保存和采集的常规操作;具有低级和高级的应用程序接口(API)。
2、功能
(1)图像数据操作(内存分配与释放,图像复制、设定和转换)
(2)图像/视频的输入输出(支持文件或摄像头的输入,图像/视频文件的输出)
(3)矩阵/向量数据操作及线性代数运算(矩阵乘积、矩阵方程求解、特征值、奇异值分解)
(4)支持多种动态数据结构
(5)基本图像处理(去噪、边缘检测、角点检测、采样与插值、色彩变换、形态学处理、直方图、图像金字塔结构)
(6)结构分析(连通域/分支、轮廓处理、距离转换、图像矩、模板匹配、霍夫变换、多项式逼近、曲线拟合、椭圆拟合、狄劳尼三角化)
(7)摄像头定标(寻找和跟踪定标模式、参数定标、基本矩阵估计、单应矩阵估计、立体视觉匹配)
(8)运动分析(光流、动作分割、目标跟踪)
(9)目标识别(特征方法、HMM模型)
(10)基本的GUI(显示图像/视频、键盘/鼠标操作、滑动条)
(11)图像标注(直线、曲线、多边形、文本标注)
3、OpenCV模块
a) CV-----核心函数库
b) CVAUX----辅助函数库
c) CXCORE---数据结构与线性代数库
d) HIGHGUI----GUI函数库
e) ML---机器学习函数库
4、有用的学习资源
(1) 参考手册:
<opencv-root>/docs/index.htm (译注:在你的OpenCV安装目录<opencv-root>内)
(2) 网络资源:
官方网站: http://www.intel.com/technology/computing/opencv/
软件下载: http://sourceforge.net/projects/opencvlibrary/
(3) 书籍:
Open Source Computer Vision Library
by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). chenyusiyuan: 补充以下书籍
Learning OpenCV - Computer Vision with the OpenCV Library
by Gary Bradski & Adrian Kaehler, O'Reilly Media, 1 st ed. (September, 2008).
OpenCV教程——基础篇
作者:刘瑞祯 于仕琪,北京航空航天大学出版社,出版日期:200706
(4) 视频处理例程(在 <opencv-root>/samples/c/):
颜色跟踪: camshiftdemo
点跟踪: lkdemo
动作分割: motempl
边缘检测: laplace
(5) 图像处理例程 (在 <opencv-root>/samples/c/):
边缘检测: edge
图像分割: pyramid_segmentation
形态学: morphology
直方图: demhist
距离变换: distrans
椭圆拟合: fitellipse
二、概述
1、计算机视觉:是将来自静止图像和视频的数据转换成一个决策或者新的表达方式的过程,所有这些转换都是为了达到某个目标。
计算机视觉问题:真实世界的变化(天气、光线、反射、运动),镜头和机械结构 的不完美,传感器上的长时间感应(运动模糊),传感器上和其他电子器件上的电子噪声,以及图像采集后的图像压缩引入的变化。
计算机视觉拟根据摄像机数据来采取行动或者作出决策,这样的行动或决策是在一个指定目的或任务的环境中来解决。通用的规律是:对计算机视觉应用环境的约束越多,则能够使用这些约束来简化问题,从而使最终的解决方案越可靠。
OpenCV的目标是为解决计算机视觉问题提供基本工具,在有些情况下,它提供的高层函数可以高效的解决计算机视觉中的一些很复杂的问题。
OpenCV的目的是开发一个普遍可用的计算机视觉库。
OpenCV最初有三大目标:
(1)为基本的视觉应用提供开放且优化的源代码
(2)代码应该是非常易读且可改写
(3)可移植、性能被优化的代码可以自由获取。
*****************************************************************************************************************************************************************************************
2013年2月27日更新
*****************************************************************************************************************************************************************************************
2、OpenCV主体分为五个模块:CV模块包含基本的图像处理函数和高级的计算机视觉算法。
MLL是机器学习库,包含一些基于统计的分类和聚类工具。
HighGUI包含图像和视频输入/输出的函数。
CXCore包含OpenCV的一些基本数据结构和相关函数。
*****************************************************************************************************************************************************************************************
2013年2月28日更新
*****************************************************************************************************************************************************************************************
三HighGUI中文参考手册
OpenCV为了用于生产级别的应用而设计的。HighGUI只是用来建立快速软件原型或是实验用的。它的设计意图是为用户提供简单易用的图形用户接口。
通常,你需要读入源图像到你的程序或者输出结果图像到磁盘。此外,需要简单的方法显示图像到监视器并且向允许(或受限的)用户提供输入。
注:在HighGUI中没有任何的方法工具能够为流畅的用户界面提供产品级的错误处理。如果你试图创建最终用户的应用,请不要使用HighGUI。相对来说,应当为你的目标系统参考特定的函数库。比如HighGUI中的摄像头输入方法(cvCreateCameraCapture)是为了易用设计的,然而,并不意味着它能够对热插拔作出反应。
1、HighGUI简单图形界面
(1)
2、HighGUI视频读写函数
(1)CvCapture
视频获取结构
结构CvCapture没有公共接口,它只能被用来作为视频获取函数的一个参数。
(2)cvCreateFileCapture
初始化从文件中获取的视频
函数原型为:
CvCapture* cvCreateFileCapture(const char* filename)
函数cvCreateFileCapture给指定文件中的视频流分配和初始化CvCapture结构;
当分配不再使用时,它应该使用cvReleaseCapture函数释放掉
(3)cvCreateCameraCapture
初始化从摄像头中获取视频
函数原型:
CvCapture* cvCreateCameraCapture( int index );
index
要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。
函数cvCreateCameraCapture给从摄像头的视频流分配和初始化CvCapture结构。目前在Windows下可使用两种接口:Video for Windows(VFW)和Matrox ImagingLibrary(MIL); Linux下也有两种接口:V4L和FireWire(IEEE1394)。
释放这个结构,使用函数cvReleaseCapture。
(4)cvReleaseCapture
释放CvCapture结构
void cvReleaseCapture(CvCapture** capture)
函数cvReleaseCapture释放有cvCreateFileCapture或者cvCreateCameraCapture分配的CvCapture结构;
注:若从capture中使用cvQueryFrame获取图像指针,在releaseCapture的时候同时函数释放图像指针,用户不用再自己释放。
(5)cvGrabFrame
从摄像头或者视频文件中抓取帧
int cvGrabFrame( CvCapture* capture );
capture 视频获取结构。
函数cvGrabFrame从摄像头或者文件中抓取帧。被抓取的帧在内部被存储。这个函数的目的是快速的抓取帧,这一点对同时从几个摄像头读取数据的同步是很重要的。被抓取的帧可能是压缩的格式(由摄像头/驱动定义),所以没有被公开出来。如果要取回获取的帧,请使用cvRetrieveFrame。
(6)cvRetrieveFrame
取回由函数cvGrabFrame抓取的图像
IplImage* cvRetrieveFrame( CvCapture* capture );
capture 视频获取结构。
函数cvRetrieveFrame返回由函数cvGrabFrame 抓取的图像的指针。返回的图像不可以被用户释放或者修改。
(7)cvQueryFrame
从摄像头或者文件中抓取并返回一帧
IplImage* cvQueryFrame(CvCapture* capture)
函数功能:从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。抓取后,capture被指向下一帧,可用cvSetCaptureProperty调整capture到合适的帧。
注:cvQueryFrame返回的指针总是指向同一块内存,建议cvQueryFrame后拷贝一份,而且返回额帧需要FLIP后才符合OPENCV的坐标系。托返回值为NULL,说明到了视频的最后一帧。
(8)
获得视频获取结构的属性
double cvGetCaptureProperty( CvCapture* capture, int property_id );
函数cvGetCaptureProperty获得摄像头或者视频文件的指定属性。
译者注:有时候这个函数在cvQueryFrame被调用一次后,再调用cvGetCaptureProperty才会返回正确的数值。这是一个bug,建议在调用此函数前先调用cvQueryFrame。
(9)
设置视频获取属性
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
函数cvSetCaptureProperty设置指定视频获取的属性。目前这个函数对视频文件只支持: CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO
(10)
创建视频文件写入器
typedef struct CvVideoWriter CvVideoWriter; CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );
函数cvCreateVideoWriter创建视频写入器结构。
(11)
释放视频写入器
void cvReleaseVideoWriter( CvVideoWriter** writer );
函数cvReleaseVideoWriter结束视频文件的写入并且释放这个结构。
(12)
写入一帧到一个视频文件中
int cvWriteFrame( CvVideoWriter* writer, const IplImage* image );
函数cvWriteFrame写入/附加到视频文件一帧。
成功返回1,不成功返回0。
在OpenCV中,我们必须确认被释放的空间必须是我们显式分配的。
*****************************************************************************************************************************************************************************************
2013年3月7日更新
*****************************************************************************************************************************************************************************************
四、OpenCV的基本数据类型
OpenCV提供了多种基本数据类型,虽然这些数据类型在C语言中不是基本类型,但是结构都很简单,可将它们作为原子类型。
1、CvPoint:是一个包含integer类型成员x和y的简单结构体。
CvPoint有两个变体类型:CvPoint2D32f和CvPoint3D32f。前者同样有两个成员x,y,但他们都是浮点类型;而后者却多了一个浮点类型的成员z。
2、CvSize:数据成员时integer类型的width和height,如果希望使用浮点类型,则选用CvSize的变体类型CvSize2D32f。
3、CvRect:派生于CvPoint和CvSize,它包含4个数据成员:x、y、width和height,该类型也是一个复合类型。
4、CvScalar经常用来代替1、2、或者3个实数成员(在这个情况下,不需要的分量被忽略)。CvScalar有一个单独的成员val,它是一个指向4个双精度浮点数数组的指针。
注:所有这些数据类型具有以名称来定义的构造函数,例如cvSize()。构造函数通常具有与结构类型一样的名称,只是首字母不大写。
5、IplImage是我们用来为通常所说的图像进行编码的基本结构,这些图像可能是灰度、彩色、4通道的(RGB+alpha)
*****************************************************************************************************************************************************************************************
2013年3月11日更新
*****************************************************************************************************************************************************************************************
八、RGB颜色空间
1、三基色原理
2、互补光:当两种光按照适当比例混合时得到白光,则称这两种光为互补光
3、亮度:根据人们的感受,绿光最亮;故亮度公式为:Y = 0.299 * R + 0.587 * G + 0.114 * B
4、灰度图其实是表示的亮度的概念