摄像头
来源:互联网 发布:微信猪淘客软件从哪买 编辑:程序博客网 时间:2024/04/27 20:18
对于小摄像头的驱动有几种方法,通过使用directshow来驱动摄像头灵活性比较好,有简单的方法也有比较复杂但更有效的方法,本文只介绍简单方法,希望与大家交流!
用directshow来使用摄像头,一般要求摄像头的驱动是wdm格式的,当然,一些比较老的驱动格式directshow也可支持。directshow通过图形过滤管理器(filter graph manager)来与上层应用程序和下层的驱动进行联系。directshow通过一种叫作捕获过滤器(capture filter)的东东来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象。
directshow通过几个com接口来对视频捕获的全过程进行控制,其中igraphbuilder 用于建立过滤器,icapturegraphbuilder2用于与下层的驱动程序建立联系,ivideowindow,imediacontrol,imediaeventex分别对整个过程的视频窗口,播放过程和事件响应进行控制,
下面是例程:
ccomqiptr<ivideowindow> m_pvw;
ccomqiptr<imediacontrol> m_pmc;
ccomqiptr<imediaeventex> m_pme;
ccomptr<igraphbuilder> m_pgraph;
ccomptr<icapturegraphbuilder2> 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 <icreatedevenum> pcde=null;
ccomptr <ienummoniker> 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 <imoniker> pm=null;
ulong cfetched;
ccomptr<ibasefilter> 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<irunningobjecttable> 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;
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 摄像头
- 前置摄像头、后置摄像头
- 摄像头编程
- 因为工作
- 网络流Dinic算法详解及模板
- SOJ 1321. Robot
- URLEncoder
- 2012 google校园笔试编程题2.1
- 摄像头
- LeetCode - Populating Next Right Pointers in Each Node
- Java SSL/TLS 安全通讯协议(SSLSocket)
- [小说]魔王冢(42)演员就位
- Java中的thow与throws
- havok自学专栏(二)2013/8/24
- 2013年8月24日、继承|final关键字|
- 通路搜索
- iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用