directshow实现视频捕获

directshow实现视频捕获
directshow实现视频捕获

directshow实现视频捕获(源码)vs2005

金钻传奇 mail@https://www.360docs.net/doc/9810120796.html,

我用visual studio 2005编了一个摄像头预览程序,还可以导出成avi文件,前提是要安装directshow,并搭建好环境,我安装的是directx 9.0b,搭建环境很简单,网上有很多,注意在项目-属性-配置属性-链接器-输入中要加上strmbasd.lib winmm.lib(中间有空格)。源代码如下:

/*CaptureClass.h*/

#pragma once

#include

#include

#include

#include //ISampleGrabber接口要求的

#ifndef SAFE_RELEASE

#define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; }

#endif

class CCaptureClass

{

public:

CCaptureClass(void);

public:

~CCaptureClass(void);

int EnumDevices(HWND hList);

//void SaveGraph(TCHAR *wFileName); //保存滤波器链表

void ConfigCameraPin(HWND hwndParent); //配置摄像头的视频格式

void ConfigCameraFilter(HWND hwndParent); //配置摄像头的图像参数

HRESULT CaptureImages(CString inFileName); //捕获保存视频

HRESULT PreviewImages(int iDeviceID , HWND hWnd); //采集预览视频

private:

HWND m_hWnd; //视频显示窗口的句柄

IGraphBuilder *m_pGB; //滤波器链表管理器

ICaptureGraphBuilder2 *m_pCapture; //增强型捕获滤波器链表管理器IBaseFilter *m_pBF; //捕获滤波器

IMediaControl *m_pMC; //媒体控制接口

IVideoWindow *m_pVW; //视频显示窗口接口

IBaseFilter *pMux; //写文件滤波器

protected:

bool BindFilter(int deviceId,IBaseFilter **pFilter); //把指定的设备滤波器捆绑到链表中

void ResizeVideoWindow(); //更改视频显示窗口

HRESULT SetupVideoWindow(); //设置视频显示窗口的特性

HRESULT InitCaptureGraphBuilder(); //创建滤波器链表管理器,查询其各种控制接口

};

/*CaptureClass.cpp*/

#include "StdAfx.h"

#include "CaptureClass.h"

/************************************************************************/

/* 类构造函数实现 */

/************************************************************************/ CCaptureClass::CCaptureClass(void)

{

CoInitialize(NULL); //COM库初始化

m_hWnd = NULL; //视频显示窗口的句柄

m_pVW = NULL ; //视频窗口接口指针清空

m_pMC = NULL ; //媒体控制接口指针清空

m_pGB = NULL ; //滤波器链表管理器接口指针清空

m_pBF = NULL ; //捕获滤波器接口指针清空

m_pCapture = NULL ; //增强型捕获滤波器链表管理器接口指针清空

}

/************************************************************************/

/* 析构函数 */

/************************************************************************/ CCaptureClass::~CCaptureClass(void)

{

if(m_pMC) m_pMC ->Stop(); //首先停止媒体

if(m_pVW){

m_pVW->put_Visible(OAFALSE); //视频窗口不可见

m_pVW->put_Owner(NULL); //视频窗口的父窗口清空

}

SAFE_RELEASE(m_pCapture); //释放增强型捕获滤波器链表管理器接口

SAFE_RELEASE(m_pMC); //释放媒体控制接口

SAFE_RELEASE(m_pGB); //释放滤波器链表管理器接口

SAFE_RELEASE(m_pBF); //释放捕获滤波器接口

CoUninitialize( ); //卸载COM库

}

/************************************************************************/

/* 把指定采集设备与滤波器捆绑 */

/************************************************************************/ bool CCaptureClass::BindFilter(int deviceId,IBaseFilter **pFilter)

{

if( deviceId < 0) return false ;

//枚举所有的视频捕获设备

ICreateDevEnum *pCreateDevEnum ;

//生成设备枚举器pCreateDevEnum

HRESULT hr =

CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDe vEnum,(void**)&pCreateDevEnum);

if( hr != NOERROR ) return false ;

IEnumMoniker *pEm;

//创建视频输入设备类枚举器

hr =

pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm,0); if( hr != NOERROR ) return false ;

pEm->Reset(); //复位该设备

ULONG cFetched;

IMoniker *pM;

int index = 0 ;

//获取设备

while( hr = pEm->Next(1,&pM,&cFetched),hr == S_OK , index <= deviceId )

{

IPropertyBag *pBag;

//获取该设备的属性集

hr = pM->BindToStorage(0,0,IID_IPropertyBag,(void**)&pBag);

if(SUCCEEDED(hr))

{

VARIANT var ;

var.vt = VT_BSTR; //保存的是二进制的数据

hr = pBag->Read(L"FriendlyName",&var,NULL); //获取FriendlyName形式的信息 if( hr == NOERROR )

{

//采集设备与捕获滤波器捆绑

if( index == deviceId )

pM->BindToObject(0,0,IID_IBaseFilter,(void**)pFilter);

SysFreeString(var.bstrVal); //释放二进制数据资源,必须释放

}

pBag ->Release();

}

pM->Release();

index++;

}

return true ;

}

/************************************************************************/ /* 设置视频显示窗口的特性 */ /************************************************************************/ HRESULT CCaptureClass::SetupVideoWindow()

{

HRESULT hr ;

//m_hWnd为类CCaptureClass的成员变量,在使用该函数前须初始化

hr = m_pVW->put_Visible(OAFALSE); //视频窗口不可见

hr = m_pVW->put_Owner((OAHWND)m_hWnd); //窗口所有者:传入的窗口句柄

if(FAILED(hr)) return hr ;

hr = m_pVW->put_WindowStyle( WS_CHILD | WS_CLIPCHILDREN); //窗口风格设置

if( FAILED(hr)) return hr ;

ResizeVideoWindow(); //更改窗口大小

hr = m_pVW->put_Visible(OATRUE); //视频窗口可见

return hr ;

}

/************************************************************************/

/* 更改视频窗口大小 */

/************************************************************************/ void CCaptureClass::ResizeVideoWindow()

{

if( m_pVW ){

//让图像充满整个指定窗口

CRect rc ;

::GetClientRect(m_hWnd,&rc); //获取显示窗口的客户区

m_pVW->SetWindowPosition(0,0,rc.right,rc.bottom); //设置视频显示窗口的位置}

}

/************************************************************************/

/* 开始预览视频设备 */

/************************************************************************/ HRESULT CCaptureClass::PreviewImages(int iDeviceID , HWND hWnd)

{

HRESULT hr ;

//初始化视频捕获滤波器链表管理器

hr = InitCaptureGraphBuilder();

if(FAILED(hr)){

AfxMessageBox(_T("Failed to get video interfaces!"));

return hr ;

}

//把指定采集设备与滤波器绑定

if( !BindFilter(iDeviceID,&m_pBF)) return S_FALSE;

//把滤波器添加到滤波器链表中

hr = m_pGB->AddFilter(m_pBF,L"Capture Filter");

//渲染媒体,把链表中的滤波器链接起来

hr =

m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,m_pBF,NULL,NULL );

if(FAILED(hr)){

AfxMessageBox(_T("Can't build the graph"));

return hr ;

}

//设置视频显示窗口

m_hWnd = hWnd; //初始化窗口句柄

SetupVideoWindow(); //设置显示窗口

hr = m_pMC->Run();

if(FAILED(hr)){

AfxMessageBox(_T("Couldn't run the graph!"));

return hr ;

}

return S_OK ;

}

