使用DirectShow驱动摄像头

转载 2006年06月01日 16:42:00
对于小摄像头的驱动有几种方法,通过使用DirectShow来驱动摄像头灵活性比较好,有简单的方法也有比较复杂但更有效的方法,本文只介绍简单方法,希望与大家交流!

  用DirectShow来使用摄像头,一般要求摄像头的驱动是WDM格式的,当然,一些比较老的驱动格式DirectShow也可支持。DirectShow通过图形过滤管理器(Filter Graph Manager)来与上层应用程序和下层的驱动进行联系。DirectShow通过一种叫作捕获过滤器(Capture Filter)的东东来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象

  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;

 

 hr=CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,

 IID_ICaptureGraphBuilder2, (void **) &m_pCapture);

 if (FAILED(hr))

  return false;

 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);

 //设备联接

 //枚举设备

 CComPtr pCde=NULL;

 CComPtr pEm=NULL;

 

 hr=CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,

 IID_ICreateDevEnum, (void **) &pCde);

 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();

 }

 else

 {

  return false;

 }

 //将设备添加到graph

 hr = m_pGraph->AddFilter(pBf, L"Video Capture");

 if (FAILED(hr))

  return false;

 //连接一个源插口

 hr=m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pBf,NULL,NULL);

 if (FAILED(hr))

  return false;

 pBf.Release();

 //设定视频窗口

 //设定视频窗口为主窗口的一个子窗口

 hr=m_pVW->put_Owner((OAHWND)hWnd);

 if (FAILED(hr))

  return false;

 //设定窗口样式

 m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);

 if (FAILED(hr))

  return false;

 //设定窗口大小

 CRect rectClient;

 GetClientRect(hWnd,rectClient);

 m_pVW->SetWindowPosition(0, 0, 320, 240);

 //设定可视

 hr=m_pVW->put_Visible(OATRUE);

 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());

 hr = CreateItemMoniker(L"!",c,&pM);

 if (FAILED(hr))

  return false;

 

 hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE,m_pGraph,pM,&m_dwGraphRegister);

 pM.Release();

 

 return false;

 }

使用DirectShow驱动摄像头

对于小摄像头的驱动有几种方法,通过使用DirectShow来驱动摄像头灵活性比较好,有简单的方法也有比较复杂但更有效的方法,本文只介绍简单方法,希望与大家交流!   用DirectShow来使用...
  • stardtx
  • stardtx
  • 2012年03月22日 10:46
  • 356

Windows下摄像头采集驱动(DirectShow)

出处:http://blog.csdn.net/chenice9999/article/details/6968957  枚举摄像头设备(不论设备能否被使用都会被枚举出来): in...
  • jiht594
  • jiht594
  • 2011年11月17日 14:45
  • 1608

使用OpenCV 实现多摄像头图像处理笔记(1):DirectShow的配置过程可能出现的问题

有些文章说用OpenCV就能实现多摄像头采集图像的工作,实际上我试了一下,出现了以下这篇博文相同的情况:http://blog.csdn.net/chenyusiyuan/article/detail...

5.使用DirectShow进行摄像头采集并进行H264实时编码

上一篇讲了怎么把视音频采集下来并合成一个AVI文件,但我们看这个AVI文件就发现,虽然很清晰,但就是大小太大了,录制短短10秒,可能就有100M以上,而且还有一个文件,就是录制只能是打开采集时开始,停...
  • klamen
  • klamen
  • 2017年02月16日 14:44
  • 2047

OpenCV摄像头采集图像问题及DirectShow的使用

在用OpenCV打开USB摄像头时,分别用两个软件采集图像结果是上面两幅,第一幅我是用OpenCV采集的,第二幅是用别人的软件采集的,感觉颜色上差异好大啊,在OpenCV感觉无法设置摄像头本身的许多属...
  • b5w2p0
  • b5w2p0
  • 2013年04月20日 10:27
  • 4162

使用DirectShow.NET获取摄像头视频流

开源社区提供了DirectShow的.NET版本,为C#开发者提供了便利。这里分享下如何用DirectShow.NET API来启动摄像头,以及获取视频流数据。 参考原文:Read Barcode ...
  • yushulx
  • yushulx
  • 2016年09月29日 10:37
  • 3086

在Windows Mobile 5中使用DirectShow控制摄像头

说明:               在飞凌OK6410的开发包里有一个摄像头测试程序(WinCE6.0系统,Camera_App。是SDK下的例子),估计很多人对这个源码看得都不是很明白。...
  • zwgdft
  • zwgdft
  • 2012年01月08日 15:16
  • 1335

使用DirectShow打开摄像头 MFC编程

之前使用OpenCV 自带的函数打开摄像头,在Win7下无法使用的朋友可以参考一下这篇文章。使用DirectShow可以实现打开多个摄像头。首先从网上下载三个文件:DirectShow、CameraD...

使用VC和DirectShow从摄像头中读取图像(一)

在图像处理时经常会用到从摄像头读取图像。OPENCV有提供的方法来实现,非常简单,不用多说。而使用VC++则没有那么容易,下面介绍使用CImage和DirectShow读取摄像头图像,并显示的对话框中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用DirectShow驱动摄像头
举报原因:
原因补充:

(最多只允许输入30个字)