GUI接口的制作-"cvcam.h"视频函数库(3)

"cvcam.h"也可以做AVI文件的播放,它也可以同样利用方法呼叫来做frame的修改,而同样的,也是使用到IplImage的数据结构,这边做一个播放文件的程序

使用cvcam.h做AVI文件播放
#include <cvcam.h>
#include <cv.h>
#include <highgui.h>
#include <windows.h>

void CaptureCallback(IplImage *image);

int main()
{
    HWND CaptureWindow;
    cvNamedWindow("AVIplayer",0);
    CaptureWindow =(HWND)cvGetWindowHandle("AVIplayer");
    cvcamPlayAVI("Output.avi",CaptureWindow,640,480,(void *)&CaptureCallback);

    cvWaitKey(0);

}
void CaptureCallback(IplImage *frame)
{
}

执行结果:
  video

在 这边,CaptureCallback内没有任何程序代码,因为他的IplImage数据结构的Frame受到AVI文件的格式影响,如果说要用一般 Capture的文件格式,则在文件写入时要选择用全画面(未压缩),不过这样付出的代价是很惊人的,不用几秒钟就超过50MB的文件,而如果选择压缩格 式的话,IplImage数据结构就要符合该压缩格式的读档方式来对IplImage数据结构存取,因此,CaptureCallback()的框页制作,要符合使用的压缩格式来做画面的修改.除了这个,cvcamPlayAVI()也提供了对HWND的支持,因此可以选定目标窗口来做AVI影片播放的动作.

cvcamPlayAVI()
播放AVI文件的函数,它可以由自己定义的方法来修改frame的内容,但是要符合AVI压缩文件的文件格式.假如文件名称的地方改成0,则他会出现打开文件的窗口由使用者选择目标的AVI档,
cvcamPlayAVI("文件名称",窗口ID,播放宽度,播放高度,自行定义的方法呼叫名称);

再来用的是另一个AVI播放的函数,这个函数使用起来有点特别,有些地方要注意一下,这边拿两个AVI文件播放来做比较.

cvcam.h的AVI播放函数
#include <cvcam.h>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>


void CaptureCallback(IplImage *image);
void onMouse(int Event,int x,int y,int flags,void *param);

cvcamAVIFILE cvcamAVIFILE1;
cvcamAVIFILE cvcamAVIFILE2;
int main()
{
    HWND CaptureWindow;
    cvNamedWindow("AVIplayer",0);
    CaptureWindow = (HWND)cvGetWindowHandle("AVIplayer");
    char AVIFileName1[]="Output.avi";
    char AVIFileName2[]="Output2.avi";

    cvcamAVIFILE1=cvcamAVIOpenFile(AVIFileName1);
    printf("%d\n",cvcamAVIFILE1);
    cvcamAVIFILE2=cvcamAVIOpenFile(AVIFileName2);
    printf("%d\n",cvcamAVIFILE2);

    cvcamAVISetWindow(1,(void *)CaptureWindow);
    cvcamAVISetCallback(1,(void *)&CaptureCallback);
    cvcamAVISetSize(1,320,240);

    cvSetMouseCallback("AVIplayer",onMouse,NULL);

    cvcamAVIRun(1);

    cvWaitKey(0);

    cvcamAVIStop(1);
    cvcamAVICloseFile(0);
    cvcamAVICloseFile(1);
}

void CaptureCallback(IplImage *frame)
{

}
void onMouse(int Event,int x,int y,int flags,void* param )
{
    if(Event==CV_EVENT_LBUTTONDOWN)
    {
        cvcamAVIPause(1);

    }
    else if(Event==CV_EVENT_RBUTTONDOWN)
    {
        cvcamAVIResume(1);
    }
}

执行结果:
  video

为什么要用两个AVI文件来测试呢?因为在"cvcam.h"内定义的使用格式为

int cvcamAVICloseFile(cvcamAVIFILE file);
int cvcamAVISetWindow(cvcamAVIFILE file, void* window);
int cvcamAVISetCallback(cvcamAVIFILE file, void* callback);
int cvcamAVISetSize(cvcamAVIFILE file, int width, int height);
int cvcamAVIRun(cvcamAVIFILE file);
int cvcamAVIStop(cvcamAVIFILE file);
int cvcamAVIPause(cvcamAVIFILE file);
int cvcamAVIResume(cvcamAVIFILE file);
int cvcamAVIWaitCompletion(cvcamAVIFILE file);
int cvcamAVIIsRunning(cvcamAVIFILE file);

这将会产生一个很严重的冲突,实际上,OpenCV的程序人员是想让被打开的AVI文件能像视频播放程序的方式用装置代码表示,也就是,第一个avi档出现的时候就用代号0,第二个就用代号1,但不幸的,直接把cvcamAVIFILE丢给它会给它的数字是1000,而第二个数字是1001,这将会造成AVI 函数无法执行,而这边的程序,就用第二的AV文件来做影片播放,这边的功能使用上也是很方便,跟前面的视频播放一样,可以开始,暂停,继续,结束等操作, 也可以由HWND来做嵌入窗口,这边的设计就沿用了之前鼠标事件的做法.而他的框页修改的部分(CaptureCallback())也必须要参考 AVI文件的文件格式.

cvcamAVIOpenFile()
打开AVI文件,要用 cvcamAVIFILE数据结构接收,但实际上,可以不需要用到cvcamAVIFILE数据结构就可以执行,cvcamAVIOpenFile()之后的程序只要输入文件代码即可,就像视频的cvcamGetCamerasCount()使用方法一样.
cvcamAVIOpenFile("AVI文件名称");

cvcamAVICloseFile()
关闭AVI文件,如果不做这个动作的话程序执行结束会挂掉,参数要传给它AVI文件的代号.
cvcamAVICloseFile(AVI文件代号)

cvcamAVISetWindow()
配置程序要嵌入的窗口,给它AVI文件的代号,及窗口的HWND窗口ID.
cvcamAVISetWindow(AVI文件代号,HWND窗口代号);

cvcamAVISetCallback()
可以由此方法呼叫修改AVI档的frame,但是要符合AVI档的文件格式.
cvcamAVISetCallback(AVI文件代号,自行定义的子程序名称);

cvcamAVISetSize()
配置AVI文件的播放大小.
cvcamAVISetSize(AVI文件代号,画面宽度,画面高度);

cvcamAVIRun()
选定目标要播放的AVI文件
cvcamAVIRun(AVI文件代号);

cvcamAVIStop()
停止目标AVI文件的播放.
cvcamAVIStop(AVI文件代号);

cvcamAVIPause()
暂停目标正在播放的AVI文件.
cvcamAVIPause(AVI文件代号);

cvcamAVIResume()
继续执行目标被暂停的AVI文件.
cvcamAVIResume(AVI文件代号);

--
附注:Opencv1.0 only,如果opencv 1.1想要使用的话,可以到sourceforge的opencv网站上下载