/************************************************************************/

/* 设置捕获视频的文件,开始捕捉视频数据写文件 */

/************************************************************************/ HRESULT CCaptureClass::CaptureImages(CString inFileName)

{

HRESULT hr = 0 ;

m_pMC ->Stop(); //先停止视频

//设置文件名,注意第二个参数的类型

hr =

m_pCapture->SetOutputFileName(&MEDIASUBTYPE_Avi,inFileName.AllocSysString(),&pM ux,NULL) ;

//渲染媒体,链接所有滤波器

hr =

m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,NULL,pMux );

pMux->Release();

m_pMC->Run(); //回复视频

return hr ;

}

int CCaptureClass::EnumDevices(HWND hList)

{

if (!hList)

return -1;

int id = 0;

//枚举视频扑捉设备

ICreateDevEnum *pCreateDevEnum; /*此接口生成一个特殊类别的设备枚举器,The System Device Enumerator exposes this interface*/

HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,

CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);

if (hr != NOERROR)return -1;

IEnumMoniker *pEm=0; //此接口用来枚举一个"名字"组件或者枚举名字表中的名字

hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);//CreateClassEnumerator方法为指定的设备类生成一个类枚举器

if (hr != NOERROR)return -1;

pEm->Reset(); //由于IEnumMoniker接口有一个标准的参考计数,

pEm->Release(),一定要释放此接口

ULONG cFetched;

IMoniker *pM; //此接口包含允许你使用“名字”对象的方法,而名字对象包含能唯一确定COM对象的方法

while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK) //返回枚举器队列中指定数目的条款,下“1”个

{

IPropertyBag *pBag; //接口IPropertyBag提供一个有属性包的对象,对象可以在包里存储它的特征

hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); //返回包含被“moniker”确定的对象的存储位置的接口指针

if(SUCCEEDED(hr))

{

VARIANT var; //VARIANT结构体包括很多类型

var.vt = VT_BSTR; //vt, describes which of the union members is valid,bstrVal是有效的

hr = pBag->Read(L"FriendlyName", &var, NULL); //Asks the property bag to read the named

//property into a caller-initialized VARIANT,var接收

if (hr == NOERROR)

{

//CP_ACP:The current system Windows "ANSI" code page

//var.bstrVal被转化的

//-1表示长度被自动计算;str表示转化侯接收目标的地方;两个NULL使函数更快 id++;

//此函数处理指定的消息,hList窗口的句柄,此窗口处理此消息;CB_ADDSTRING要处理的消息

::SendMessage(hList, CB_ADDSTRING, 0,(LPARAM)var.bstrVal);

SysFreeString(var.bstrVal);

}

pBag->Release();

}

pM->Release();

}

return id;

}

HRESULT CCaptureClass::InitCaptureGraphBuilder()

{

HRESULT hr ;

//创建IGraphBuilder接口

hr =

CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void**)&m_pGB);

if(FAILED(hr)) return hr ;

//创建ICaptureGraphBuilder2接口

hr =

CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGrap hBuilder2,(void**)&m_pCapture) ;

if(FAILED(hr)) return hr ;

//初始化滤波器链表管理器IGraphBuilder

m_pCapture->SetFiltergraph(m_pGB);

//查询媒体控制接口

hr = m_pGB->QueryInterface(IID_IMediaControl,(void**)&m_pMC);

if(FAILED(hr)) return hr ;

//查询视频窗口接口

hr = m_pGB -> QueryInterface(IID_IVideoWindow,(LPVOID*)&m_pVW);

if(FAILED(hr)) return hr ;

return hr ;

}

//////////////////////////////////////////////////////////////////////////

//配置摄像头数据源格式:分辨率、RGB/I420等

void CCaptureClass::ConfigCameraPin(HWND hwndParent)

{

HRESULT hr ; //返回值

IAMStreamConfig *pSC ; //流配置接口

ISpecifyPropertyPages *pSpec ; //属性页接口

//只有停止后,才能进行引脚属性的设置

m_pMC ->Stop();

//首先查询捕获CAPTURE、视频VIDEO接口

hr =

m_pCapture->FindInterface(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,IID_IAMS treamConfig,(void**)&pSC);

CAUUID cauuid ; //所有属性页结构体

hr = pSC->QueryInterface(IID_ISpecifyPropertyPages,(void**)&pSpec);

if( hr == S_OK ){

hr = pSpec->GetPages(&cauuid); //获取所有属性页

//显示属性页

hr =

OleCreatePropertyFrame(hwndParent,30,30,NULL,1,(IUnknown**)&pSC,cauuid.cElems,(

GUID*)cauuid.pElems,0,0,NULL);

//释放内存、资源

CoTaskMemFree(cauuid.pElems);

pSpec->Release();

pSC->Release();

}

//回复运行

m_pMC->Run();

}

////////////////////////////////////////////////////////////////////////// //配置图像参数:亮度、色度、饱和度等

void CCaptureClass::ConfigCameraFilter(HWND hwndParent)

{

HRESULT hr = 0 ;

ISpecifyPropertyPages *pProp ;

hr = m_pBF->QueryInterface(IID_ISpecifyPropertyPages,(void**)&pProp);

if(SUCCEEDED(hr))

{

//获取滤波器名称和IUnknown接口指针

FILTER_INFO FilterInfo ;

hr = m_pBF->QueryFilterInfo(&FilterInfo);

IUnknown *pFilterUnk ;

m_pBF->QueryInterface(IID_IUnknown,(void**)&pFilterUnk);

//显示该页

CAUUID caGUID ;

pProp ->GetPages(&caGUID);

OleCreatePropertyFrame(

hwndParent,

0,0,

FilterInfo.achName,

1,

&pFilterUnk,

caGUID.cElems,

caGUID.pElems,

0,

0,NULL

);

//释放内存、资源

CoTaskMemFree(caGUID.pElems);

pFilterUnk->Release();

FilterInfo.pGraph ->Release();

pProp->Release();

}

m_pMC->Run();

}

在dialog类中声明一个CaptureClass的对象m_cap:

/*CaptureVideoDlg.h*/

#pragma once

#include "afxwin.h"

#include "CaptureClass.h"

// CCaptureVideoDlg 对话框

class CCaptureVideoDlg : public CDialog

