1、Opencv视频教程Opencv结构与内容Opencv结构ncxcorencvnMachine Learning(ML)nHighGUIcxcoren基础结构:CvPoint,CvSize,CvScalar等n数组操作:cvCreateImage,cvCreateMat等n动态结构:CvMemStorage,CvMemBlock等n绘图函数:cvLine,cvRectangle等n数据保存和运行时类型信息:CvFileStorage,cvOpenFileStorage等n错误处理和系统函数:cvGetErrStatus,cvAlloc,cvFree等cvn图像处理:cvSobel,cvCann
2、y等n结构分析:ContourArea等n运动分析与目标跟踪:cvMeanShift等n模式识别:CvHaarFeaturen摄像头定标与三维重建:cvCalibrateCMachine Learning(ML)n包含许多聚类、分类和数据分析函数。如Bayes分类器,K近邻算法,支持向量机,决策树,神经网络等等。HighGUIn图像界面函数:cvNamedWindown读图像和保存图像:cvLoadImage,cvSaveImagen读视频和写视频:CvCreateFileCapture等cvcamn摄像机接口,在Opencv1.0以后的版本中已经被移除cvauxn该模块中一般存放一些即将被淘
3、汰的算法和函数(如基于嵌入式隐马尔科夫的人脸识别算法),还包含一些实验性的算法和函数(前景检测,背景剔除等)Opencv的结构Opencv视频教程显示图像第一个程序:显示图像基于基于Opencv,我们可以读取各种图像文件,我们可以读取各种图像文件,视频文件,还可以读取摄像头。这些功能视频文件,还可以读取摄像头。这些功能是是Opencv开发包中开发包中HighGUI工具集的一部工具集的一部分。下面,我们就使用其中的一些功能来分。下面,我们就使用其中的一些功能来实现如何显示一幅图像。实现如何显示一幅图像。显示图像代码显示图像代码n#include highgui.hnint main(int ar
4、gc,char*argv)nnIplImage*src=cvLoadImage(F:psbCA2V1GZ7.jpg,1);ncvNamedWindow(show_image);ncvShowImage(show_image,src);ncvWaitKey(0);nreturn 0;cvLoadImage(char*filename,int flags=CV_LOAD_IMAGE_COLOR)nFilename:图像所在路径nFlags:n/*图像颜色不变*/n#define CV_LOAD_IMAGE_UNCHANGED -1n/*灰度图像(单通道)*/n#define CV_LOAD_IMA
5、GE_GRAYSCALE 0n/*彩色图像(3通道图像)*/n#define CV_LOAD_IMAGE_COLOR cvLoadImage参数说明nFlags:n/*则输入图像格式可以为8位无符号,16位无符号,32位有符号或者32位浮点型*/n#define CV_LOAD_IMAGE_ANYDEPTH 2n/*保持原样*/n#define CV_LOAD_IMAGE_ANYCOLOR cvLoadImage参数说明n如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR n如果输入有冲突的标志,将采用较小的数字值。比如CV
6、_LOAD_IMAGE_GRAYSCALE|CV_LOAD_IMAGE_COLOR将载入单通道图。cvLoadImage的功能n通过文件名确定被加载图像的格式,并且该函数在内部分配图像数据结构所需要的内存空间。n支持的图像格式:BMP,DIB,JPEG,JPE,PNG,PBM,PGM,PPM,SR,RAS,TIFF。Int cvNamedWindow(char*name,int flagsnname:窗口的标志。如果已经有同名窗口,则该函数什么也不干。nFlags:CV_WINDOW_AUTOSIZE,会根据图像大小自动调整窗口大小。如果是0,则窗口大小不变。cvShowImage(char*
7、name,IplImage*dst)功能:在指定窗口上显示图像。nname:窗口的标志。这个标志是cvNamedWindow函数设定的。ndst:被显示的图像。Int cvWaitKey(int key)nKey:如果key的值是大于0的数,那么该函数的功能是,在此处暂停key毫秒。如果是小于等于0的数,那么,该函数是在等待用户的按键输入。cvReleaseImage(IplImage*src)n释放图像空间。cvDestroyWindow(char*name)n注销一个窗口。同时释放为该窗口所分配的所有内存(包括窗口内部的图像内存缓冲区)Opencv视频教程Opencv读取视频Opencv读
8、取视频代码n#include highgui.hnint main(int argc,char*argv)nncvNamedWindow(avi);nCvCapture*capture=cvCreateFileCapture(“视频文件路径视频文件路径);nIplImage*frame;nwhile(1)nnframe=cvQueryFrame(capture);nif(!frame)break;ncvShowImage(avi,frame);nchar c=cvWaitKey(33);nif(c=27)nbreak;nncvReleaseCapture(&capture);ncvDestro
9、yWindow(avi);nreturn 0;结构体结构体CvCapturenCvCapture 是一个结构体,用来保存图像捕获所需要的信息。是一个结构体,用来保存图像捕获所需要的信息。opencv提供两种方式从外部捕获图像提供两种方式从外部捕获图像n一种是从摄像头中,一种是从摄像头中,n一种是通过解码视频得到图像。一种是通过解码视频得到图像。两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。帧后都要保存相应的状态和参数。比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器比如从视频文件
10、中获取,需要保存视频文件的文件名,相应的解码器类型,下一次如果要获取将需要解码哪一帧等。类型,下一次如果要获取将需要解码哪一帧等。这些信息都保存在这些信息都保存在CvCapture结构中,每获取一帧后,这些信息都将被更新,获取下一结构中,每获取一帧后,这些信息都将被更新,获取下一帧需要将新信息传给获取的帧需要将新信息传给获取的api接口接口cvCreateFileCapture(char*name)n通过输入要读取的avi文件的路径,然后,该函数返回一个指向CvCapture结构体的指针。cvQueryFrame(capture)n输入一个CvCapture类型的指针,该函数主要功能是将视频文
11、件的下一帧加载到内存。与cvLoadImage的不同之处是,该函数不重新分配内存空间。C=cvWaitKey(33)n当前帧被显示后,等待33毫秒。如果用户触发了一个按键,c会被设置成这个按键的ASCII码,否则会被设置成-1。ncvWaitKey(33)在此处的另外一个作用是,控制帧率。cvReleaseCapture(&capture)释放为CvCapture结构体开辟的内存空间关闭打开的AVI文件相关的文件句柄读取摄像头n只需把cvCreateFileCapture改成改成cvCreateCameraCapture即可。即可。该函数的输入参数是一个ID号,只有存在多个摄像头时才起作用。当
12、ID=-1时,表示随机选择一个。HighGUI做了很多工作,使得摄像机图像序列像一个视频文件一样。在第4章,会有更详细的介绍。总结常见问题(1)视频文件路径没写对(2)没有安装解码器(3)如果使用的是Opencv2.0或更高版本,那么,能否正确加载opencv_ffmpeg210.dll(4)尽管是AVI文件,但也可能使用了某种codec,例如:MJPEG Decompressor。需要把它转换OpenCV支持的AVI文件.OpenCV支持的AVI。例如使用狸窝全能视频转换器,在预置方案处,选择AVI-Audio_Video Interleaved(*.avi)。或者使用格式工厂也可以。(5)
13、读摄像头数据,需要安装与摄像头相应的驱动程序。Opencv视频教程视频播放控制获取摄像头属性的函数ndouble cvGetCaptureProperty(CvCapture*capture,int property_id)nCV_CAP_PROP_POS_MSEC-影片目前位置,为毫秒数或者视频获取时间戳nCV_CAP_PROP_POS_FRAMES-将被下一步解压/获取的帧索引,以0为起点nCV_CAP_PROP_POS_AVI_RATIO-视频文件的相对位置(0-影片的开始,1-影片的结尾)nCV_CAP_PROP_FRAME_WIDTH-视频流中的帧宽度nCV_CAP_PROP_FRA
14、ME_HEIGHT-视频流中的帧高度nCV_CAP_PROP_FPS-帧率nCV_CAP_PROP_FOURCC-表示codec的四个字符nCV_CAP_PROP_FRAME_COUNT-视频文件中帧的总数 一个bugn有时候函数cvGetCaptureProperty在cvQueryFrame被调用一次后,再调用cvGetCaptureProperty才会返回正确的数值。这是一个bug,建议在调用此函数前先调用cvQueryFrame。设置摄像头属性的函数nint cvSetCaptureProperty(CvCapture*capture,int property_id,double va
15、lue);ncapture 视频获取结构。nproperty_id 属性标识符。可以是下面之一:nCV_CAP_PROP_POS_MSEC-从文件开始的位置,单位为毫秒nCV_CAP_PROP_POS_FRAMES-单位为帧数的位置(只对视频文件有效)nCV_CAP_PROP_POS_AVI_RATIO-视频文件的相对位置(0-影片的开始,1-影片的结尾)nCV_CAP_PROP_FRAME_WIDTH-视频流的帧宽度(只对摄像头有效)nCV_CAP_PROP_FRAME_HEIGHT-视频流的帧高度(只对摄像头有效)nCV_CAP_PROP_FPS-帧率(只对摄像头有效)nCV_CAP_PR
16、OP_FOURCC-表示codec的四个字符(只对摄像头有效)value 属性的值。n函数cvSetCaptureProperty设置指定视频获取的属性。目前这个函数对视频文件只支持:CV_CAP_PROP_POS_MSEC,CV_CAP_PROP_POS_FRAMES,CV_CAP_PROP_POS_AVI_RATIO 创建滚动条创建滚动条n该函数为开放计算机视觉(OpenCV)库库函数,创建trackbar并将它添加到指定的窗口。n定义:定义:nCV_EXTERN_C_FUNCPTR(void(*CvTrackbarCallback)(int pos);nint cvCreateTrack
17、bar(const char*trackbar_name,const char*window_name,int*value,int count,CvTrackbarCallback on_change);创建滚动条创建滚动条n参数:参数:ntrackbar_name 被创建的trackbar名字。nwindow_name 窗口名字,这个窗口将为被创建trackbar的父对象。nvalue 整数指针,它的值将反映滑块的位置。这个变量指定创建时的滑块位置。ncount滑块位置的最大值。最小值一直是0。non_change每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Fo
18、o(int);如果没有回调函数,这个值可以设为NULL。n函数cvCreateTrackbar用指定的名字和范围来创建trackbar(滑块或者范围控制),指定与trackbar位置同步的变量,并且指定当trackbar位置被改变的时候调用的回调函数。n被创建的trackbar默认显示在指定窗口的顶端,可以通过函数cvGetTrackbarPos来获取trackbar显示的位置信息,以及通过函数cvSetTrackbarPos来重新设置trackbar的显示位置。回调函数回调函数回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所
19、指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。Opencv视频教程Opencv写视频文件Opencv写视频文件核心函数ncvCreateVideoWriterncvWriteFramencvReleaseVideoWcvCreateVideoWriterncvCreateVideoWriter(const char*filename,int fourcc,double fps,CvSize frame_size,int is_color=1);nfilename:指定新建视频的文件名字。:指
20、定新建视频的文件名字。nfourcc:视频压缩的编码格式,目前有多种流行的编解码格式,但无论采用:视频压缩的编码格式,目前有多种流行的编解码格式,但无论采用哪种格式,都必须确认自己的电脑上安装了这种格式(编解码器的安装是独哪种格式,都必须确认自己的电脑上安装了这种格式(编解码器的安装是独立于立于opencv的)。的)。nfps:帧率,在第:帧率,在第4集中有介绍。集中有介绍。nframe_size:视频帧的大小。视频帧的大小。nis_color:如果非零,编如果非零,编 码器将希望得到彩色帧并进行编码码器将希望得到彩色帧并进行编码,否则,是灰度,否则,是灰度帧帧 cvWriteFramen功能
21、:把一帧图像写入到视频文件cvReleaseVideoWritern释放视频写入设备,如果不释放,会导致写视频失败,所以一定要记得释放。Opencv视频教程Opencv基本数据结构Opencv基本数据结构ncxcore/include/cxtypes.hnCvPoint系列系列nCvSize系列系列nCvSizenCvRectnCvScalarnCvACvPoint系列系列nCvPoint:表示图像中的点(见示意图)nCvPoint2D32f:二维空间中的点nCvPoint3D32f:三维空间中的点n构造函数:cvPointXXXX()。注意,这是c风格的代码,构造函数是内联函数,并不是c+中
22、的类的构造函数一样。CvSize系列nCvSize:图像的尺寸nCvSize2D32f:如果想用浮点型。CvRectn可以用来表示图像的部分区域(示意图)CvScalarn包含4个浮点成员,可以用来表示表示B,G,R,alpha。(示意图)n有三个构造函数:cvScalar,cvRealScalar,cvScalarACvACvArrn虽然Opencv1.0是大部分是由C语言完成,但是他使用的结构也是遵循面向对象的思想的。CvMat与IplImage的关系就如同C+中的继承关系,IplImage可以视为从CvMat派生的。CvArr可以视为抽象类。(例子展示)Opencv视频教程CvMat结构
23、体CvMat结构体定义ntypedef struct CvMatnn int type;n int step;n /*for internal use only*/n int*refcount;n int hdr_refcount;n unionn n uchar*ptr;n short*s;n int*i;n float*fl;n double*db;n data;n#ifdef _cplusplusn unionn n int rows;n int height;n ;n unionn n int cols;n int width;n ;n#elsen int rows;n int col
24、s;n#endifnnCvMat;创建一个矩阵,方式一创建一个矩阵,方式一cvCreateMat(int rows,int cols,int type)Type可以使任何预定义类型。Type的写法规则:CV_(S|U|F)Cnumber_of_channels。创建一个矩阵,方式二ncvCreateMatHeader()函数创建CvMat结构体,不分配数据内存ncvCreateData()函数分配数据需要的内存从数组创建矩阵,方式三从数组创建矩阵,方式三ncvInitMatHeader()函数,在已有的CvMat结构体上初始化矩阵。克隆矩阵,方式四ncvCloneMat(),该函数依据现有矩阵克隆一个矩阵,分配了独立的空间,需要使用cvReleaseMat()释放。获取矩阵的相关属性n获取矩阵的数据类型:cvGetElemTypen获取矩阵的通道数(维度):cvGetDimsn获取矩阵某一个维度上的大小:cvGetDimSizen二维矩阵获取矩阵大小:cvGetSize