VC++环境下的视频图像的开发

时间:2022-08-17 11:12:48

VC++环境下的视频图像的开发

摘 要:随着社会的不断发展和进步,监控系统在各行各业越来越广泛的被应用,监控已经从零散逐步走向集成化。本文首先分析了几种常用的数据采集方式,并对在VC++环境能采用的采集方式做了分析和说明。接着分析了视频信号的预览、录像功能及视频回放功能的实现等。

关键词:VC++;视频;通道

中图分类号:TP391

1 视频的采集分析

常用的视频采集方法有VWF、DirectShow和SDK三种。最早使用的是VWF,它是由一组库函数组成的数字视频软件包。是Microsoft公司推出用于实现视频捕捉、影像视频压缩及影像播放的。虽然它是随使Windows操作系统一起安装,可执行文件不需要附带额外的库文件就可以运行, VFW最致命的弱点是和一般的视频卡不兼容,所以在视频采集中一般不考虑用VFW技术。DirectShow支持多种媒体格式,比如ASF、MPEG、AVI、MP3、WAV,因为如此它容易实现媒体数据的采集、回放。SDK采集方式和上面两种不一样,它是监控卡厂家提供的开发视频监控的一组库函数,在用户按照自己的需求使用SDK库函数,不需要了解视频压缩、回放、网络传输技术,利用函数进行视频开发。本文以海康威视提供的SDK为例。视频画面的分割与预览

将多个检测点的视频图像同时在一台计算机进行显示就需要视频画面的分割与预览。在开发中,CEdit控件是实现视频画面的分割与预览的。因为类具有的继承性,所以定义一个新的Ceditwin类,在该类中增加一个能实现视频的预览、画面的分割等功能成员函数disp() 。一般控制需要监控程序一运行就能够进入预览画面,这一功能的实现是在Ceditwin类的WM_PAINT消息处理函数OnPaint() 中调用了显示函数 disp() ,多画面预览是在该函数中通过视频采集卡提供的StartVideoPreview() 函数实现的。StartVideoPreview() 函数能完成的功能比较多,使用也方便,这个函数的使用格式如下:

其定义为:int __stdcall StartVideoPreview(HANDLE hChannelHandle,HWND WndHandle, RECT *rect,BOOLEAN bOverlay, int VideoFormat, int FrameRate)

这个函数的参数和功能如下所示:

通道句柄 HANDLE hChannelHandle;

显示窗口句柄 HWND WndHandle;

显示窗口内的矩形区域 RECT *rect;

是否启用Overlay预览模式 BOOLEAN bOverlay; *

视频预览格式(目前无效 int VideoFormat;)

视频预览帧率(PAL:1-25,NTSC:1-30)int FrameRate;

这个函数被调后返回值:0是成功返回;如果失败则返回错误号。

需要特别说明的是,这个函数的功能是启动视频预览。其参数较多,其中通道句柄确定了要显示的通道号或检测点,窗口句柄则是指图像在哪个控件上显示,在该系统中,图像在Cedit控件中显示。显示窗口内的矩形区域,指明了当前通道号的图像信息的显示位置,正因为有了这个参数,我们将Cedit控件的整个区域可划分为一系列小矩形,每个矩形区域可显示一路图像,实现了多画面的分割与显示。显示模式置为Overlay模式,视频预览帧率置为25,这样视频图像连续顺畅,没有迟钝的现象。多画面预览的设计思路如下所示。

图1 画面的分割与预览流程图

在上面的流程图中,画面的显示是通过显示方式在disp() 函数中判断是单画面还是多画面,然后通过调用启动视频预览函数StartVideoPreview() 在相应的区域中显示图像实现的。

当对某一通道的画面进行双击或通过猪舍选择框进行猪舍号选择时,预览画面从多通道界面切换到当前所选择的猪舍画面。实现的方法是当进行双击或进行通道切换后,将显示方式置为单界面方式,接着置当前通道号,然后调用显示函数disp() 便实现了通道的切换。

2 视频录像的开发

一般情况下监控不仅仅只为了简单的监控,能看见画面就行,还要求能够实现录像。如果需要对所选择的通道进行录像时,单击“录像”按钮,这一按钮就会变成“监控”,这些功能是通过响应OnRec() 函数实现的同时实现对所选择的通道进行录像;当再次单击“监控”按钮时,按钮标题变为“录像”,此时停止了录像。

对视频信息的录像,简单地说就是将视频采集卡提供的合法数据流写到指定的文件下。比如海康视频采集卡提供的数据流信息如下:

非法帧数据 PktError

系统头PktSysHeader

帧包 PktIFrames I

帧包 PktPFrames P

帧包 PktBBPFrames BBP

音频帧包 PktAudioFrames

动态监测包 PktMotionDetection

在一般的系统中,对数据流的捕获,使用的是直接读取方式,通过直接读取回调函数 StreamDirectReadCallback() 直接对用编码数据流数进行处理。使用这一函数时必须在初始化函数中通过注册编码图像数据流直接读取回调函数注册RegisterStreamDirectReadCallback(::StreamDirectReadCallback,this) 后,才能直接读取。

实现录像的过程为:启动StartVideoCapture(m_ChanHandle[ilastselect]) 主通道编码数据流捕获函数,然后由StreamDirectReadCallback() 检测视频采集卡的数据流的地址、长度、帧类型等,接着在该函数中判断是否为非法帧数据PktError或动态监测包PktMotionDetection,如不是这两类数据信息,则捕获的数据写入打开的文件中,如果是这两类信息,则不处理,这样便实现了录像的功能。

视频录像的回放是通过调用播放工具来回放保存在硬盘中的录像文件的。

3 小结

视频信号的分割、预览、切换既可以对所有监控现场的景象同时进行预览,也可以对某一个现场的影像进行单画面预览,还可以方便地切换到另一通道。同时对当前现场的景象进行录像功能的实现,更进一步的起到分析和监督的作用。

在实际的运行,这种视频监视界面美观大方,人机交互性强,参数设置方便,显示直观,操作简单。对摄像装置的运动控制灵活方便,

视频监视模块的开发与设计完全达到了监视功能的要求,操作简单方便,运行可靠稳定。视频监视功能对于提高管理水平,降低风险有积极的意义。

参考文献:

[1]齐舒.C++6.0开发技巧及实例剖析[M].北京:清华大学出版社,2000.

[2]宋坤,刘锐宁.Visual C++视频技术方案宝典[M].北京:人民邮电出版社,2008.

作者简介:杨至辉(1977.10-),男,甘肃会宁人,讲师,学士,研究方向:计算机科学与技术。

上一篇:向信息技术课堂45分钟要效率 下一篇:中职后勤物资管理系统的设计与开发