{

// 构造

public:

CCaptureVideoDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据

enum { IDD = IDD_CAPTUREVIDEO_DIALOG };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现

protected:

HICON m_hIcon;

// 生成的消息映射函数

virtual BOOL OnInitDialog();

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

CStatic m_videoWindow;

public:

CComboBox m_listCtrl;

CCaptureClass m_cap ;

public:

afx_msg void OnBnClickedPreview();

public:

afx_msg void OnBnClickedCapture();

public:

afx_msg void OnBnClickedVideoFormat();

public:

afx_msg void OnBnClickedImageParameter();

public:

afx_msg void OnBnClickedExit();

};

/*CaptureVideoDlg.cpp*/

#include "stdafx.h"

#include "CaptureVideo.h"

#include "CaptureVideoDlg.h"

………………………………

BOOL CCaptureVideoDlg::OnInitDialog()

{

…………

// TODO: 在此添加额外的初始化代码

m_cap.EnumDevices(m_listCtrl);//枚举视频设备,并发送消息给设备下拉列表m_listCtrl.SetCurSel(0);

…………

}

void CCaptureVideoDlg::OnBnClickedPreview()

{

// TODO: 在此添加控件通知处理程序代码

HWND hVWindow = m_videoWindow.GetSafeHwnd(); //获取视频显示窗口的句柄int id = m_listCtrl.GetCurSel(); //获取当前选中的视频设备

m_cap.PreviewImages(id,hVWindow);

}

void CCaptureVideoDlg::OnBnClickedCapture()

{

// TODO: 在此添加控件通知处理程序代码

CString strFilter = _T("AVI FILE (*.avi)| *.avi|"); //文件类型过滤器strFilter += "All File (*.*) | *.* |";

CFileDialog dlg( TRUE ,

NULL,NULL,OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,strFilter,this);

if(dlg.DoModal() == IDOK ){

CString m_sourceFile = dlg.GetPathName(); //获取用户输入的文件路径名 m_cap.CaptureImages(m_sourceFile);

}

}

void CCaptureVideoDlg::OnBnClickedVideoFormat()

{

// TODO: 在此添加控件通知处理程序代码

m_cap.ConfigCameraPin(this->m_hWnd);

}

void CCaptureVideoDlg::OnBnClickedImageParameter()

{

// TODO: 在此添加控件通知处理程序代码

m_cap.ConfigCameraFilter(this->m_hWnd);

}

void CCaptureVideoDlg::OnBnClickedExit()

{

// TODO: 在此添加控件通知处理程序代码

CDialog::OnOK();

}

源代码下载地址:

https://www.360docs.net/doc/9810120796.html,/file/aq20aqgm#CaptureVideo.rar

WDM 视频捕获介绍

WDM 视频捕获介绍 -孙涛- 摘要:该文主要提供一些在Win98,win2K及以上操作系统中,进行Windows Driver Model(WDM)视频捕获的相关知识介绍。如果你对WDM视频捕获感兴趣,可以来看看这些东西。欢迎到我的博客https://www.360docs.net/doc/9810120796.html,/suntaoznz看其他文章! 目录 Windos下视频捕获简史 (1) WDM和视频捕获 (1) VfWWDM Mapper (2) WDM 视频捕获结构 (2) DirectShow应用程序 (3) DirectShow Filter Graph (3) WDM数据流 (4) 视频捕获Minidrivers (4) Pins, Streams, Formats (4) 视频流命名约定 (5) DirectShow 视频捕获的接口和属性 (5) 捕获数据流类型 (6) 流输出数据格式 (6) 结束语 Windos下视频捕获简史 VFW(Video For Windows)1.0版本在1992年11月发布,它是为在Windows3.1下将电影最优化地捕获到磁盘上而发布的。从那以后,视频捕获技术就越来越受到关注了。 VFW技术同样受到了很多批评,它捕获的数据保存到磁盘上会占用大量磁盘空间,每秒数据量超过20M,同时需要大量的客户端支撑软件,VFW体系架构上的不足在视频会议应用上和PC/TV应用上被暴露无遗,这样就要求一种新的视频捕获技术来弥补这些不足。 VFW的体系结构缺乏为视频会议,电视浏览,视频区域捕获和VBI(Vertical Blanking Interval)数据流提供强而有效的支持。一些视频卡等设备开发商在设计自己的产品时,针对这些缺陷,对VFW进行了功能扩展。由于没有统一的标准,我们的应用程序在使用这些扩充的功能时,就必须要写一些基于特定硬件的代码。这就意味着当要改变捕获驱动程序时,就必须要对显卡的驱动程序进行修改。 WDM和视频捕获 WDM 视频捕获设计就是为了来解决VFW体系结构中存在的这些问题。WDM视频捕获主要的好处体现在:

DirectShow之接口实战篇

在正确安装好DirectX SDK后,我们必须设置DirectX SDK的头文件和库文件,使其在Visual Studio的搜索路径内。对于Visual Studio .NET 2003可如下进行设置:菜单→工具→选项→项目→VC++目录,在包含文件中加入D:\DXSDK\Include,在库文件中加入 D:\DXSDK\lib(我的SDK的安装路径是D:\DXSDK): 头文件 文件名称描述 Dshow.h所有的DirectShow应用都必须包含库文件 文件名称描述 Strmiids.lib此库文件中导出类标识(CLSID)和接口标识 (IID),所有的DirectShow应用都必须包含此 文件。 Quartz.lib此库文件中导出函数AMGetErrorText,如果 你的程序中调用了此函数,则必须包含此库 文件。 DirectShow之接口实战篇(一) 现今自己编程做一个多媒体播放工具是一件很令人开心愉悦的事情,但如果使用MediaPlay 控件开发则会受到很多限制,自己的很多好的创意想法都无法或者很难实现,如果利用微软的DirectX接口开发则可以充分的将作者的独特想法付诸于实现,何乐而不为呢!!不过关于DirectShow接口的开发说明文档实在是少之又少,仅有的一些不是英文的就是一些关于理论方面的,真正关于接口实战编程而且是用Delphi开发工具实现的更是凤毛麟角,使很多人都望而却步。在这里,我把我应用Directshow开发的心得以及我搜集到一些资料重新整理编辑出来公布,希望对所有由此兴趣的同仁有所帮助,就算达到了我的目的。废话少说,进入正文。 既然是接口实战篇,就先把一些常用的接口列出来,让大家有一些基本的认识,都是用来做什么的,什么时候我们会需要用到此接口。 IFilterGraph 过滤通道接口 IFilterGraph2 增强的IFilterGraph IGraphBuilder 最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager IMediaControl 用来控制流媒体,例如流的启动和停止暂停等,播放控制接口 IMediaEvent 播放事件接口,该接口在Filter Graph发生一些事件时用来创建事件的标志信息并传送给应用程序 IMediaEventEx 扩展播放事件接口 IMediaPosition 播放的位置和速度控制接口(控制播放位置只能为设置时间控制方式) IMediaSeeking 另一个播放的位置和播放速度控制接口,在位置选择方面功能较强.设置播放格式,多种控制播放方式.常用的有:(1)TIME_FORMAT_MEDIA_TIME单位100纳秒。(2)TIME_FORMAT_FRAME按帧播放 IBasicAudio 声音控制接口

