《学习OpenCV》 学习笔记

一、简介

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)

cvGetCaptureProperty

获得视频获取结构的属性

double cvGetCaptureProperty( CvCapture* capture, int property_id );
capture 
视频获取结构。
property_id 
属性标识。可以是下面之一:
CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳
CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度
CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度
CV_CAP_PROP_FPS - 帧率
CV_CAP_PROP_FOURCC - 表示codec的四个字符
CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数

函数cvGetCaptureProperty获得摄像头或者视频文件的指定属性。

译者注:有时候这个函数在cvQueryFrame被调用一次后,再调用cvGetCaptureProperty才会返回正确的数值。这是一个bug,建议在调用此函数前先调用cvQueryFrame。



(9)

cvSetCaptureProperty

设置视频获取属性

int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
capture 
视频获取结构。
property_id 
属性标识符。可以是下面之一:
CV_CAP_PROP_POS_MSEC - 从文件开始的位置,单位为毫秒
CV_CAP_PROP_POS_FRAMES - 单位为帧数的位置(只对视频文件有效)
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流的帧宽度(只对摄像头有效)
CV_CAP_PROP_FRAME_HEIGHT - 视频流的帧高度(只对摄像头有效)
CV_CAP_PROP_FPS - 帧率(只对摄像头有效)
CV_CAP_PROP_FOURCC - 表示codec的四个字符(只对摄像头有效)
value 
属性的值。

函数cvSetCaptureProperty设置指定视频获取的属性。目前这个函数对视频文件只支持: CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO


(10)

cvCreateVideoWriter

创建视频文件写入器

typedef struct CvVideoWriter CvVideoWriter;
CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );
filename 
输出视频文件名。
fourcc 
四个字符用来表示压缩帧的codec 例如,CV_FOURCC('P','I','M','1')是MPEG-1 codec, CV_FOURCC('M','J','P','G')是motion-jpeg codec等。 在Win32下,如果传入参数-1,可以从一个对话框中选择压缩方法和压缩参数。
fps 
被创建视频流的帧率。
frame_size 
视频流的大小。
is_color 
如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。

函数cvCreateVideoWriter创建视频写入器结构。



(11)

cvReleaseVideoWriter

释放视频写入器

void cvReleaseVideoWriter( CvVideoWriter** writer );
writer 
指向视频写入器的指针。

函数cvReleaseVideoWriter结束视频文件的写入并且释放这个结构。



(12)

cvWriteFrame

写入一帧到一个视频文件中

int cvWriteFrame( CvVideoWriter* writer, const IplImage* image );
writer 
视频写入器结构。
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、灰度图其实是表示的亮度的概念






































你可能感兴趣的:(opencv)