视频GUI接口程序设计,包括了捕捉视频画面,存取AVI文件,将视频画面存成AVI档,这边先从视频存成AVI开始,将最初的Webcam播放程序在做调整,并详细说明所有capture类的子程序内容.
webcam程序代码存成AVI文件
#include <highgui.h>
#include <stdio.h>
int main()
{
CvCapture *capture;
IplImage *frame;
capture=cvCreateCameraCapture(0);
cvNamedWindow("Webcam",0);
CvVideoWriter *writer;
char AviFileName[]="Output.avi";
int AviForamt = -1;
int FPS = 25;
CvSize AviSize = cvSize(640,480);
int AviColor = 1;
writer=cvCreateVideoWriter(AviFileName,AviForamt,FPS,AviSize,AviColor);
int i=0;
while(true)
{
frame = cvQueryFrame(capture);
cvWriteFrame(writer,frame);
cvShowImage("Webcam",frame);
printf("%d\n",i);
if(cvWaitKey(20)>0) break;
i++;
}
cvReleaseCapture(&capture);
cvReleaseVideoWriter(&writer);
cvDestroyWindow("Webcam");
}
先开一个CvCapture及IplImage,用cvCreateCameraCapture()选定视频装置编号,给窗口命名,接着,就是写入AVI文件的重头戏啦,用CvVideoWriter建立一个writer的数据结构,给它AVI文件名,AVI格式,FPS(frame per second)每秒图片播放频率(即帧率),CvSize数据结构及Avi文件的颜色种类,再用cvWriteFrame()写入AVI文件。最后,记得用 cvReleaseVideoWriter()把CvVideoWriter数据结构释放,cvReleaseVideoWriter()非常重要,因为AVI文件的文件格式收尾就是要用到cvReleaseVideoWriter(),也就是说,如果不用到 cvReleaseVideoWriter(),AVI文件就无法打开.这边,先从cvCreateCameraCapture()详细叙述.
多视频接口的打开,也是OpenCV不错的应用,它的使用方法就是将cvCreateCameraCapture()的装置代号重复使用,以下就是一个简单的多视频画面打开的实例.
多个Webcam的程序实例
#include <highgui.h>
#include <stdio.h>
#include <windows.h>
int main()
{
CvCapture *capture0;
CvCapture *capture1;
IplImage *frame0;
IplImage *frame1;
capture0 =cvCaptureFromCAM(0);
capture1 =cvCaptureFromCAM(0);
cvNamedWindow("Webcam0",1);
cvNamedWindow("Webcam1",1);
while(true)
{
frame0 = cvQueryFrame(capture0);
frame1 = cvQueryFrame(capture1);
cvShowImage("Webcam0",frame0);
cvShowImage("Webcam1",frame1);
if(cvWaitKey(10)>=0)
{
break;
}
}
cvReleaseCapture(&capture0);
cvDestroyWindow("Webcam0");
}
执行结果:
(1)选择视频装置
(2)两台Webcam同步播放
上面的程序,会跳出一个接口让人选择视频装置,这时选择其中一个装置就可以同步播放啦,但是,对于两个视频装置二择一的写法,cvCreateCameraCapture()是不支持的,如果要将装置做二择一个配置,可以参考后面"cvcam.h"的相关配置.
cvCreateCameraCapture()
其实跟cvCaptureFromCAM()是一样的,它被OpenCV定义成
#define cvCaptureFromCAM cvCreateCameraCapture
所以,当用cvCaptureFromCAM()会自动替换成cvCreateCameraCapture(),而在视频装置的使用上也大有学问,一般视频装置是0是自动侦测,有两台以上就用函数及它的装置代号重复呼叫,而它可以支持各种特殊装置,如下:
#define CV_CAP_ANY 0 // autodetect
#define CV_CAP_MIL 100 // MIL proprietary drivers
#define CV_CAP_VFW 200 // platform native
#define CV_CAP_V4L 200
#define CV_CAP_V4L2 200
#define CV_CAP_FIREWARE 300 // IEEE 1394 drivers
#define CV_CAP_IEEE1394 300
#define CV_CAP_DC1394 300
#define CV_CAP_CMU1394 300
#define CV_CAP_STEREO 400 // TYZX proprietary drivers
#define CV_CAP_TYZX 400
#define CV_TYZX_LEFT 400
#define CV_TYZX_RIGHT 401
#define CV_TYZX_COLOR 402
#define CV_TYZX_Z 403
#define CV_CAP_QT 500 // QuickTime
对于多视频装置的实例,假如,有两Window XP(VFW)的视频装置要控制,则用两个相同的cvCreateCameraCapture()函数及两个相同的CV_CAP_VFW代号,而OpenCV会有接口来选择目标装置.
cvCreateCameraCapture(装置数字代号);
cvCreateVideoWriter()
它要放的参数分别为AVI文件名,AVI格式,FPS,CvSize数据结构及AVI文件的颜色种类,AVI的格式有很多种,由于影片有很多各个不同的压缩格式,因此,被分为非常多类,许多的种类也只是在学术界采用,real player及media player很多都不适用,这边压缩格式的规格分为:
CV_FOURCC('P','I','M','1') MPEG-1 codec
CV_FOURCC('M','J','P','G') motion-jpeg codec (does not work well)
CV_FOURCC('M', 'P', '4', '2') MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') H263 codec
CV_FOURCC('I', '2', '6', '3') H263I codec
CV_FOURCC('F', 'L', 'V', '1') FLV1 codec
它的压缩格是参数方法被定义在"highgui.h"里的
#define CV_FOURCC(c1,c2,c3,c4) \
(((c1)&
255) + (((c2)&
255)<<8) + (((c3)&
255)<<16) + (((c4)&
255)<<24))
如果要使用MPEG-1则直接使用int AviForamt=CV_FOURCC('P','I','M','1');就好啦,不过光是mpge-1压缩格式real play跟media play就不支持播放,比较建议的是直接用-1,会有GUI接口帮你自己选择文件格式.虽然有些格是很多播放程序也是不支持,不过用起来方便许多.再 来,FPS,每秒Frame的播放速度,frame有很多的翻译,也可以叫它做框页,用来做每秒画面显示的速度.AVI颜色种类,这个其实就很简单啦,只 有0跟1,0是黑白,1是彩色.
cvCreateVideoWriter("AVI档名",AVI格式参数或代号,FPS,AVI大小CvSize数据结构,AVI颜色种类代号);
cvQueryFrame()
其实这是两个子程序组合而成的,分别是cvGrabFrame()+cvRetrieveFrame(),这两个子程序的实作会在下面的程序代码用出.
IplImage* cvQueryFrame(capture数据结构);
cvWriteFrame()
将frame写入writer数据结构.
cvWriteFrame(writer数据结构,frame数据结构);
cvReleaseVideoWriter()
释放writer数据结构,这边cvReleaseVideoWriter()不只做了释放数据结构的功能,还包括的AVI文件格式的结尾制作,再做写入AVI档时一定要有cvReleaseVideoWriter()做结尾.
cvReleaseVideoWriter(writer数据结构)
--
附注:opencv1.1 取消了AviForamt=-1的功能,并且要挂上ffopencv的函数库才能使用,关于avi文件的存取,必须要去Yahoo Group下载ffopencv110.dll覆盖到C:\Program Files\OpenCV\bin的目录底下
然后只能在Visual Studio的平台才能使用.
ffopencv使用的是ffmpeg library,ffmpeg只支持gcc 4.3版以上的编译器,而Dev-C++使用的是gcc 3.4.2版的编译器,因此在Dev-C++使用Opencv 1.1播放avi档还是会有Error.