视频捕获

目录 一. 视频捕获快速入门 2 二.基本的捕获设置3 1.设置捕获速度:3 2.设置终止捕获 4 3.捕获的时间限制4 三.关于捕获窗口 4 1.创建一个A VICAP捕获窗口5 2.将一个捕获窗口连接至捕获设备5 3.父窗口与子窗口的交互 5 4.捕获窗口的状态6 四.视频捕获驱动和音频驱动 6 1.视频捕获驱动的性能: 6 2.视频对话框: 6 3.PREVIEW 和OVERLAY模式: 7 4.视频格式7 5.视频捕获设置7 6.声频格式8 五.使用视频捕获8 1.创建捕获窗口(CREATING A CAPTURE WINDOW) 8 2.连接到捕获驱动(CONNECTING TO A CAPTURE DRIVER) 9 3.列举所有已安装的捕获驱动(ENUMERATING INSTALLED CAPTURE DRIVERS) 9

4.得到捕获驱动的性能(OBTAINING THE CAPABILITIES OF A CAPTURE DRIVER) 9 5.得到捕获窗口的状态(OBTAINING THE STATUS OF A CAPTURE WINDOW) 10 6.显示对话框设置视频特征(DISPLAYING DIALOG BOXES TO SET VIDEO CHARACTERISTICS) 10 7.得到和设置视频格式(OBTAINING AND SETTING THE VIDEO FORMA T) 11 8. 预览视频(PREVIEWING VIDEO) 12 9.将视频设置为OVERLAY模式(ENABLING VIDEO OVERLAY) 12 10.命名捕获文件(NAMING THE CAPTURE FILE) 12 11.格式化声频捕获(FORMATTING AUDIO CAPTURE) 12 12.改变视频捕获设置(CHANGING A VIDEO CAPTURE SETTING) 13 13.捕获数据(CAPTURING DA TA) 13 14.增加一个信息块(ADDING AN INFORMA TION CHUNK) 14 15.在程序中加入一个回调函数(ADDING CALLBACK FUNCTIONS TO AN APPLICATION) 14 16.创建一个状态回调函数(CREATING A STATUS CALLBACK FUNCTION) 16 17.创建一个错误回调函数( CREATING AN ERROR CALLBACK FUNCTION) 17 18.创建一个框架回调函数(CREATING A FRAME CALLBACK FUNCTION) 18 六.将四个标准对话框改成函数调用形式18 AUDIOFORMAT对话框19 VIDEOFORMA T对话框19 VIDEOSOURCE对话框20 VIDEO COMPRESSION对话框20

利用DirectShow开发自己的filter

学习directshow已经有几天了,下面将自己的学习心得写下来,希望对其他的人有帮助。Filter实质是个COM组件,所以学习开发Filter之前你应该对com的知识有点了解。Com组件的实质是一个实现了纯虚指针接口的C++对象。关于com的东西,这里不多讲。 一给vc配置DirectShow的开发环境 无论开发Filter还是开发Dshow的应用程序都要配置一下开发环境的,其实就是包含一下dshow用到的头文件和动态库。选择Tools菜单下面的Options。在弹出的Option对话框配置如下 图1 添加头文件 选择动态库文件添加到工程中

图2 添加动态库 二创建工程以及Filter的入口函数 创建工程 一般情况下,创建Filter使用一个普通的Win32 DLL项目。而且,一般Filter项目不使用MFC。这时,应用程序通过CoCreateInstance函数Filter实例;Filter与应用程序在二进制级别的协作。另外一种方法,也可以在MFC的应用程序项目中创建Filter。 在vc里新建一个工程,选择win32动态库,如下图 图3 图4

这样生成了一个简单的DLL,只有一个Dllmain入口函数。 下面我要给这个filter添加入口函数了。 Filter是个基于DLL的com组件,所以一般的Filter都要实现下面几个入口函数 首先定义导出函数 要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。使用导出函数关键字_declspec(dllexport)创建MyDll.dll就是在 .h文件中定义定义函数如下: 为了用.def文件创建DLL,往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码: LIBRARY MyFilter.ax EXPORTS DllMain PRIVATE DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE DllRegisterServer PRIVATE DllUnregisterServer PRIVATE 其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加@n,如Max@1,Min@2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到MyDll.dll和MyDll.lib文件。 然后要定义这些函数的实现了,其实这些工作dshow的基类里都已经替我们做好了,我们所要做的就拿来用就是了,最重要的三个函数的实现一般如下

基于DirectShow视频及图片捕获软件的开发

基于DirectShow视频及图片捕获软件的开发 我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等。DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。 笔者使用visual studio 2005 来开发了基于DirectShow的视频捕获软件,并用开发的软件对映美精相机进行了测试。本软件不但可以实现对相机的视频捕获,而且还可以抓取图像帧。软件运行时自动搜索所连接的相机,预览后可以对相机参数进行设置。下面是软件的主界面。 预览视频后可以对视频格式和图像参数进行设置。开始预览时,捕获的视频是黑白的,我们将颜色空间设置为UYVY即可捕获彩色视频。

下面是捕获的一帧图像,图像质量虽然没有映美精自带的软件效果好,但已经实现了所需各项基本功能,接下来的工作将会进一步提高软件性能。 另外我们还可以捕获视频,点击“捕获视频”按钮,输入要保持的文件名,注意要以.avi后缀结尾,点确定就开始捕获视频。 从我们开发的软件可以看到,映美精的相机能够很好的支持DirectShow的驱动,我们的软件对映美精相机的识别是如此的容易。接下来我们将继续开发基于其它驱动的图像捕获软件,为最终实现在一个软件中识别各种相机而努力。我们将逐步开放我们的源代码,以便更多的同行一起来探讨相机的图像采集技术。 下面是详细的软件开发过程。 一、安装DirectShow和visual studio 2005 首先我们安装DirectShow SDK,它有许多版本,作者使用的是2003年发布的dx90bsdk.exe,安装在D盘的DXSDK下。软件下载地址为 https://www.360docs.net/doc/9810120796.html,/download/b/6/a/b6ab32f3-39e8-4096-9445-d38e6675de85/dx90bsdk.exe。 然后安装好visual studio 2005。安装完以后我们将进行开发环境的配置。 二、开发环境配置

小区出入口道闸管理系统施工方案知识讲解

小区出入口道闸管理系统施工方案

