directshow、 Emgucv入门
本示例主要测试了directshow、Emgucv的视频流采集功能,其中Emgucv还实现了人脸的识别。示例源码下载
一、directshow的介绍
实现原理:directshow可以将摄像头的数据流以事件的方式实时传递给程序,程序在此事件中拿到流后可以保存为图片(流可以经过多个filterGraph2对象)。directshow提供将数据绑定到picturebox控件上。以下为打开一个摄像头的步骤:
1. 引入directshow.net控件
此控件可以在网上搜索,即好下载,名称为DirectShowLib-2005,它是directshow的.net版本的封装.
2. 初始化directshow相关的接口
代码如下:
int hr = ;
this.filterGraph2 = (IFilterGraph2)new FilterGraph();
this.captureGraphBuilder2 = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
this.mediaControl = (IMediaControl)this.filterGraph2;
this.videoWindow = (IVideoWindow)this.filterGraph2;
DsError.ThrowExceptionForHR(hr);
说明:
- filterGraph2:流过滤器
- captureGraphBuilder2:视频设备处理
- mediaControl:视频控制,如:开启或关闭等
- videoWidow:视频显示在窗体上的一些信息设置类
- filterGraph2会被附加到captureGraphBuilder2对象.
3. 找到摄像头设备
int hr = ;
IEnumMoniker classEnum = null;
IMoniker[] moniker = new IMoniker[];
object source = null; ICreateDevEnum devEnum = (ICreateDevEnum)new CreateDevEnum();
hr = devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, out classEnum, );
DsError.ThrowExceptionForHR(hr); Marshal.ReleaseComObject(devEnum); if (classEnum == null)
throw new Exception("classEnum is null"); if (classEnum.Next(moniker.Length, moniker, IntPtr.Zero) == )
{
Guid iid = typeof(IBaseFilter).GUID;
moniker[].BindToObject(null, null, ref iid, out source); //moniker绑定以 ibasefilter和object上
} Marshal.ReleaseComObject(moniker[]);
Marshal.ReleaseComObject(classEnum); return (IBaseFilter)source;
找到视频摄像头,将转换为一个IBaseFilter对象。
4. 增加摄像头、视频处理过滤器
将IBaseFilter对象加入到filterGraph2对象上,作为第一层视频的过滤,后面会放到picturebox控件上。然后再加入SampleGrabber对象,用于捕获每一帧的视频数据。
5. 设置摄像头显示参数、预览参数、 设置保存的尺寸信息
此步代码较多,就不在贴代码,后面给出源码下载地址.
6. 绑定以pictruebox控件上,以及运行
int hr = ;
hr = this.videoWindow.put_Owner(this.pictureBox.Handle);
DsError.ThrowExceptionForHR(hr); hr = this.videoWindow.put_WindowStyle(WindowStyle.Child);
DsError.ThrowExceptionForHR(hr); hr = this.videoWindow.put_Visible(OABool.True);
DsError.ThrowExceptionForHR(hr); System.Drawing.Rectangle rc = this.pictureBox.ClientRectangle;
hr = this.videoWindow.SetWindowPosition(, , , );
DsError.ThrowExceptionForHR(hr);
二、emgucv的介绍
emgucv是opencv的.net版本封装,并且opencv获取视频流的方式也是采用的directshow。由于进行了封装,打开和识别人像就极为简单了。
1. 下载emgucv并安装,然后在系统环境变量中添加其安装路径.
至此,还需复制相关的dll到开发项目中:
2. 打开摄像头
private VideoCapture capture;
private Mat mat;
private Common.DetectFace detectFace;
public Form1()
{
InitializeComponent();
CvInvoke.UseOpenCL = false;
detectFace = new Common.DetectFace();
} private void Form1_Load(object sender, EventArgs e)
{
capture = new Emgu.CV.VideoCapture();
capture.ImageGrabbed += Capture_ImageGrabbed;
capture.Start();
} private void Capture_ImageGrabbed(object sender, EventArgs e)
{
if (capture != null && capture.Ptr != IntPtr.Zero)
{
mat = new Mat();
capture.Retrieve(mat, ); var ls = detectFace.Detect(mat);
foreach(var face in ls)
{
CvInvoke.Rectangle(mat, face, new Bgr(Color.Red).MCvScalar, );
} imageBox1.Image = mat;
}
}
说明:
- Capture_ImageGrabbed捕获到的就是实时的视频流,在此处就可以做相关的处理。
- 此处加入了对人脸的识别,并用红框表示出来。
directshow、 Emgucv入门的更多相关文章
- DirectShow简单入门程序
1.首先确认已安装过相关工具及配置环境,然后打开vs2010,新建一对话框应用程序 取名为Player_test1,然后打开菜单->项目->属性-> 添加strmmiids.lib库 ...
- DirectShow 最简单的入门 -- 播放一段视频
#include <dshow.h> #pragma comment(lib,"strmbase.lib") #pragma comment(lib,"qua ...
- DirectShow开发快速入门之慨述
摘要:本篇文档概括性的介绍了DirectShow的主要组成部分,以及一些Directshow的基本概念.熟悉这些基本的知识对于Directshow的应用开发或者过滤器的开发者都会有所帮助. Direc ...
- EmguCV C# 安装入门教程
EmguCv3的安装. EmguCv3下载网址 http://sourceforge.net/projects/emgucv/files/emgucv/3.0.0/ 推荐下载第一个: 点击direct ...
- 使用C#+EmguCV处理图像入门(图像读取_显示_保存)二
上个随笔已经介绍EmguCV的一些常用库和程序安装以及环境变量的配置,这次写的是如何使用这个类库对图像进行操作. EmguCV图像处理系统组成(个人见解): 图像的基本操作: 贴个代码: using ...
- 使用C#+EmguCV处理图像入门(一)
首先我们先了解一下该库的一些相关信息 OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux.Windo ...
- 【EmguCV视频教程】VS2017+EmguCV3.4(C# OpenCV)高清入门视频教程
视频采用VS2017 + EmguCV3.4版本录制,内容类似本人的Python和C++版本,如果需要的朋友可加我咨询,视频共40讲,从按照到读取显示图片,图形预处理,边缘检测,形态学,角点检测,轮廓 ...
- 浅入浅出EmguCv(一)OpenCv与EmguCv
最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领 ...
- 转:最简单的基于 DirectShow 的视频播放器
50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...
随机推荐
- 二维条码扫描模组在肯德基KFC的无纸化点餐解决方案
在如今提倡节约资源的环境下,肯德基在品牌发展中,逐渐实现无纸化点餐,不仅节约了纸质点餐单,而且还具有节约资源的示范作用.而其中二维码扫描模组是这套无纸化点餐方案的重点,在整套设备中,加入二维码扫描模组 ...
- 使用pl/sql developer登陆不了oracle
1,Oracle ORA12514 监听程序当前无法识别连接描述符中请求的服务 这里最主要的原因在于:(参考:https://www.cnblogs.com/shangshan/p/6359880.h ...
- MockPlus原型设计介绍
MockPlus原型设计介绍 在第八周的课堂上,王文娟老师在校园系统上发布了对于自行选择的原型设计软件进行资料查找以及自学的任务.因为之前的课程学习需要,我们已经大概掌握了原型设计软件Axure的使用 ...
- 利用 SQL Server Audit 审核哪些用户添加删除更新SQL Agent Job
有的时候我们需要下放权限给不用的用户,让他们自己能管理一部分SQL Agent Job,此时需要详细记录谁在什么时间修改了Job 甚至删除了Job, 我们可以使用SQL Server 的Audit帮助 ...
- js初学练手:Csdn Ads Cleaner
最新版本在这里哒:https://greasyfork.org/zh-CN/scripts/376621-csdn-ads-cleaner 隔壁csdn的广告太猖獗啦!写个js管管它 需配合Tempe ...
- JavaScript遍历对象4种方法和遍历数组的3种方式 代码
//遍历对象 4种方法 //Object.keys(obj).forEach() console.log("keys...遍历</br>") var obj1 = { ...
- Catalan 数列的性质及其应用(转载)
转自:http://lanqi.org/skills/10939/ 卡特兰数 — 计数的映射方法的伟大胜利 发表于2015年11月8日由意琦行 卡特兰(Catalan)数来源于卡特兰解决凸$n+2$边 ...
- h5、css3基础
一.html(超文本标记语言) 作用:实现页面布局 页面由许多标记符号组成 由浏览器解释执行 二.html主题创建方式 !(英文状态)+tab html:4s+tab html:5+tab 三.标签 ...
- vue常用属性
关键词:filters | 自定义过滤器 (首字母大写) <p>{{ msg | capitalize }}</p> filters: { capitalize: funct ...
- Idea集成maven插件
学习目标 1.正确在idea上安装maven 2.安装后使用的基本操作 3.回顾安装步骤 安装过程 设置安装后自动下载功能 maven一键构建概念 我们的项目,往往都要经历编译. 测试. 运行. 打包 ...