原创 GUI界面的制作-"cvcam.h"视讯函式库(3)

2009-2-20 16:00 2182 9 9 分类: 软件与OS

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

使用cvcam.hAVI檔播放
#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)
{
}

执行结果:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

在这边,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);
    }
}

执行结果:


(
中间用鼠标暂停了两次)

为什么要用两个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函式无法执行,而这边的程序,就用第二的AVI档来做影片播放,这边的功能使用上也是很方便,跟前面的视讯播放一样,可以开始,暂停,继续,结束等操作,也可以藉由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
档案代号);


 

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条