小区出入口道闸管理系统施工方案 小区出入口道闸管理系统施工方法 一、施工准备 1.1 人员 1、项目工程师 1名:负责工程调配、进度及技术指导。 2、专业施工人员 2名:负责工程具体工作。 3、安全与质量监督员 1名:负责工程质量控制及安全文明施工。 1.2 工具 1、路面切割机 1台:在混凝土路面上切割地感线圈槽。 2、布线布管工具 1套。 3、专业接线调试工具 1套:主要包括压线钳、万用表、电阻计、电脑等。 1.3 施工现场环境 1、AC220V 2000W临时电源(100米范围内)。 2、自来水源(200米范围内)。

3、良好的通风条件。 4、无杂物堆放的施工表面。 二、切割并制作地感线圈 车辆检测器的地感线圈是停车场管理系统中的重要零件,它的工作稳定性直接影响整个系统的运行效果,因此地感线圈的制作是工程安装过程中很重要的一个工作环节。制作地感线圈前要考虑以下几点: 1、周围50公分范围内不能有大量的金属,如井盖、雨水沟盖板等。 2、周围1米范围内不能有超过220V的供电线路。 3、制作多个线圈时,线圈与线圈之间的距离要大于2米,否则会互相干扰。 2.1 切割地感线圈槽 按照图纸在路面上规画好地感线圈尺寸的线条,用路面切割机按线条切割方形的线圈槽,要求: 1、停车场中地感线圈大小一般为1.8米宽、1.2米长左右 2、转角处切割10公分X10公分的倒角,防止坚硬的混凝土直角割伤线圈。 3、槽的深度为4公分,线圈槽宽度为0.5公分,线圈引线槽的宽度为1公分,深度和宽度要均匀一致,应尽量避免忽深忽浅、忽宽忽窄的情况。 4、切割完毕的槽内不能有杂物,尤其不能有硬物,要先用水冲洗干净,然后烘干。

实现DirectShow技术开发准备

C#实现DirectShow技术开发准备 时间:2009-10-21 23:45 点击:73次字体:[大中小] DirectShow组件在“C:WINDOWSsystem32”目录下的Quartz.dll动态库中,要使C#代码引用COM对象和接口,必须将COM类型库转换为.NET框架元数据,从而有效地创建一个可以从任何托管语言调用的托管包装。在转换过程中需要使用FrameWork SDK自带的TlbImp命令工具,该命令工具在“D:Program FilesMicrosoft Visual Studio 8SDKv2.0BinTlbImp.exe”目录下(取决于Visual Studio 2005的安装路径)。该命令的使用方法为: TlbImp C:WINDOWSsystem32quartz.dll out:C:WINDOWSsystem32quartzDriectShow.dll 在DOS命令下执行转换成功。 转换完成后需在应用程序引用quartzDriectShow,引用quartzDriectShow.dll组件步骤如下: (1)在Visual Studio 2005开发环境中,选择菜单“项目”/“添加引用”命令,弹出“添加引用”对话框。 (2)选择“浏览”选项卡,通过浏览找到引用quartzDriectShow.dll所在的位置,并引用到程序中来。 (3)最后引入using quartzDriectShow,在程序中可以开发相关多媒体程序了。 开发人员还可以通过编写自己的过滤器扩展DirectShow多媒体支持。下面是DirectShow组件的接口。 l IFilterGraph:过滤通道接口。 l IFilterGraph2:增强的IfilterGraph。 l IGraphBuilder:最为重用的COM接口,用于手动或者自动构造过滤通道Filter Graph Manager。 l IMediaControl:用来控制流媒体(如流的启动和停止暂停等)播放控制接口。 l IMediaEvent:播放事件接口,该接口在FilterGraph发生一些事件时用来创建事件的标志信息并传送给应用程序。 l IMediaEventEx:扩展播放事件窗口。 l IMediaPosition:播放的位置和速度控制接口(控制播放放置只能为设置时间控制方式)。 l IMediaSeeking:另一个播放的位置和播放速度控制接口,在位置选择方面功能较强,设置播放格式。常用的控制播放方式有:TIME_FORMAT_MEDIA_TIME单位100纳秒;TIME_FORMAT_FRAME按帧播放。 l IBasicAudio:声音控制接口。

基于DirectShow视频及图片捕获软件的开发

我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等。DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。 笔者使用visual studio 2005 来开发了基于DirectShow的视频捕获软件,并用开发的软件对映美精相机进行了测试。本软件不但可以实现对相机的视频捕获,而且还可以抓取图像帧。软件运行时自动搜索所连接的相机,预览后可以对相机参数进行设置。下面是软件的主界面。 预览视频后可以对视频格式和图像参数进行设置。开始预览时,捕获的视频是黑白的,我们将颜色空间设置为UYVY即可捕获彩色视频。 下面是捕获的一帧图像,图像质量虽然没有映美精自带的软件效果好,但已经实现了所需各项基本功能,接下来的工作将会进一步提高软件性能。 另外我们还可以捕获视频,点击“捕获视频”按钮,输入要保持的文件名,注意要以.avi后缀结尾,点确定就开始捕获视频。 从我们开发的软件可以看到,映美精的相机能够很好的支持DirectShow的驱动,我们的软件对映美精相机的识别是如此的容易。接下来我们将继续开发基于其它驱动的图像捕获软件,为最终实现在一个软件中识别各种相机而努力。我们将逐步开放我们的源代码,以便更多的同行一起来探讨相机的图像采集技术。 下面是详细的软件开发过程。 一、安装DirectShow和visual studio 2005 首先我们安装DirectShow SDK,它有许多版本,作者使用的是2003年发布的,安装在D盘的DXSDK下。软件下载地址为。 然后安装好visual studio 2005。安装完以后我们将进行开发环境的配置。 二、开发环境配置

小区道闸系统设计方案模板

道闸系统设计方案。 、

道闸系统方案 … 》 公司: 杭州理想自动门厂 地址:杭州市莫干山路12418号(上城区工业园) 联系人:王一炜 电话:8, 网址:公司: 赣州锦腾智能科技有限公司 地址: ~ 联系人: 电话: ~ 前言 首先感谢贵单位对赣州锦腾智能科技有限公司推荐的停车场系统的关心与厚爱,以及在百忙之中对本方案作出批评与指正,我们会尽最大的努力满足贵方的需求。

