"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)
{
}
执行结果:
<?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条评论)
登录后参与讨论