使用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)
{
}
执行结果:
在 这边,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 函数无法执行,而这边的程序,就用第二的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网站上下载