智能停车场电脑收费管理系统是现代化停车场车辆收费及设备自动化管理的统称,是将车场完全置于计算机管理下的高科技机电一体化产品。 本公司自主开发的非接触式IDC卡停车场管理系统是一种高效快捷、公正准确、科学经济的停车场管理手段,是停车场对于车辆实行动态和静态管理的综合。从用户的角度看:其服务高效、收费透明度高、准确无误;从管理者的角度看:其易于操作维护、自动化程度高、大大减轻管理者的劳动强度;从投资者角度看:彻底杜绝了任何形式的作弊,防止停车费用流失,使投资者的回报有了可靠的保证。 本系统以非接触式ID卡为信息载体,通过ID卡记录车辆进出信息,利用计算机管理手段确定停车计费金额,结合工业自动化技术控制机电一体化外围设备,从而使进出停车场的各种车辆得到了有效的控制。 与其它系统相比,本系统具有以下优势: 量体裁衣:具有独立知识产权,掌握关键产品的底层技术,能够满足用户的各种需求,从硬件及软件上均可以按照用户的需求来开发生产和安装; , 符合国情:国内车辆类别的分类、收费方式、各种特许车辆的处理等等,与其他国家和地区不同,国外的同类产品均是由大陆地区的代理商或安装公司负责,他们只能进行设备不同型号的搭配组合,不具备软硬件的底层开发设计,更重要的是国外产品并非是按照中国国情来开发设计,其系统的管理模式与使用模式无法满足国人的需要; 功能完善:近千个不同应用场合的工程范例,已经使得系统能够满足各种用户的使用需求; 型号齐全、配套完善:从控制主机、自动道闸、车辆检测器、等等,产品种类繁多,可根据需求,进行灵活组合。 一、系统设计方案总则 1、方案总体说明 随着社会的不断进步,小区、大厦A级智能化包含了车辆(库)智能管理系

停车场道闸方案

辰阳新村智能小区系统 设 计 方 案 滕州市通信科技有限公司 2012-12-28

企业简介 滕州市通信科技有限公司为中国安防协会会员单位,是一家集开发、生产、销售和服务于一体的国家级高新技术企业。公司致力于“智能一卡通”管理系统和相关机电一体化产品的整体开发,在安防工程设计、施工工作中讲质量、重安全、守信誉,被确认为:AAA+级资信示范单位和安防工程质量安全信誉十佳放心单位。 通信科技利用中国市场的国际先进技术和设备,提供优质的工程安装、技术支持和售后服务。同时,尽可能用最短的时间,为用户提供最完美成熟的系统解决方案。获得深圳市公安局安全技术防范工程设计、施工、维修许可证单位荣誉。 主要产品有: ●小区管理系统 ●车辆信息采集报送系统 ●楼宇对讲管理系统 ●门禁管理系统 ●考勤管理系统 ●消费管理系统 ●巡更管理系统 ●通道闸管理系统 ●智能电梯控制系统 公司拥有一批多年从事“智能一卡通和机电一体化”的研发高素质人才,并在总结国内外众多同类产品的优点基础上,利用数字化控制技术并结合我们多年项目实施经验,探索出全新的思路,彻底摈弃了原有产品的不足之处, 为客户提供最佳的需求分析,项目规划和实施方案,突破了行业的局限性,并不断深入开发、改进,推出新一代的“深创”智能一卡通系列产品。 与此同时,利用先进的技术优势和综合实力雄厚为社会各界数十个单位提供了工程设计、安装、保养服务。 公司一直以“科技创新,以人为本”的精神,努力为客户提供高品质的产品,始终保持“诚信务实,服务至上”的企业理念,与新老客户携手并进,共创辉煌!

系统设计概述 一、前言 传统小区管理存在着管理成本高、劳动强度大、服务效率低、资金流失和车辆失窃严重等各种弊端,无法保障投资者的收益及停放车辆的安全,因而严重制约了小区事业的发展。 本数字智能型小区管理系统借鉴了国际上发达国家同行业的先进管理模式,采用了国际上最先进的感应式IC、ID卡、单片及微型计算机技术,结合本国实际情况开发了具有完全自主知识产权及核心技术的小区管理系统。 该系统采用非接触式操作,具有方便快捷、收费准确、稳定可靠、适合国情、安全性好、形式灵活、功能强大等众多优点。 我司小区系统自开发后使用以来,已先后在广东、上海、北京等中国大陆发达城市各地火爆安装。经众多用户的使用证明,该系列产品能够有效地解决人工管理小区所存在的问题,深受业主、车主双方好评。几年来,在国内同行的努力下,已成功地替代了国外纸带式条码卡、磁卡、接触式ID卡等落后的收费系统而成为当今小区设备的主流,对中国小区事业的发展起到了十分重要的作用。 二:道闸需求分析 2.1方案提示的背景 ?小区内车辆易丢失。 ?未经授权的车辆擅自进入车场,自有车辆、外来车辆和特殊车辆无法区分。 ?收费漏洞太大,收费人员徇私舞弊,和乱收费,无法避免人情车的进入,如何更好的堵塞资金漏洞。 ?小区管理人员太多,成本过高。 ?每天上下班时,车流量太大,填单、收费太慢,效率较低,车主不满。 ?提主物业管理的管理水平,提高小区、大厦的档次。 2.2推荐系统说明 ?跟据贵单位的小区要求,特推荐用我司的SCK700系统; ?该系统设计为一进一出的非接触式IC卡智能小区管理系统,采用我司SCD801道闸,可以满足长期稳定运行,满足快速起、降杆的要求;

C++摄像头视频捕捉程序

Visual C++编程实现摄像头视频捕捉 摘要:本文主要讲述用Directshow进行视频捕捉(捕捉静态图像)的编程思路,并提供针对摄像头编程的一个视频捕捉类CcaptureVideo和一个示例。 前言 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。用DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据, 并且进行相应的后期处理乃至存储到文件中。 DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序编写的基础知识。DirectShow提供了大量的接口,但在编程中发现还是不够方便,如果能构 建一个视频捕捉类把常用的一些动作封装起来,那么就更方便了。 编程思路 为了更加容易建立视频捕捉应用程序,DirectShow提供了一个叫做Capture Graph Builder的对象,Capture Graph Builder提供IcaptureGraphBuilder2接口,该接口可以建立和控制Capture Graph。 建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个适当的视频捕捉设备。选择好设备后,为该设备创建Capture filter,然后调用AddFilter 把Capture filter添加到Filter Graph。 如果仅仅希望用摄像头来进行实时监控的话,只需要在上面的基础上调用ICaptureGraphBuilder2::RenderStream就可以了: ICaptureGraphBuilder2 *pBuild; // Capture Graph Builder //省略初始化部分代码 IBaseFilter *pCap; // Video capture filter. //省略初始化和添加到Filter Graph部分代码 pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL); DirectShow提供了一个捕捉静态图像的方法:使用Sample Grabber filter。依次按照以下三个步骤就可以了: 第一步, 定义一个类实现Sample Grabber的回调接口IsampleGrabberCB: class CSampleGrabberCB : public ISampleGrabberCB { //在后面提供的类中具体完成 }

小区出入口道闸管理系统建筑施工办法

小区出入口道闸管理系统施工方案 小区出入口道闸管理系统施工方法 一、施工准备 1.1 人员 1、项目工程师1名:负责工程调配、进度及技术指导。 2、专业施工人员2名:负责工程具体工作。 3、安全与质量监督员1名:负责工程质量控制及安全文明施工。 1.2 工具 1、路面切割机1台:在混凝土路面上切割地感线圈槽。 2、布线布管工具1套。 3、专业接线调试工具1套:主要包括压线钳、万用表、电阻计、电脑等。 1.3 施工现场环境 1、AC220V 2000W临时电源(100米范围内)。 2、自来水源(200米范围内)。 3、良好的通风条件。

