GUI接口的制作 - 视频,AVI文件存储,多视频装置

风在竹林 posted @ 2009年7月12日 23:30 in OpenCV with tags OpenCV窗口接口程序设计 , 4690 阅读

视频GUI接口程序设计,包括了捕捉视频画面,存取AVI文件,将视频画面存成AVI档,这边先从视频存成AVI开始,将最初的Webcam播放程序在做调整,并详细说明所有capture类的子程序内容.

webcam程序代码存成AVI文件

#include <cv.h>
#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 <cv.h>
#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.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter