使用DirectShow驱动摄像头
基于Directshow的H.264网络视频监控客户端实现
基于Directshow的H.264网络视频监控客户端实现彭锋;林和志;黄联芬【摘要】In order to realize the real-time broadcasting of H. 264 at video monitoring client, a method that combines Directshow with MFC is adopted. Directshow taken as a drive of the video player receives data from the network, performs cache, decoding and display, and provides the API for MFC, which is used to design UI to control the process of playing. After verification on PC, the player can smoothly play the H. 264 video stream received from network, and the packet loss rate islow. The innovation of this paper is to use Directshow to play smoothly real-time H. 264 stream received from network.%为了实现视频监控客户端对H.264实时播放,采用Directshow与MFC相结合的方法,用Directshow作为视频播放的驱动,从网络接收数据,完成缓存,解码显示及封装成MFC可调用的API,MFC用来设计户界面,对播放过程进行相应的控制,达到了播放从网络接收到的H.264视频的目的.经过PC机上验证,可以流畅地从网络上接收播放H.264视频流,并且丢包率很小.在此用Directshow来实时流畅的播放从网络上接收到的H.264视频流.【期刊名称】《现代电子技术》【年(卷),期】2011(034)008【总页数】3页(P118-120)【关键词】H.264;Directshow;MFC;网络视频监控【作者】彭锋;林和志;黄联芬【作者单位】厦门大学,福建,厦门,361005;厦门大学,福建,厦门,361005;厦门大学,福建,厦门,361005【正文语种】中文【中图分类】TN919-340 引言视频监控以其直观方便信息内容丰富而广泛应用于安保,监控等场合,成为商业,交通,住宅等领域防范的重要手段。
基于DirectShow的嵌入式Linux视频监控系统
( e a m n o l t n s& I o a o ni e n .H ahn n e i c ne& Tc nl y D p r e t fEe r i t co c n r t n E g e r g uz g U i r t o S i c fm i n i o v sy f e eho g 。Wu a 3 0 4 h a o hn 4 0 7 ,C i ) n
【 b tat hspprit d csa m ed dmu i dasre l c yt ae n Drc hw t h ooy T esre iei A src】T i ae nr ue n e b d e lme i uvia e ss m bsd o i t o e nlg. h evrs s o t ln e eS c d
维普资讯
文 章编 号 :0 2 8 9 (0 7 0 - 0 3 0 10 — 6 22 0 ) 10 8- 3
基于 ii 视频监控系统 D x th w的 e 嵌入式 LnrcS o u
赵石 磊 ,严 国萍
( 中科 技 大 学 电 子 与 信 息 工程 系 ,湖 北 武 汉 4 O 7 ) 华 3 04
b i n te Ln x sse a d te cin s e i b i i te W id w y tm h ti a c mpi e y rcS o e h oo y hs ul o h iu ytm n h l t i s ul Ol h n o s s se ta s c o l h d b Di th w tc n lg .T i t e d t s e p p r many it d c s t e a e il nr u e h mu i ra rbe iv le tte sre ie, e Di cS o e h ooy a d te d u l— ufr l t o h t ed po lm n ov d a h ev r sd t r th w tc n lg n h o be b f i h h e e s tc n lg n ov d a h l n ie eh oo y iv le tte ci tsd 。 e ’
基于DirectShow的MPEG-4数字视频监控系统的实现
基于DirectShow的MPEG-4数字视频监控系统的实现
张凯
【期刊名称】《《可编程控制器与工厂自动化(PLC FA)》》
【年(卷),期】2011(000)010
【摘要】本文主要介绍基于Directshow的MPEG-4数字监控系统的实现。
系统通过Directshow采集技术实现视频图像的流畅采集;采用MPEG-4图像压缩编码
方式,实现视频图像的高效压缩:通过网络,将监控的视频数据传输到远程监控计算机。
【总页数】4页(P60-63)
【作者】张凯
【作者单位】山东大学控制科学与工程学院
【正文语种】中文
【中图分类】TP277
【相关文献】
1.基于DirectShow的MPEG-4监控系统的设计与实现 [J], 钟礼秋;马争
2.基于MPEG-4的数字视频监控系统的设计和实现 [J], 陈莎;张江山
3.基于DirectShow的MPEG-4网络组播模块设计 [J], 施圣;鲜永菊
4.基于MPEG-4的远程数字视频监控系统设计与实现 [J], 邢征军;邵惠鹤;胡立生
5.基于DirectShow的MPEG-4监控系统的设计与实现 [J], 钟礼秋;马争
因版权原因,仅展示原文概要,查看原文内容请购买。
基于DirectShow的多摄像头视频采集
基于DirectShow的多摄像头视频采集1.为什么使用DirectShow笔者使用的是两个USB摄像头,单摄像头视频采集使用OpenCV的VideoCapture类没有问题,但是双摄像头就有问题,一个正常,另外一个采集不到信息,显示一片灰色。
网上有种解决方法是逆序打开摄像头,结果两个窗口是可以采集到视频信息,但是竟然是同一个摄像头的视频信息,无奈的只能使用DirectShow采集多摄像头视频信息。
先看看什么是DirectShow:DirectShow 是 DirectX 的组件之一, DirectX 软件开发包是 Microsoft 提供的一套在 Windows平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口。
这其中,DirectShow提供了应用程序从适当的硬件中捕捉和预览音、视频的能力。
数据源包括: VCR、 Camera、 TV Tuner、 Microphone 或其他的数据源。
应用程序可以立刻显示捕捉的数据(预览),或是保存到一个文件中。
摄像头采集信息常用的软件AMCap就是基于DirectShow SDK编写的。
查阅一下官方文档,感觉好难的样子,难道要新学一门“快过时”的技术吗?幸好于仕琪老师写了一个CCameraDS类,可直接返回IplImage,使用方便。
2.在VS2010中配置DirectShow并采集双目摄像头视频下载DirectShow相关文件,我已经共享在百度云盘,点击下载。
解压以后copy到D:\opencv里(放在这里为了管理方便)在解决资源管理器中的项目名称处右键\属性\配置属性\VC++目录,引用目录中添加DirectShow的include文件夹,我添加的是D:\opencv\DirectShow\Include在引用目录下面有一个库目录,添加DirectShow的Lib文件夹,我添加的是D:\opencv\DirectShow\Lib;下载CCameraDS类相关文件,点击下载。
DirectShow插件使用手册
DirectShow插件使用手册【摘要】本文档介绍了DirectShow连接相机时的插件使用,通过本套插件可连接海康的工业相机。
一、环境配置1.相机环境配置打开MVS,若PC与相机不在同一网段,则配置IP,设置好相机参数。
确保相机能在MVS上正常取流。
2.注册和注销插件在客户端MVS安装完成后,不会默认注册此插件,需要用户手动用管理员权限运行register.bat脚本注册此插件,插件脚本存放在Development\ThirdPartyPlatformAdapter\DirectShow文件夹内。
可用graphedt.exe程序查看是否注册成功,插件注册在Video Capture Source项内,如图1。
图1用管理员权限运行unregister.bat文件可注销已注册的DShow插件。
3.环境检测(1)在graphedt.exe程序中打开菜单Graph-Insert Filters…;(2)在Video Capture Source项内选择MvCamera DirectShow Source;(3)选中MvCamera DirectShow Source并右键打开Filter Properties…进行相机选择和参数获取和设置等操作,如图2;(4)在DirectShow Filters中选择Video Renderer,并将Video Out与Input相连接,如图3;(5)菜单Graph-Play进行预览;图2 属性页图3 连接页二、参考示例提供DirectShowDisplay示例程序供用户参考,对示例做简要介绍:DirectShowDisplay示例为控制台程序,路径为Development\Samples\DirectShow\DirectShowDisplay,支持Render播放。
在头文件MvDSSource.h内列出相机列表获取、参数获取、参数设置等接口供外部调用。
此示例程序可编译x86和x64版本,分别对应插件的x86和x64版本。
(MatLab、Labview)通过Directshow接口访问相机参数设置方法
DirectShow接口访问相机参数设置方法本文档适用于所有适用directshow接口访问相机的程序,例如MATLAB 和Labview的ImaqDx接口、Halcon的Directshow接口等。
MATLAB中,可以通过如下界面设置相机参数:Labview的NIMAX中可以通过如下界面设置相机参数:下面以Labview为例,介绍Labview中如何通过ImaqDx接口访问迈德威视工业相机。
目前,我们提供三种方式,在Labview中访问我们的相机:1.GigeVision接口。
仅我司GigE相机支持该方式访问。
2.直接基于SDK的DLL文件调用的方式。
该方式支持我们所有型号相机。
例程在安装目录的DEMO/LABVIEW/USEDLL文件夹中。
3.通过ImaqDx使用Directshow接口访问相机。
该方式支持我们所有型号相机。
Directshow接口是windows系统上的音视频标准接口,定义了一些预先约定好的协议,但是由于协议定义时间比较早,也没有为工业摄像头考虑参数接口,所以接口的参数配置上,没有像使用我们的SDK那样灵活。
我们针对此问题,做了一些特殊处理,扩展了Dircetshow接口中Camera Atrributes的“White Balance”属性,目前可以该方式进行如下操作:1.设置相机工作模式(连续采集、软触发、硬触发)方法:在Camera Atrributes中,设置“White Balance”属性的Value值●为0,则相机进入连续工作模式;●设置为1,则相机进入软触发工作模式;●设置为2则相机进入硬触发工作模式。
2.执行一次软触发方法:在Camera Atrributes中,设置“White Balance”属性的Value 值为3,则相机进行一次软触发,如果要多次软触发,则重复设置“White Balance”属性的Value值为3即可,每设置一次,进行一次软触发。
C#DirectShow预览摄像头并截图
C#DirectShow预览摄像头并截图C# DirectShow预览摄像头并截图,供⼤家参考,具体内容如下本事例通过Windows DirectX Filtergraph ⼀些列管道将电脑所接⼊视频采集设备的视频流播放到制定区域,通过ISampleGrabberCB接⼝的BufferCB回调函数截取图⽚。
⽤此⽅法预览图像cpu占⽤率极低,⽐其其他事件绑定并逐帧显⽰图像性能更佳。
UI布局:代码如下:using System;using System.Drawing;using System.Windows.Forms;using DirectShowLib;using System.Runtime.InteropServices;using Types;using System.Drawing.Imaging;namespace Test{public partial class FormDirect : Form, ISampleGrabberCB{private int _previewWidth = 640;private int _previewHeight = 480;private int _previewStride = 0;private int _previewFPS = 30;private volatile bool isGrab = false;IVideoWindow videoWindow = null;IMediaControl mediaControl = null;IFilterGraph2 graphBuilder = null;ICaptureGraphBuilder2 captureGraphBuilder = null;DsROTEntry rot = null;public FormDirect(){InitializeComponent();}private void button2_Click(object sender, EventArgs e){//截图isGrab = true;}private void button3_Click(object sender, EventArgs e){string button_text = button3.Text;if (button_text.Equals("Start Webcam")){button3.Text = "Stop Webcam";StartCamera();}else{button3.Text = "Start Webcam";StopCamera();}}private void StartCamera(){DsDevice[] devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);if (devices.Length == 0){MessageBox.Show("No USB webcam connected");button3.Text = "Start Webcam";return;}else{CaptureVideo(devices[0]);}}private void StopCamera(){button3.Text = "Start Webcam";CloseInterfaces();}public void CaptureVideo(DsDevice device){pictureBox1.Image = null;int hr = 0;IBaseFilter sourceFilter = null;ISampleGrabber sampleGrabber = null;try{// Get DirectShow interfacesGetInterfaces();// Attach the filter graph to the capture graphhr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder);DsError.ThrowExceptionForHR(hr);// Use the system device enumerator and class enumerator to find// a video capture/preview device, such as a desktop USB video camera.sourceFilter = SelectCaptureDevice(device);// Add Capture filter to graph.hr = this.graphBuilder.AddFilter(sourceFilter, "Video Capture");DsError.ThrowExceptionForHR(hr);// Initialize SampleGrabber.sampleGrabber = new SampleGrabber() as ISampleGrabber;// Configure SampleGrabber. Add preview callback.ConfigureSampleGrabber(sampleGrabber);// Add SampleGrabber to graph.hr = this.graphBuilder.AddFilter(sampleGrabber as IBaseFilter, "Frame Callback");DsError.ThrowExceptionForHR(hr);// Configure preview settings.SetConfigParams(this.captureGraphBuilder, sourceFilter, _previewFPS, _previewWidth, _previewHeight);// Render the previewhr = this.captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, sourceFilter, (sampleGrabber as IBaseFilter),null);DsError.ThrowExceptionForHR(hr);SaveSizeInfo(sampleGrabber);// Set video window style and positionSetupVideoWindow();// Add our graph to the running object table, which will allow// the GraphEdit application to "spy" on our graphrot = new DsROTEntry(this.graphBuilder);// Start previewing video datahr = this.mediaControl.Run();DsError.ThrowExceptionForHR(hr);}catch{MessageBox.Show("An unrecoverable error has occurred.");}finally{if (sourceFilter != null){Marshal.ReleaseComObject(sourceFilter);sourceFilter = null;}if (sampleGrabber != null){Marshal.ReleaseComObject(sampleGrabber);sampleGrabber = null;}}}public void CaptureVideo(){pictureBox1.Image = null;int hr = 0;IBaseFilter sourceFilter = null;ISampleGrabber sampleGrabber = null;try{// Get DirectShow interfacesGetInterfaces();// Attach the filter graph to the capture graphhr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder);DsError.ThrowExceptionForHR(hr);// Use the system device enumerator and class enumerator to find// a video capture/preview device, such as a desktop USB video camera.sourceFilter = FindCaptureDevice();// Add Capture filter to graph.hr = this.graphBuilder.AddFilter(sourceFilter, "Video Capture");DsError.ThrowExceptionForHR(hr);// Initialize SampleGrabber.sampleGrabber = new SampleGrabber() as ISampleGrabber;// Configure SampleGrabber. Add preview callback.ConfigureSampleGrabber(sampleGrabber);// Add SampleGrabber to graph.hr = this.graphBuilder.AddFilter(sampleGrabber as IBaseFilter, "Frame Callback");DsError.ThrowExceptionForHR(hr);// Configure preview settings.SetConfigParams(this.captureGraphBuilder, sourceFilter, _previewFPS, _previewWidth, _previewHeight);// Render the previewhr = this.captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, sourceFilter, (sampleGrabber as IBaseFilter),null); DsError.ThrowExceptionForHR(hr);SaveSizeInfo(sampleGrabber);// Set video window style and positionSetupVideoWindow();// Add our graph to the running object table, which will allow// the GraphEdit application to "spy" on our graphrot = new DsROTEntry(this.graphBuilder);// Start previewing video datahr = this.mediaControl.Run();DsError.ThrowExceptionForHR(hr);catch{MessageBox.Show("An unrecoverable error has occurred.");}finally{if (sourceFilter != null){Marshal.ReleaseComObject(sourceFilter);sourceFilter = null;}if (sampleGrabber != null){Marshal.ReleaseComObject(sampleGrabber);sampleGrabber = null;}}}public IBaseFilter SelectCaptureDevice(DsDevice device){object source = null;Guid iid = typeof(IBaseFilter).GUID;device.Mon.BindToObject(null, null, ref iid, out source);return (IBaseFilter)source;}public IBaseFilter FindCaptureDevice(){int hr = 0;#if USING_NET11UCOMIEnumMoniker classEnum = null;UCOMIMoniker[] moniker = new UCOMIMoniker[1];#elseIEnumMoniker classEnum = null;IMoniker[] moniker = new IMoniker[1];#endifobject source = null;// Create the system device enumeratorICreateDevEnum devEnum = (ICreateDevEnum)new CreateDevEnum();// Create an enumerator for the video capture deviceshr = devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, out classEnum, 0);DsError.ThrowExceptionForHR(hr);// The device enumerator is no more neededMarshal.ReleaseComObject(devEnum);// If there are no enumerators for the requested type, then// CreateClassEnumerator will succeed, but classEnum will be NULL.if (classEnum == null){throw new ApplicationException("No video capture device was detected.\r\n\r\n" +"This sample requires a video capture device, such as a USB WebCam,\r\n" + "to be installed and working properly. The sample will now close.");}// Use the first video capture device on the device list.// Note that if the Next() call succeeds but there are no monikers,// it will return 1 (S_FALSE) (which is not a failure). Therefore, we// check that the return code is 0 (S_OK).#if USING_NET11int i;if (classEnum.Next (moniker.Length, moniker, IntPtr.Zero) == 0)#elseif (classEnum.Next(moniker.Length, moniker, IntPtr.Zero) == 0)#endif{// Bind Moniker to a filter objectGuid iid = typeof(IBaseFilter).GUID;moniker[0].BindToObject(null, null, ref iid, out source);}else{throw new ApplicationException("Unable to access video capture device!");}// Release COM objectsMarshal.ReleaseComObject(moniker[0]);Marshal.ReleaseComObject(classEnum);// An exception is thrown if cast failreturn (IBaseFilter)source;public void GetInterfaces(){int hr = 0;// An exception is thrown if cast failthis.graphBuilder = (IFilterGraph2)new FilterGraph();this.captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();this.mediaControl = (IMediaControl)this.graphBuilder;this.videoWindow = (IVideoWindow)this.graphBuilder;DsError.ThrowExceptionForHR(hr);}public void CloseInterfaces(){if (mediaControl != null){int hr = mediaControl.StopWhenReady();DsError.ThrowExceptionForHR(hr);}if (videoWindow != null){videoWindow.put_Visible(OABool.False);videoWindow.put_Owner(IntPtr.Zero);}// Remove filter graph from the running object table.if (rot != null){rot.Dispose();rot = null;}// Release DirectShow interfaces.Marshal.ReleaseComObject(this.mediaControl); this.mediaControl = null;Marshal.ReleaseComObject(this.videoWindow); this.videoWindow = null;Marshal.ReleaseComObject(this.graphBuilder); this.graphBuilder = null;Marshal.ReleaseComObject(this.captureGraphBuilder); this.captureGraphBuilder = null;}public void SetupVideoWindow(){int hr = 0;// Set the video window to be a child of the PictureBoxhr = this.videoWindow.put_Owner(pictureBox1.Handle);DsError.ThrowExceptionForHR(hr);hr = this.videoWindow.put_WindowStyle(WindowStyle.Child);DsError.ThrowExceptionForHR(hr);// Make the video window visible, now that it is properly positionedhr = this.videoWindow.put_Visible(OABool.True);DsError.ThrowExceptionForHR(hr);// Set the video positionRectangle rc = pictureBox1.ClientRectangle;hr = videoWindow.SetWindowPosition(0, 0, _previewWidth, _previewHeight);DsError.ThrowExceptionForHR(hr);}private void SetConfigParams(ICaptureGraphBuilder2 capGraph, IBaseFilter capFilter, int iFrameRate, int iWidth, int iHeight) {int hr;object config;AMMediaType mediaType;// Find the stream config interfacehr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, capFilter, typeof(IAMStreamConfig).GUID, out config);IAMStreamConfig videoStreamConfig = config as IAMStreamConfig;if (videoStreamConfig == null){throw new Exception("Failed to get IAMStreamConfig");}// Get the existing format blockhr = videoStreamConfig.GetFormat(out mediaType);DsError.ThrowExceptionForHR(hr);// copy out the videoinfoheaderVideoInfoHeader videoInfoHeader = new VideoInfoHeader();Marshal.PtrToStructure(mediaType.formatPtr, videoInfoHeader);// if overriding the framerate, set the frame rateif (iFrameRate > 0){videoInfoHeader.AvgTimePerFrame = 10000000 / iFrameRate;}// if overriding the width, set the widthif (iWidth > 0){videoInfoHeader.BmiHeader.Width = iWidth;}// if overriding the Height, set the Heightif (iHeight > 0){videoInfoHeader.BmiHeader.Height = iHeight;}// Copy the media structure backMarshal.StructureToPtr(videoInfoHeader, mediaType.formatPtr, false);// Set the new formathr = videoStreamConfig.SetFormat(mediaType);DsError.ThrowExceptionForHR(hr);DsUtils.FreeAMMediaType(mediaType);mediaType = null;}private void SaveSizeInfo(ISampleGrabber sampleGrabber){int hr;// Get the media type from the SampleGrabberAMMediaType media = new AMMediaType();hr = sampleGrabber.GetConnectedMediaType(media);DsError.ThrowExceptionForHR(hr);if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero)){throw new NotSupportedException("Unknown Grabber Media Format");}// Grab the size infoVideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader)); _previewStride = _previewWidth * (videoInfoHeader.BmiHeader.BitCount / 8);DsUtils.FreeAMMediaType(media);media = null;}private void ConfigureSampleGrabber(ISampleGrabber sampleGrabber){AMMediaType media;int hr;// Set the media type to Video/RBG24media = new AMMediaType();media.majorType = MediaType.Video;media.subType = MediaSubType.RGB24;media.formatType = FormatType.VideoInfo;hr = sampleGrabber.SetMediaType(media);DsError.ThrowExceptionForHR(hr);DsUtils.FreeAMMediaType(media);media = null;hr = sampleGrabber.SetCallback(this, 1);DsError.ThrowExceptionForHR(hr);}public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen){if (isGrab){Bitmap v = new Bitmap(_previewWidth, _previewHeight, _previewStride,PixelFormat.Format24bppRgb, pBuffer);//v.RotateFlip(RotateFlipType.Rotate180FlipX);v.RotateFlip(RotateFlipType.Rotate90FlipX);this.BeginInvoke((MethodInvoker)delegate{pictureBox2.BackgroundImage = v;isGrab = false;});}return 0;}public int SampleCB(double SampleTime, IMediaSample pSample){//throw new NotImplementedException();return 0;}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
基于DirectShow框架的视频监控系统
产品设计与实现监控系统的发展经历了几个阶段,在20世纪90年代初以前,主要是以模拟设备为主的闭路电视监控系统,称为第一代模拟监控系统。
20世纪90年代中期,随着计算机处理能力的提高和视频技术的发展,人们利用计算机的高速数据处理能力进行视频的采集和处理,利用显示器的高分辨率实现图像的多画面显示,从而大大提高了图像质量。
这种基于PC机的多媒体主控台系统,称为第二代数字化本地视频监控系统。
随后,数字视频压缩编码技术日益成熟,多媒体计算机性能不断提高,网络带宽逐步增大,视频监控步入了全数字化的网络时代,称为第三代远程视频监控系统。
第三代视频监控系统以网络为依托,以数字视频的压缩、传输、存储和播放为核心,以智能实用的图像分析为特色,引发了视频监控的技术革命。
它不仅符合社会信息化的发展趋势,而且代表了监控行业的发展方向。
目前,比较好的多媒体开发和视频处理应用程序的技术是微软提出的DirectShow。
Direct-Show是微软公司提供的一套开发包,它与Di-rectX开发包一起发布,是一套在Windows操作平台上处理各种格式的媒体文件的回放、音视频采集等多媒体应用的编程接口,DirectShow给出了一种全新的多媒体数据处理模型,并封装了采集、压缩和解压缩等一系列算法,为视频监控、视频会议等多媒体应用系统的开发提供了良好的平台。
针对远程视频监控的特点,在VisualC++环境下,笔者运用DirectShow框架和IP组播技术,实现了基于MPEG-4格式的网络视频监控系统的开发。
DirectShow是基于COM技术的,有着较强的编程规范和重用性。
运用DirectShow,可以方便地从采集设备上捕获数据,并且进行相应的后期处理乃至存储到文件中。
它广泛地支持各种媒体格式,包括ASF、MPEG、AVI、DV、MP3和WAVE等,使得多媒体数据的回放变得轻而易举。
另外,DirectShow还集成了DirectX其他部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。
使用DirectShow驱动摄像头
pM.Release();
return false;
}
GetClientRect(hWnd,rectClient);
m_pVW->SetWindowPosition(0, 0, 320, 240);
//设定可视
hr=m_pVW->put_Visible(OATRUE);
if (FAILED(hr))
return false;
pBf.Release();
//设定视频窗口
//设定视频窗口为主窗口的一个子窗口
hr=m_pVW->put_Owner((OAHWND)hWnd);
if (FAILED(hr))
return false;
//设定窗口样式
m_pVW->put_Wi
下面是例程:
CComQIPtr m_pVW;
CComQIPtr m_pMC;
CComQIPtr m_pME;
CComPtr m_pGraph;
CComPtr m_pCapture;
DWORD m_dwGraphRegister;
bool bInit(HWND hWnd)
ndowStyle(WS_CHILD | WS_CLIPCHILDREN);
if (FAILED(hr))
return false;
//设定窗口大小
CRect rectClient;
if(pEm==NULL)
return false;
CComPtr pM=NULL;
ULONG cFetched;
CComPtr pBf=NULL;
mfc中使用opencv获取摄像头视频并显示
一、使用DirectShow获取摄像头视频DirectShow在V isual Studio 2005开发环境下的使用说明:1.将CameraDS.h CameraDS.cpp复制到你的项目中;2.将DirectShow复制到你的opencv根目录下,菜单工具->选项->项目和解决方案->vc++目录,把..(你的opencv安装目录)/DirectShow/Include添加到“包含文件”中;3.菜单工具->选项->项目和解决方案->vc++目录,把..(你的opencv安装目录)/DirectShow/Lib添加到“库文件”下面。
获取摄像视频:利用CameraDS的OpenCamera函数打开摄像头,利用QueryFrame获取每一帧。
二、使用CvvImage类显示摄像头视频opencv的较高版本中没有CvvImage类,因此需要手动添加这个类的头文件CvvImage.h 和代码文件CvvImage.cpp。
mfc界面添加一个picture控件,ID为IDC_VIEW1。
在对话框头文件中定义如下变量:CRect rect1;CStatic* pStc1;CDC* pDC1;HDC hDC1;在对话框源文件OnInitDialog中初始化变量:pStc1=(CStatic *)GetDlgItem(IDC_VIEW1);pStc1->GetClientRect(&rect1);pDC1=pStc1->GetDC();hDC1=pDC1->GetSafeHdc();显示视频:CvvImage m_CvvImage;m_CvvImage.CopyOf(frame,frame->nChannels); //frame是视频帧m_CvvImage.DrawToHDC(dlg->hDC1, &dlg->rect1);。
基于DirectShow框架的视频监控系统
9 O年代初 以前 , 要是 以模 拟 设 备 为 主的 闭路 电 主
视监 控 系统 , 为第 一代 模 拟 监控 系统 。2 称 O世纪 9 O年代 中期 , 随着 计算 机处 理 能 力 的提 高 和 视频
1 DrcS o 系统 i th w e
1 1 D rcs o 框 架 . i th w e
视 频压 缩编码 技 术 1 成熟 , 3益 多媒 体 计 算 机 性 能 不 断提 高 , 网络带 宽逐 步增 大 , 频监 控步 人 了全 视 数 字化 的 网络时 代 , 为第 三 代 远 程视 频 监 控 系 称 统 。第三代 视频 监 控 系 统 以 网络 为依 托 , 以数
字视 频 的压 缩 、 输 、 储 和播 放 为 核心 , 传 存 以智 能
关键 词 : i c h w; 频 监 控 系 统 ;滤 波 器 ; E 一 Dr t o 视 eS MP G 4 中 图 法分 类 号 :N 1 TO1 文献 标 志码 : A
监控 系统 的发展 经历 了几个 阶段 , 2 在 O世纪
术, 实现 了基 于 MP G 一 E 4格 式 的 网 络 视 频 监 控
DrcS o i thw是基 于 C M 技 术 的 , 着 较 强 的 e O 有 编程 规 范 和重 用 性 。运 用 D rc h w, 以 方 便 i to 可 eS
地从 采集 设备 上 捕 获 数据 , 且进 行 相 应 的 后 期 并
处 理乃 至存储 到 文件 中 。它 广泛 地支 持各 种媒 体 格 式 , 括 A F、 P G、 V 、 V、 3和 WA E 包 S M E A I D MP V
技术 的发 展 , 们 利 用计 算 机 的高 速 数 据 处 理 能 人
基于DirectShow的RTP视频监控系统
17/41
RTCP 控制协议
• 媒体流发送端将周期性地产生发送端报告 SR,含 有不同媒体流间的同步信息、已发送的数据报和 字节的计数,接收端根据这些信息可以估计出实 际的数据传输速率。
30/41
基于RTCP的自适应传输控制
• 本系统采用某段时间内数据包丢失率作为拥塞状 态的反馈信息。
• 丢包数( Lostt ,时刻t之前的丢包数): Lostt Sendt Re ceivet SMAX SBASE 1 Re ceivet • 丢包率( LRatet,k , t时刻和k时刻之间发生的丢包
时视频视频监捕捉控系统。 视频压缩
视频发送
视频播放 李娜娜
视频解压 郭静
网络 视频接收
王靖琰
4/41
视频监控系统关键技术
• COM技术 • DirectShow技术 • MPEG-4视频压缩标准 • 实时传输协议RTP/RTCP
5/41
COM技术
• COM组件是具有一定功能的、可以单独开发模块,它可 以通过接口相互协同工作以完成某项任务,应用程序直接 使用这些接口来实现对媒体流的控制。
18/41
视频监控系统总体设计
• 系统采用Client/Server结构,其中服务器端主要任 务是视频捕捉、视频压缩、视频存储、视频网络 发送和视频实时预览;客户端的主要任务是视频 网络接收、视频解码、视频存储和视频回放。系 统功能流程结构如图所示:
19/41
系统软件总体结构
20/41
视频实时捕捉模块
率):
LRatek,t =(Lostt -Lostk )/(Sendt -Sendk )
XP下采用DirectShow采集摄像头
1. bool2. uEye_DirectShow_Demo_Dlg::DirectShow_Init()3. {4. // initialize the COM library on the current thread5. HRESULT err= CoInitialize(NULL);6.7. if( FAILED(err))8. {9. MessageBoxEx( NULL, "Initializing COM library failed!", __FUNCTION__, MB_ICONERROR, 0);10. }11.12. return err == S_OK;13. }2、搜索Video源如果没有设备接入,那么CreateClassEnumerator会返回失败[cpp]view plaincopyprint?1. bool2. uEye_DirectShow_Demo_Dlg::VideoSourcesList_Fill()3. {4. HRESULT status= S_OK;5.6. // create System Device Enumerator7. ICreateDevEnum *pSystemDeviceEnumerator= NULL;8. status= CoCreateInstance( CLSID_SystemDeviceEnum,9. NULL,10. CLSCTX_INPROC,11. IID_ICreateDevEnum,12. (void**)&pSystemDeviceEnumerator);13. if( FAILED(status))14. {15. MessageBoxEx( NULL, "Creating System Device Enumerator failed!", __FUNCTION__, MB_ICONERROR, 0);16. return false;17. }18.19. // create Class Enumerator that lists alls video input devices among the system devices20. IEnumMoniker *pVideoInputDeviceEnumerator= NULL;21. status= pSystemDeviceEnumerator->CreateClassEnumerator( CLSID_VideoInputDeviceCategory,22. &pVideoInputDeviceEnumerator,23. 0);24.25. // release the System Device Enumerator which is not needed anymore26. pSystemDeviceEnumerator->Release();27. pSystemDeviceEnumerator= NULL;28.29. if( status != S_OK)30. {31. MessageBoxEx( NULL, "Creating Class Enumerator failed!", __FUNCTION__, MB_ICONERROR, 0);32. return false;33. }34.35. // add entry '[no device selected]' to list36. m_comboVideoSources.AddString( "[no device selected]");37. m_comboVideoSources.SetItemDataPtr( 0, NULL);38.39. // for each enumerated video input device: add it to the list40. IMoniker *pMoniker= NULL;41. while( pVideoInputDeviceEnumerator->Next( 1, &pMoniker, NULL) == S_OK)42. {43. VARIANT var;44. VariantInit(&var);45.46. // make filters properties accessible47. IPropertyBag *pPropBag= NULL;48. status= pMoniker->BindToStorage( 0, 0, IID_IPropertyBag, (void**)&pPropBag);49. if( FAILED(status))50. {51. pPropBag= NULL;52. MessageBoxEx( NULL, "Accessing filter properties failed!", __FUNCTION__, MB_ICONERROR, 0);53. // continue with the next filter54. }55. else56. {57. // add a reference to the storage object58. pPropBag->AddRef();59.60. // get the name of this filter61. status= pPropBag->Read( L"FriendlyName", &var, 0);62. if( FAILED(status))63. {64. MessageBoxEx( NULL, "Reading filter name failed!", __FUNCTION__, MB_ICONERROR, 0);65. // continue with the next filter66. }67. else68. {69. // if uEye Capture Device:70. // add filtername to the list and link the moniker pointer to the list entry71. CString sTemp(var.bstrVal);72. #if (0) /* jma [04/08/2010] add devices named UI... too */73. if( sTemp.Find( "uEye Capture Device", 0) != -1)74. #endif75. if ((sTemp.Find( "uEye Capture Device", 0) != -1) || (sTemp.Find( "UI",0) != -1))76. {77. int index = m_comboVideoSources.AddString( sTemp);78. // dont forget to release the moniker later!79. m_comboVideoSources.SetItemDataPtr( index, pMoniker);80. }81. else82. {83. pMoniker->Release();84. pMoniker= NULL;85. }86. }87.88. // release the reference to the storage object89. pPropBag->Release();90. pPropBag= NULL;91. }92.93. VariantClear(&var);94. }95.96. // release the class enumerator97. pVideoInputDeviceEnumerator->Release();98. pVideoInputDeviceEnumerator= NULL;99.100. // select first list entry101. m_comboVideoSources.SetCurSel( 0);102.103. return false;104. }二、选择某个摄像设备1、先停止原有的Media[cpp]view plaincopyprint?1. bool2. uEye_DirectShow_Demo_Dlg::FilterGraph_Stop()3. {4. Invalidate();5.6. // proceed only if filter graph manager object present7. if( m_pActiveFilterGraphManager == NULL)8. {9. return true;10. }11.12. HRESULT status= S_OK;13.14. // get the MediaControl interface of the graph15. IMediaControl* pMediaControl= NULL;16. status= m_pActiveFilterGraphManager->QueryInterface( IID_IMediaControl, (void**)&pMediaControl);17. if( FAILED(status) || pMediaControl == NULL)18. {19. MessageBoxEx( NULL, "Querying MediaControl interface of the filter graph manager failed!", __FUNCTION__, MB_ICONERROR, 0);20. return false;21. }22.23. //// check for graph to be executing before allowing to stop24.25. //OAFilterState filterState= 0; // OAFilterState is actually a long26. //status= pMediaControl->GetState( 100, &filterState);27. //if( FAILED(status))28. //{29. // // cleanup30.31. // // release the MediaControl interface object32. // pMediaControl->Release();33. // pMediaControl= NULL;34.35. // MessageBoxEx( NULL, "Querying graph state failed!", __FUNCTION__,MB_ICONERROR, 0);36. // return false;37. //}38.39. //if( filterState != State_Stopped)40. {41. // stop the execution of the graph42. status= pMediaControl->Stop();43. if( FAILED(status))44. {45. // cleanup46.47. // release the MediaControl interface object48. pMediaControl->Release();49. pMediaControl= NULL;50.51. MessageBoxEx( NULL, "Stopping the graph failed!", __FUNCTION__,MB_ICONERROR, 0);52. return false;53. }54.55. // update the graph state view56. UpdateGraphState( State_Stopped);57. }58.59. // release the MediaControl interface object60. pMediaControl->Release();61. pMediaControl= NULL;62.63. return true;64. }2、删除Graph[cpp]view plaincopyprint?1. bool2. uEye_DirectShow_Demo_Dlg::FilterGraph_Destroy()3. {4. // proceed only if filter graph manager object present5. if( m_pActiveFilterGraphManager == NULL)6. {7. return true;8. }9.10. if( !FilterGraph_Stop())11. {12. return false;13. }14.15. // disable 'dump graph' button as long as no graph present16. m_bnDumpGraph.EnableWindow( FALSE);17.18. // delete the capture filter19. m_pActiveVideoSource->Release();20. m_pActiveVideoSource= NULL;21.22. // delete the graph23. m_pActiveFilterGraphManager->Release();24. m_pActiveFilterGraphManager= NULL;25.26. // update the graph state view27. UpdateGraphState( -1);28.29. return true;30. }3、根据选择的设备的moniker来创建Graph分为:(1)为选择的设备创建capture filterstatus= pMoniker->BindToObject( 0, 0, IID_IBaseFilter, (void**)&m_pActiveVideoSource);(2) 创建一个capture Graph Builder对象ICaptureGraphBuilder2* pCaptureGraphBuilder= NULL;status= CoCreateInstance( CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2,(void**)&pCaptureGraphBuilder);(3) 创建Filter Graph Manager// create the Filter Graph Managerstatus= CoCreateInstance( CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void **)&m_pActiveFilterGraphManager);(4) 初始化Capture Graph Builder 对象,把graph和builder 连接起来status= pCaptureGraphBuilder->SetFiltergraph( m_pActiveFilterGraphManager);(5)增加Capture到graph中status= m_pActiveFilterGraphManager->AddFilter( m_pActiveVideoSource, L"Video Capture");(6) render 视频的capture pin,把caputre filter和render连接起来status= pCaptureGraphBuilder->RenderStream( &PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pActiveVideoSource,NULL,NULL);(7) 查询filter graph manager的VideoWindow接口IVideoWindow* pVideoWindow= NULL;status= m_pActiveFilterGraphManager->QueryInterface( IID_IVideoWindow, (void**)&pVideoWindow);(8) 把video view连接到graph// connect the dialogs video view to the graphCWnd* pwnd= GetDlgItem( IDC_STATIC_VIDEOVIEW);pVideoWindow->put_Owner( (OAHWND)pwnd->m_hWnd); // put_Owner always returns NOERROR// we dont want a title bar on our video viewlong pWindowStyle = 0;pVideoWindow->get_WindowStyle(&pWindowStyle);pWindowStyle &= ~WS_CAPTION;pVideoWindow->put_WindowStyle(pWindowStyle);// adjust graphs video geometryCRect rc( 0, 0, 0, 0);pwnd->GetClientRect( &rc);pVideoWindow->SetWindowPosition( rc.left, rc.top, rc.Width(), rc.Height());// release the VideoWindow interface object, we do not need it anymorepVideoWindow->Release();四、开始播放[cpp]view plaincopyprint?1. bool2. uEye_DirectShow_Demo_Dlg::FilterGraph_Start()3. {4. // proceed only if filter graph manager object present5. if( m_pActiveFilterGraphManager == NULL)6. {7. return true;8. }9.10. HRESULT status= S_OK;11.12. // get the MediaControl interface of the graph13. IMediaControl* pMediaControl= NULL;14. status= m_pActiveFilterGraphManager->QueryInterface( IID_IMediaControl, (void**)&pMediaControl);15. if( FAILED(status) || pMediaControl == NULL)16. {17. MessageBoxEx( NULL, "Querying MediaControl interface of the filter graph manager failed!", __FUNCTION__, MB_ICONERROR, 0);18. return false;19. }20.21. //// check for graph to be stopped before allowing to start22.23. //OAFilterState filterState= 0; // OAFilterState is actually a long24. //status= pMediaControl->GetState( 100, &filterState);25. //if( FAILED(status))26. //{27. // // cleanup28.29. // // release the MediaControl interface object30. // pMediaControl->Release();31. // pMediaControl= NULL;32.33. // MessageBoxEx( NULL, "Querying graph state failed!", __FUNCTION__,MB_ICONERROR, 0);34. // return false;35. //}36.37. //if( filterState == State_Stopped)38. {39. // start the execution of the graph40. status= pMediaControl->Run();41. if( FAILED(status))42. {43. // cleanup44.45. // release the MediaControl interface object46. pMediaControl->Release();47. pMediaControl= NULL;49. MessageBoxEx( NULL, "Starting the graph failed!", __FUNCTION__, MB_ICONERROR, 0);50. return false;51. }52.53. // update the graph state view54. UpdateGraphState( State_Running);55. }56.57. // release the MediaControl interface object58. pMediaControl->Release();59. pMediaControl= NULL;60.61. return true;62. }五、pin 特征的查看如果pin里有自己的查看特征接口, 那么就直接调用接口[cpp]view plaincopyprint?1. bool2. uEye_DirectShow_Demo_Dlg::ShowPinProperties()3. {4. // proceed only if video source object present5. if( m_pActiveVideoSource == NULL)6. {7. return true;8. }9.10. HRESULT status= S_OK;12. IPin* pPin= GetPin( m_pActiveVideoSource, PINDIR_OUTPUT, &MEDIATYPE_Video, &PIN_CATEGORY_CAPTURE);13. if( pPin == NULL)14. {15. MessageBoxEx( NULL, "Pin not available!", __FUNCTION__, MB_ICONERROR, 0);16. return false;17. }18.19. IUnknown* pFilterUnk= NULL;20. status= pPin->QueryInterface( IID_IUnknown, (void**)&pFilterUnk);21. if( FAILED(status))22. {23. // cleanup24.25. pPin->Release();26. pPin= NULL;27.28. MessageBoxEx( NULL, "Querying pin's IAMStreamConfig interface failed!", __FUNCTION__, MB_ICONERROR, 0);29. return false;30. }31.32. ISpecifyPropertyPages* pSpecifyPropertyPages= NULL;33. status= pFilterUnk->QueryInterface( IID_ISpecifyPropertyPages, (void**)&pSpecifyPropertyPages);34. if( FAILED(status))35. {36. // cleanup37.38. pFilterUnk->Release();39. pFilterUnk= NULL;41. pPin->Release();42. pPin= NULL;43.44. MessageBoxEx( NULL, "Querying pin's ISpecifyPropertyPages interface failed!", __FUNCTION__, MB_ICONERROR, 0);45. return false;46. }47.48. CAUUID cauuid= { 0, NULL};49. status= pSpecifyPropertyPages->GetPages( &cauuid);50. if( FAILED(status))51. {52. // cleanup53.54. pSpecifyPropertyPages->Release();55. pSpecifyPropertyPages->Release();56. pSpecifyPropertyPages= NULL;57.58. pFilterUnk->Release();59. pFilterUnk= NULL;60.61. pPin->Release();62. pPin= NULL;63.64. MessageBoxEx( NULL, "Querying pin's ISpecifyPropertyPages interface failed!", __FUNCTION__, MB_ICONERROR, 0);65. return false;66. }67. pSpecifyPropertyPages->Release();68. pSpecifyPropertyPages->Release();69. pSpecifyPropertyPages= NULL;70.71. status= OleCreatePropertyFrame( GetSafeHwnd(),//*this,72. 0,73. 0,74. OLESTR("uEye Capture Device Pin"),75. 1,76. (IUnknown**)&pFilterUnk,77. cauuid.cElems,78. (GUID*)cauuid.pElems,79. 0,80. 0,81. NULL);82.83. if( FAILED(status))84. {85. // cleanup86.87. CoTaskMemFree( cauuid.pElems);88. cauuid.pElems= NULL;89. cauuid.cElems= 0;90.91. pFilterUnk->Release();92. pFilterUnk= NULL;93.94. pPin->Release();95. pPin= NULL;96.97. MessageBoxEx( NULL, "OleCreatePropertyFrame failed!", __FUNCTION__, MB_ICONERROR, 0);98. return false;99. }100.101. // cleanup102.103. CoTaskMemFree( cauuid.pElems);104. cauuid.pElems= NULL;105. cauuid.cElems= 0;106.107. pFilterUnk->Release();108. pFilterUnk= NULL;109.110. pPin->Release();111. pPin= NULL;112.113. return true;114. }六、查询包含的filter信息[cpp]view plaincopyprint?1. bool2. uEye_DirectShow_Demo_Dlg::EnumerateFilters()3. {4. // proceed only if filter graph builder object present5. if( m_pActiveFilterGraphManager == NULL)6. {7. return false;8. }9.10. IEnumFilters *pEnum = NULL;11. IBaseFilter *pFilter;12. ULONG cFetched;13.14. HRESULT hr = m_pActiveFilterGraphManager->EnumFilters(&pEnum);15. if (FAILED(hr))16. {17. MessageBoxEx( NULL, "Enumerating filters failed!", __FUNCTION__, MB_ICONERROR, 0);18. return false;19. }20.21. CString sInfo( "Filters in the Graph:\n\n");22. int i= 0;23.24. while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)25. {26. i++;27.28. FILTER_INFO FilterInfo;29. hr = pFilter->QueryFilterInfo(&FilterInfo);30. if (FAILED(hr))31. {32. MessageBoxEx( NULL, "Could not get the filter info", __FUNCTION__,MB_ICONERROR, 0);33. continue; // Maybe the next one will work.34. }35.36. LPWSTR pVendorInfo= NULL;37. hr= pFilter->QueryVendorInfo( &pVendorInfo);38. if( FAILED(hr))39. {40. pVendorInfo= NULL;41. }42.43.44. if( pVendorInfo != NULL)45. {46. sInfo.AppendFormat( "%d: %S (by %S)\n", i, FilterInfo.achName, pVendorInfo);47. CoTaskMemFree( pVendorInfo);48. pVendorInfo= NULL;49. }50. else51. {52. sInfo.AppendFormat( "%d: %S\n", i, FilterInfo.achName);53. }54.55. // The FILTER_INFO structure holds a pointer to the Filter Graph56. // Manager, with a reference count that must be released.57. if (FilterInfo.pGraph != NULL)58. {59. FilterInfo.pGraph->Release();60. }61. pFilter->Release();62. }63.64. pEnum->Release();65.66. MessageBoxEx( NULL, sInfo.GetBuffer(), __FUNCTION__, MB_OK, 0);67.68. return true;69. }。
directshow的中文资料之设备列举和捕捉接口
directshow的中文资料之设备列举和捕捉接口第一篇:directshow的中文资料之设备列举和捕捉接口directshow的中文资料之设备列举和捕捉接口这篇解释和示例如何通过DirectShow的接口去初始化和访问系统的硬件设备。
代表性的,DirectShow应用程序使用下面类型的硬件。
音/视频捕捉卡音频或视频回放卡音频或视频压缩或解压卡(象MPEG解码器)下面将以AV设备作参考。
如何列举设备包括在DirectShow SDK中的接口,类,和例子提供了音/视频捕捉和回放的功能。
因为文件源过滤器和filter graph manager处理了内在的工作,所有,添加捕捉功能到一个应用程序中,只需添加很少的代码。
你可以通过列举系统硬件设备和得到设备列表完成特别的任务(例如:所有的视频捕捉卡的列表)。
DirectShow自动为win32和Video for Windows 设备实例化过滤器。
要AV设备工作,首先,你必须检测当前系统存在的设备。
ICreateDevEnum接口建立指定类型的列表。
提供你需要的检测和设置硬件的功能。
访问一个指定的设备有三步,详细的说明和代码如下:建立系统硬件设备的列表首先,申明一个列表指针,然后通过CoCreateInstance 建立。
CLSID_SystemDeviceEnum是我们想建立对象的类型,IID_ICreateDevEnum是接口的GUID。
ICreateDevEnum *pCreateDevEnum;CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void**)&pCreate DevEnum);其次,建立一个特别类型的硬件设备的列表(例如视频捕捉卡)申明一个IEnumMoniker接口,并把他传给ICreateDevEnum::CreateClassEnumerator 方法。
Halcon里使用工业相机的方法总结
Halcon里使用工业相机的方法总结Halcon的开发者,在入门时,往往对访问相机比较头痛,方法是很多的,但是选择哪一种接口最方便、最有效呢?这里,给大家介绍几种常规的方法以及每种方法的利弊。
1.使用Directshow接口。
在采集助手里,选择Directshow,如下图所示:该方法对应的halcon初始化代码为open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8,'rgb', -1, 'false', 'default', 'XXXXXXX', 0, -1, AcqHandle),XXXXXXX为相机名字,需要替换成电脑中相应的相机名称。
优点:该方法通用性较好,几乎市面上所有厂家的工业相机以及民用级别的QQ视频摄像头、WebCam等都可以通过这种方式访问。
缺点:性能较低,Directshow中由于内存复制、格式转换等原因,CPU占用率会相对其他方式高一些;灵活性差,由于是标准接口,早期定义的,很多工业相机的参数没有办法通过这种方式修改。
例如触发模式设置等,通过该接口就无法完成。
2.使用GigEVision接口。
在采集助手里,选择GigEVision,如下图所示:该方法对应的halcon初始化代码为open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'XXXXXXX', 0, -1, AcqHandle) ,XXXXXXX为相机名字,需要替换成电脑中相应的相机名称。
优点:通用性较好,大部分GigE网口工业相机都支持该方式直接方式。
DirectShow编程实现摄像头视频捕捉
第三步、配置Sample Grabber以捕获数据。
视频捕捉类CCaptureVideo的具体实现
// CCaptureVideo视频捕捉类头文件/////////////////////////////////////////////////////////////////////#if !defined(AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_)#define AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_/////////////////////////////////////////////////////////////////////// CaptureVideo.h : header file/////////////////////////////////////////////////////////////////////#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include <atlbase.h>#include <windows.h>#include <dshow.h>#ifndef SAFE_RELEASE#define SAFE_RELEASE( x ) /if ( NULL != x ) /{ /x->Release( )
DirectShow流媒体数据的采集及图片的捕获
DirectShow流媒体数据的采集及图片的捕获DirectShow流媒体数据的采集及图片的捕获建议你用DirectShow它可以帮你从视频采集设备中取得数据,并通过Sample Grabber过滤器进行抓图DirectShow流媒体数据的采集及图片的捕获用DirectShow来使用摄像头,一般要求摄像头的驱动是WDM 格式的,当然,一些比较老的驱动格式DirectShow也可支持。
在DirectShow中,有一个Sample Grabber过滤器,它是一个可以被插入流的过滤器,它有自己的缓冲,存放采样。
我们就可以用它来从一个视频文件中简单的扑获一桢。
DirectShow通过图形过滤管理器(Filter Graph Manager)来与上层应用程序和下层的驱动进行联系。
DirectShow通过捕获过滤器(Capture Filter)来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象。
1、创建图形过滤管理器Filter Graph如上面原理所述,首先要创建Filter Graph:CComPtr< IGraphBuilder > m_pGraph;hr=m_pGraph.CoCreateInstance( CLSID_FilterGraph );2、连接设备还要创建系统枚举器组件对象:CComPtr<ICreateDevEnum>pCreateDevEnum;pCreateDevEnum.CoCreateInstance( CLSID_ SystemDeviceEnum );然后使用接口方法CreateClassEnumerator ()为指定的Filter注册类型目录创建一个枚举器,并获得IenumMoniker接口:CComPtr< IEnumMoniker > pEm;pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &p Em, 0 );接着在调用BindT oObject()以后,可以将设备标识生成一个DirectShow Filter,将其加到Filter Graph中就可以参与工作了。
MFC+DirectShow摄像头简单视频浏览
MFC+DirectShow摄像头简单视频浏览1 安装摄像头驱动2 引用DirectShow库,包含DirectShow头文件#pragma comment(lib,"Strmiids.lib")#pragma comment(lib,"quartz.lib")#include "dshow.h"3 初始化com环境::CoInitialize(NULL);4 定义一个过滤器引脚查询函数,并实现之定义IPin *findpin(IBaseFilter *pFilter,PIN_DIRECTION dir);实现,假定工程为MFC Dialog Based类型,主对话框类为VDlg IPin *VDlg::findpin(IBaseFilter *pFilter,PIN_DIRECTION dir) {IEnumPins *pEnumPins=NULL;IPin *pRetPin=NULL;PIN_DIRECTION pDir;pFilter->EnumPins(&pEnumPins);while(pEnumPins->Next(1,&pRetPin,NULL)==S_OK){pRectPin->QueryDirection(&pDir);if(pDir==dir){return pRetPin;}}return 0;}5 预览实现void VDlg::vPreview(){ICaptureGraphBuilder *pBuilder=NULL;::CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC_SERV ER,IID_ICaptureGraphBuilder2,(void **)&pBuilder);::CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IG raphBuilder,(void **)&pGraph);pBuilder->SetFiltergraph(pGraph);ICreateDevEnum *pDevEnum=NULL;IEnumMoniker *pClsEnum=NULL;::CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC,IID_ICre ateDevEnum,(void **)&pDevEnum);pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pClsE num,0);if(pClsEnum->Next(1,&pMoniker,NULL)==S_OK){pMoniker->BindToObject(0,0,IID_IBaseFilter,(void **)&pSrc);pMoniker->Release();}pClsEnum->Release();pGraph->AddFilter(pSrc,L"AVI");::CoCreateInstance(CLSID_VideoRenderer,NULL,CLSCTX_ALL,IID_IBaseFi lter,(void **)&pPreview);if(pPreview){pGraph->AddFilter(pPreview,L"PREVIEW");IPin *pPinOut,*pPinIn;pPinOut=findpin(pSrc,PINDIR_OUTPUT);pPinIn=findpin(pPreview,PINDIR_INPUT);pGraph->ConnectDirect(pPinOut,pPinIn,0);IVideoWindow *pWnd=NULL;pPreview->QueryInterface(IID_IVideowindow,(void **)&pWnd);if(pWnd){long ws;pWnd->put_Owner((long)m_hWnd);pWnd->get_WindowStyle(&ws);ws=ws &~ WS_CAPTION;ws=ws &~WS_DLGFRAME;ws=ws & WS_CHILD;pWnd->put_WindowStyle(ws);CRect rc;this->GetClientRect(rc);pWnd->put_Lef(5);pWnd->put_Top(5);pWnd->put_Width(rc.Width()-5); pWnd->put_Height(rc.Height()-5); }pMediaCtrl->Run();}}。
DirectShow技术在Windows CE系统中的图像采集实现
DirectShow技术在Windows CE系统中的图像采集实现王辉;陈浩明;王小英【摘要】研究了DirectShow技术在Windows CE嵌入式系统中图像采集的应用,探讨了DirectShow在WindowsCE嵌入式系统中进行图像采集的优势,并在Windows CE嵌入式系统中通过DirectShow技术实现了图像的采集功能,对基于Windows CE嵌入式系统的OCR、视频监视等系统的开发有一定借鉴.【期刊名称】《常熟理工学院学报》【年(卷),期】2011(025)004【总页数】4页(P102-105)【关键词】DirectShow;嵌入式系统;Windows CE【作者】王辉;陈浩明;王小英【作者单位】常熟理工学院计算机科学与工程学院,江苏常熟,215500;常熟理工学院计算机科学与工程学院,江苏常熟,215500;常熟理工学院计算机科学与工程学院,江苏常熟,215500【正文语种】中文【中图分类】TP316DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM(Component Object Model)的流媒体处理的开发包[1].它采用流水线的工作思想,可以实时处理并输出采集到的数据流,具有很强的时效性和灵活性.DirectShow屏蔽了硬件设备的差异性,降低了流媒体处理软件的开发难度,支持多种媒体数据类型的解码播放、格式转化,同时还具有VFW(Video for Windows)视频采集方式所不支持的多路音视频数据同时采集的功能,可以轻松地应用于视频监视系统、视频会议、视频点播等系统的开发[2,3].目前随着嵌入式系统的普及,DirectShow被成功地移植到了Windows CE嵌入式系统之中[4],为Windows CE系统中的多媒体应用的开发提供了有力的支持.通过DirectShow技术,可以基于Windows CE嵌入式系统高效的开发OCR(Optical Character Recognition)(光学字符识别)产品,网络视频监视产品,网络视频会议播放产品等一些具有广阔市场前景的流媒体应用产品.1 DirectShow系统框架DirectShow是一个开放性的应用架构,如图1所示.应用程序在使用DirectShow 时将按照一定的意图建立起相应的Filter Graph,通过Filter Graph Manager来控制整个数据处理过程.DirectShow在Filter Graph运行的时候接收各种事件,通过消息的方式发送到应用程序,实现应用程序与DirectShow系统之间的交互. DirectShow中有三种Filter,分别是Source Filter,Transform Filter和Rendering Filter.Source Filters主要负责取得数据,数据源可以是文件、因特网、或者计算机里的采集卡、数字摄像机等,然后将数据向下传输;Transform Filers 主要负责数据的格式转换、传输;Rendering Filters主要负责数据的最终去向,可以将数据传送至声卡、显卡进行多媒体的演示,也可以输出到文件进行存储.每个Filter都有其自己的连接Pin.Filter通过输入和输出Pin进行不同Filter之间的连接.DirectShow采用了COM标准,在Direct-Show中提供了IGraphBuilder、IMediaControl、IVideoWindow等重要接口来完成视频流的采集与控制功能.使用DirectShow进行摄像头的视频流捕获时,首先需构建一个ICaptureGraphBuilder2和IGraphBuilder的COM对象,然后对摄像头驱动进行枚举,并将视频捕获滤镜与摄像头驱动建立关联,最终通过IGraphBuilder的对象查找IMediaControl接口和IVideoWindows接口实现预览窗体的设置和流媒体的基本控制.图1 DirectShow系统框架2 DirectShow在W indows CE上的实现在Windows CE5.0以上的版本中都提供了可以直接调用摄像头的API函数,但是这些函数功能都过于简单,为此Microsoft公司又将DirectShow移植到Windows CE5.0以上的系统中,针对嵌入式设备的CPU的处理能力较弱以及嵌入式设备的内存容量较小的特点,Microsoft公司在移植DirectShow时也进行了必要裁剪,而这也导致了在Windows CE上进行DirectShow应用的开发相比于在PC机上的开发要有所不同.本软件的开发使用Visual Studio 2005开发工具中的智能设备开发环境,语言选择了c++,因为c++可以自由地申请和释放内存,以节约嵌入式系统中的有限内存资源.在开发Windows CE应用程序之前,首先需要安装Windows CE的SDK,该开发包提供了DirectShow应用程序开发所需的库函数.为了在工程里面能够正常地使用DirectShow,首先需要在工程中添加“dshow.h”头文件以及aygshell.lib和strmiids.lib两个静态库.由于DirectShow是基于COM开发,因此为了方便接口的调用和释放,可以使用智能指针CComptr<>,因此也需要添加atlbase.h这个头文件.DirectShow在Windows CE系统上驱动摄像头,采集图像并保存的流程如图2所示.本文在 Windows CE系统中通过DirectShow技术实现了视频捕获的应用软件,主要包括视频流采集与预览、视频流和图片保存、视频流格式设置以及预览窗体创建四个模块.2.1 视频流采集与预览该模块为整个软件的核心部分,其流程图如图3所示.在该流程中,查找摄像头的驱动并与视频捕获滤镜建立关联的方法不同于PC机上方式,因为Windows CE中的摄像头数目有限,不需要特意地去枚举视频捕捉设备,Windows CE的SDK中提供了FindFirstDevice函数,可以方便地查找到摄像头设备.通过FindFirstDevice进行查找设备驱动时需要使用Windows CE中摄像头驱动的GUID,其GUID为{0xCB998A05,0x122C,0x4166,0x84,0x6A,0x93,0x3E,0x4D,0x7E,0x3C,0x86}.其实现代码如下:图2 DirectShow在Windows CE上的图像采集2.2 视频流和图片保存在实现图片或视频保存时,DirectShow提供了设置视频或图片存储格式的功能,但是这些功能受到硬件条件的制约,并非每款设备上都能实现对视频或图片格式的设置.对图片进行保存的核心实现代码如下:图3 视频流捕获模块流程图2.3 设置视频流格式与创建预览窗体通过DirectShow技术可以比较简单地设置视频流的像素、采集频率以及图像的位数,不过这些参数的设置也需要硬件的支持才可以实现.视频格式的设置主要由IAMStreamConfig接口提供,该接口由ICaptureGraph-Builder2的COM对象获得,在Windows CE中可以使用 AM_MEDIA_TYPE和VIDEOINFOHEADER结构体来保存原始视频流格式以及设置后的视频流的格式.DirectShow在进行预览摄像头采集的视频流之前需要先设置预览窗体,该窗体的接口通过滤镜管理器进行查询得出.控制视频窗体的接口为IVedioWindow,通过该接口可以设置视频窗体的风格,大小和所在窗体的位置.视频流能够正常运行还需要IGraphBuild的COM对象提供IMediaControl接口来进行控制,只有视频流进行了正常采集的时候,预览窗体才会进行视频流的实时显示.3 系统性能分析图4 DirectShow技术实现的系统图5 设置显示窗体的大小图4和图5分别是用DirectShow技术和系统自带的API函数实现的图像采集系统.采用DirectShow技术实现的系统其灵活性远远超过了采用系统自带的API函数实现的系统.该软件可以设置图像的分辨率、视频预览窗体的大小、视频的旋转、保存视频流或从视频流中捕获的图片,实现了视频采集应用的基本功能.同时,使用DirectShow自带的滤镜或者用户自定义的滤镜可以实现视频流的实时处理,还可以开发更为高级的应用功能,而使用Windows CE系统中自带的一些API时,只能调用系统自带的拍照程序,用户无法对其添加其他功能,也不能对实时的视频流进行处理,无法开发一些具有实际价值的应用.除此之外,因为DirectShow只涉及到视频流的采集与处理,因此软件的界面可以由开发人员自由设计,而调用Windows CE自带的API函数时,开发人员无法对其软件界面进行修改.在进行单独的拍照测试时,使用DirectShow开发的视频采集软件的速度也要优于直接调用系统API函数开发的系统.4 结论本文研究了DirectShow技术的框架及关键技术,并在Windows CE系统中实现了视频流的图像采集、预览、处理、保存等功能,为今后在Windows CE嵌入式系统中开发视频监视系统、OCR系统,以及将Windows CE系统应用到摄像机、照相机等设备中提供了初步的技术验证.参考文献:[1]陆其明.DirectShow开发指南[M].北京:清华大学出版社,2009.[2]唐芸,杜江红,陈继华.基于COM技术的DirectShow视频采集的研究[J].三峡大学学报(自然科学版),2003(6).[3]黄振宇,王敏,吴涛.基于COM的Directshow Filter实现[J].微机发展,2004(5).[4]邱小平.WindowsCE 6.0开发经典[M].北京:电子工业出版社,2009.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (FAILED(hr))
return false;
//将对象加入到运行对象列表中
CComPtr pROT;
GetRunningObjectTable(0,&pROT);
WCHAR c[128];
wsprintfW(c, L"FilterGraph %08x pid %08x\0", (DWORD_PTR)m_pGraph.p, GetCurrentProcessId());
DirectShow通过几个COM接口来对视频捕获的全过程进行控制,其中IGraphBuilder 用于建立过滤器,ICaptureGraphBuilder2用于与下层的驱动程序建立联系,IVideoWindow,IMediaControl,IMediaEventEx分别对整个过程的视频窗口,播放过程和事件响应进行控制,
下面是例程:
CComQIPtr m_pVW;
CComQIPtr m_pMC;
CComQIPtr m_pME;
CComPtr m_pGraph;
CComPtr m_pCapture;
DWORD m_dwGraphRegister;
bool bInit(HWND hWnd)
{
HRESULT hr;
//获得接口
hr=CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,IID_IGraphBuilder, (void **) &m_pGraph);
if (FAILED(hr))
return false;
对于小摄像头的驱动有几种方法,通过使用DirectShow来驱动摄像头灵活性比较好,有简单的方法也有比较复杂但更有效的方法,本文只介绍简单方法,希望与大家交流!
用DirectShow来使用摄像头,一般要求摄像头的驱动是WDM格式的,当然,一些比较老的驱动
格式DirectShow也可支持。DirectShow通过图形过滤管理器(Filter Graph Manager)来与上层应用程序和下层的驱动进行联系。DirectShow通过一种叫作捕获过滤器(Capture Filter)的东东来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象。
m_pMC=m_pGraph;
m_pVW=m_pGraph;
m_pME=m_pGraph;
//取得消息
m_pME->SetNotifyWindow((OAHWND)(m_hWnd=hWnd), WM_GRAPHNOTIFY, 0);
//将过滤和捕获进行连接
m_pCapture->SetFiltergraph(m_pGraph);
hr = CreateItemMoniker(L"!",c,&pM);
if (FAILED(hr))
return false;
hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE,m_pGraph,pM,&m_dwGraphRegister);
return false;
//设定窗口大小
CRect rectClient;
GetClientRect(hWnd,rectClient);
m_pVW->SetWindowPosition(0, 0, 320, 240);
//设定可视
hr=m_pVW->put_Visible(OATRUE);
}
else
{
return false;
}
//将设备添加到graph
hr = m_pGraph->AddFilter(pBf, L"Video Capture");
if (FAILED(hr))
return false;
//连接一个源插口
pM.Release();
return false;
}
if (FAILED(hr))
return false;
pCde->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
if(pEm==NULL)
return false;
CComPtr pM=NULL;
ULONG cFetched;
CComPtr pBf=NULL;
if(pEm->Next(1,&pM,&cFetched)==S_OK)
{
pM->BindToObject(0,0,IID_IBaseFilter, (void**)&pBf);
pM.Release();
hr=m_pVW->put_Owner((OAHWND)hWnd);
if (FAILED(hr))
return false;
//设定窗口样式
m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
if (FAILED(hr))
hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &m_pCapture);
if (FAILED(hr))
return false;
hr=m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pBf,NULL,NULL);
if (FAILED(hr))
return false;
pBf.Release();
//设定视频窗口
//设定视频窗口为主窗口的一个子窗口
//设备联接
//枚举设备
CComPtr pCde=NULL;
CComPtr pEm=NULL;
hr=CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **) &pCde);