4、无杂物堆放的施工表面。 二、切割并制作地感线圈 车辆检测器的地感线圈是停车场管理系统中的重要零件,它的工作稳定性直接影响整个系统的运行效果,因此地感线圈的制作是工程安装过程中很重要的一个工作环节。制作地感线圈前要考虑以下几点: 1、周围50公分范围内不能有大量的金属,如井盖、雨水沟盖板等。 2、周围1米范围内不能有超过220V的供电线路。 3、制作多个线圈时,线圈与线圈之间的距离要大于2米,否则会互相干扰。 2.1 切割地感线圈槽 按照图纸在路面上规画好地感线圈尺寸的线条,用路面切割机按线条切割方形的线圈槽,要求: 1、停车场中地感线圈大小一般为1.8米宽、1.2米长左右 2、转角处切割10公分X10公分的倒角,防止坚硬的混凝土直角割伤线圈。 3、槽的深度为4公分,线圈槽宽度为0.5公分,线圈引线槽的宽度为1公分,深度和宽度要均匀一致,应尽量避免忽深忽浅、忽宽忽窄的情况。 4、切割完毕的槽内不能有杂物,尤其不能有硬物,要先用水冲洗干净,然后烘干。 5、地感线圈的引线槽要切割至安全岛的范围内,避免引线裸露在路面。 2.2 埋设地感线圈 线圈槽切割好并清洗干燥后,要及时埋设线圈,防止杂物掉入槽内。按如下步骤制作地感线圈:

从HDMI源捕获实时视频

Epiphan的耐用型,便携式,易于使用的视频采集器系列让您可以捕捉实时视频,无论其来源如何。凭借VGA,DVI / HDMI和SDI 的专用输入,我们的外部USB视频采集卡和内置PCIe视频采集卡可以胜任于任何工作。 支持HDMI捕获,DVI2USB 3.0通过USB 3.0运行,并且向后兼容USB 2.0。我们的PCIe卡DVI2PCIe Duo提供最快的捕获率并支持全高或半高的安装。 高分辨率的HDMI视频捕获 HDMI连接是各种产品的标准配置,从高清电视和蓝光光盘播放器到多媒体电脑,游戏系统等。HDMI设备的视频质量优于过去的模拟设备。 便携式媒体播放器,数码相机,电视,电脑,手机,平板电脑和数码摄像机正在推动HDMI的普及。由于HDMI现在已成为提供视频和音频的大量计算机,相机和移动设备的主要接口,因此用户需要拥有值得信赖的解决方案,以便他们能够从这些设备上的视频源执行HDMI视频捕获。

使用带有HDMI到DVI适配器或电缆的DVI2USB 3.0和DVI2PCIe Duo,可以从所有这些HDMI视频设备进行无损图像捕获。(使用Epiphan Frame Grabbers无法捕获受HDCP保护或加密的受版权保护的知识产权内容)。 将HDMI视频源连接到Epiphan视频采集卡(适配器随DVI2USB 3.0和DVI2PCIe Duo一起提供)后,系统会将视频采集卡识别为应用程序作为高分辨率摄像机。这种方法可以在捕获图像和视频时使用第三方视频编辑,流媒体和录制软件。或者,使用Epiphan的免费捕获工具或SDK,您可以将视频采集器捕获集成到自定义解决方案中,以满足特定应用程序的需求。 HDMI能够承载完整的1080p视频和多声道音频。HDMI和DVI2USB3.0以及DVI2PCIe Duo支持内嵌音频捕获。 DVI2USB 3.0 DVI2USB 3.0是一款高性能USB视频采集卡,可通过HDMI,DVI 或VGA输出端口从任何设备进行无损视频采集。

小区车库道闸改造方案

爱丁堡车库改造升级 设 计 方 案 威远龙瑞芯电子科技有限责任公司 目录

第1章公司简介 (3) 第2章公司营业执照 (4) 第3章公司安装案列 (4) 第4章停车场管理系统 (5) 4.1功能概述 (5) 4.2设计原则 (6) 4.3系统组成 (7) 第5章本次改造报价 (8) 第6章施工方案及售后服务 (10)

第1章公司简介 威远龙瑞芯电子科技有限责任公司主要从事门禁系统、楼宇系统、企业办公系统、LED 安装、电脑维护与安装的弱电工程有限公司,成立与2018年,以多年来“适应于市场、服务于客户”的经营理念,凭借高新技术、高新产品和高效率的管理机制,经过我们的团队多年的努力在安防监控安装上面取得了卓越的成就.在该领域具有较强的影响力。本公司坐落于威远县税务巷20号(圆通快递旁)本公司分为业务部,门市部,技术部,安装部,有着良好的管理模式。 本公司与成都吉联科技、成都海康威视、深圳深鑫辉科技有限公司,达成了共视,实现了与这几家公司的结盟,公司所用防盗监控均为海康威视、硬盘录象机也均为海康. 现公司与威远家美物业、威远可为物业、威远汇巨吉物业有着长期的道闸门禁系统维护工作,由本公司尽心尽力的维护三大物业其下小区(爱丁堡、高升家园、水岸生活、清溪鹭岛、后湾、丽景雅苑、东风花园、城市花园、万家花园等)所有弱店设备的安装与维护。

第2章公司营业执照第3章公司安装案列

第4章停车场管理系统 4.1功能概述 在小区出入口,地下停车厂设立道闸门、地下停车场道闸门联动卷帘门、读卡器,方便小区管。。 车牌识别系统:对录入系统的车牌号码自动识别,自动起杆、落杆; 对外停车:可对外自动记录车辆出入时间,自动计费; 资金安全:系统对道闸非法打开事件进行记录(如遥控开闸、手动开闸等),同时控制对非法开闸发出声音进行报警,使得任何一次、任何情况下的车辆进出都有据可查、可以监管,有效避免了因值班人员的疏忽或有意作弊而造成的资金流失; 系统规模任意扩展:系统中同一类型相同或不同功能的工作站的数量不受限制;系统内每一个区的出入口控制机可以多达127个; 脱机、脱网运行:系统在网络或电脑出现故障的情况下,仍然能够正常工作;脱机状态下车辆进出场的记录可以保存2000条,黑名单1024条;当电脑与网络修复后,存在控制机中的脱机记录会自

DirectShow获取一张图片

DirectShow:图片的抓取 zz 在播放媒体文件的过程中,有一个很有用的功能,就是在当前播放的位置抓取图,实现这种图片抓取功能的方法很多,我们这里只介绍常用的两种。 第1种方法最简单,它使用1BasicVideo::GetCurrentImage接口方法,代码如下。 boolSnapshotBitmap(IBasicVideo*pBa8icVideo,ê? constchar*OutFile) if (pBasicVldeo) { long bitmapSize=0;ê? //首先获得图像大小 if(SUCCEEDED(pEasicVidee->GetcurrentImage(&bitmapSize,ê?0))) { bool pass=false;ê? //分¤?配?图a?像?帧?内¨2存?? unsignedchar*buffer=newunsignedchar[bitmapSize]; //获?取¨?图a?像?帧?数oy据Y if(SUCCEEDED(pBasicVideo->GetCurrentImage(&bitmapSize,(long*)buffer)) ) { BITMAPFILEHEADER hdr;ê? LPBITMAPINFOHEADER ipbi;ê? ipbi=(LPBITMAPINFOHEADER)buffer;ê? int nColors=1<biBitCount;ê? if(nColors>256) //always is”?àBM”?à hdr.bfType =((WORD)(‘?M’?¥<<8)|’?¥B’?¥);ê? hdr.ê?bfSize =bitmapSize+sizeof(hdr);ê? hdr.ê?bfReservedl =0; hdr.ê?bfReserved2 =0;ê? hdr.ê?bfOffBits =(DWORD) (sizeof(BITMAPFILEHEADER)+lpbi->biSize+nColors*sizeof(RGBQUAD)); CFilebitmapFile(outFile,ê?CFile:êo:êomodeReadWrite | CFile:êo:êomodeCreate | CFile:êo:êotypeBinary);ê? //写??入¨?位?图a?文?件t头a?¤ bitmapFile.ê?Write{&hdr,ê?sizeof 【?BITMApFILEHEADER)); //写??入¨?图a?像?帧?数oy据Y(包?¨1括¤?§BITMAPINFOHEADER信?息?é) bitmapFile.ê?Write(buffer,ê?bitmapSize);ê? bitmapFile.ê?Close();ê?

小区设置道闸系统的可行性报告

小区设置道闸系统的可行性报告 尊敬的公司领导: xx区的建筑理念是“六合一“的封闭式管理小区,内含商业性的开放内街,随着社会经济的增长,区域业户的生活水平较高,人均拥有小车现象比较普遍。但由于小区车位配套无限,如一期共有697户,小车位只有255个,导致一期路面每晚停放小车达40辆以上。而二期实行临停收费后,直接造成内街车满为患,每晚停车70辆以上,还有部分业户将车停放在南华路段,车辆停放日益吃紧。 为营造小区优良的公共秩序,我部建议在内街设置道闸系统,对内街的临停车辆实行收费管理,其优势在于: 1、平均大部分业主的心理,避免一期路面乱停放车辆的现象发生,保障消防通道的通畅; 2、整个小区实行临停收费,营造区域整体调和氛围,避免管理中出现的“一国两制“现象; 3、设置东西内街收费,可保持现有人数(8座、9座中门岗外调每班各1人即可),东边设置在7座3梯车库口旁,西边在西大门岗亭,人数不变的情况下增加职责覆盖面,对现场的管控压力也相对减少; 4、一次性投资,终生收益。::假设投入 设备需10万元,以内街一天24小时计,1天100辆,每车3元,每月收入9000元,基本上一年可以回本,况且现有一座3梯有一部现场的设备可以取用,只需移置即可; 5、减少出入口,有用控制外来人员的流动量,可减少降低安全事故的频率,符合住户对xx高档楼盘的需求。 6、按物管条例和交通管理法规,封闭内街更有利于物业工作开展,保障门岗工作运作。 当然凡事有其利必有其弊,内街设道闸后可能产生以下影响:1、影响内街商铺外来客源;但事实上内街商铺是针对区域业主经营的,以业主为主要客户群,只要物业与商家联手打造,多渠道加强宣传,引导消费群体到内街消费,活跃商业氛围,营造调和社区,可以达到双赢目的,为其他项目的创收打好基础;

利用DirectShow实现视频文件播放

DirectShow 媒体文件回放总结收藏 作者:Inkick 1.概述 DirectShow中媒体文件回放的过程也就是一个为媒体文件选择相应所需的Filter、构建Filter Graph、并对Filter Graph的状态进行维持、控制的过程。这里所说的媒体文件,不仅仅是指音频、视频文件,同时也包括bmp、jpeg、gif等图形图像格式以及midi等数字化音乐序列。 因此,使用DirectShow进行媒体文件的回放需要经过以下的步骤: 2.构建Filter Graph Filter Graph为Filter提供了一个容器,一个构建完整的Filter Graph也就是一个完整的Filter 连路,这个连路对于程序是透明的,可控制的。而对于每一个媒体文件来说,Filter Graph 与媒体文件存在着对应的关系。也就是说,一个Filter Graph只能实现一个(种)文件的回放。 在DirectShow中,Filter Graph是由接口对象IGraphBuilder实现的,我们可以调用Win32 API 函数CoCreateInstance()建立一个实体。Filter Graph实体建立之后并不具有任何的Filter,因此不具有任何实际用途。因此我们需要连接需要的Filter来完成FilterGraph的构建。 智能连接这个术语覆盖了一系列Filter Graph Manager用于构建所有或部份filter graph的算法。任何时候,当Filter Graph Manager需要添加filter来完成graph时,它大致做以下几件事情: 如果有一个filter存在于graph中,而且这个filter有至少一个没有连接的input pin,Filter Graph Manager试着去试用这个filter。 否则,Filter Graph Manager在已注册的filter中寻找连接时可以接受合适的媒体类型的filter。每一个filter都注册有一个Merit值,这个值用以标记哪个filter最容易被Filter Graph Manager 选中来完成graph。Filter Graph Manager按Merit值的顺序来选择filter,Merit值越大,被选中的机会越大。对于每种流类型(如音频、视频、MIDI),默认的renderer具有一个很高的Merit值,解码器同样是,专用filter具有低Merit值。 如果Filter Graph Manager选择的filter不合适,它会返回来尝试另外的filter组合。 我们有三种构建graph的途径: 1.filter graph manager构建整个graph 2.filter graph manager构建部分graph

Visual C++编程实现摄像头视频捕捉要点

前言 DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。DirectShow为多媒体流的捕捉和回放提供了强有力的支持。用DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。 DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序编写的基础知识。DirectShow提供了大量的接口,但在编程中发现还是不够方便,如果能构建一个视频捕捉类把常用的一些动作封装起来,那么就更方便了。 编程思路 为了更加容易建立视频捕捉应用程序,DirectShow提供了一个叫做Capture Graph Builder的对象,Capture Graph Builder提供IcaptureGraphBuilder2接口,该接口可以建立和控制Capture Graph。 建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个适当的视频捕捉设备。选择好设备后,为该设备创建Capture filter,然后调用AddFilter把Capture filter添加到Filter Graph。 如果仅仅希望用摄像头来进行实时监控的话,只需要在上面的基础上调用 DirectShow提供了一个捕捉静态图像的方法:使用Sample Grabber filter。依次按照以下三个步骤就可以了: 第一步, 定义一个类实现Sample Grabber的回调接口IsampleGrabberCB:

相关文档
最新文档