转自:

http://blog.csdn.NET/chenhongwu666/article/details/40594365

如有雷同,不胜荣幸,若转载,请注明

最近做项目需要操作摄像头,在网上百度了很多资料,很多都是C#调用window API 发送SendMessage,实现操作摄像头,但是C#调用window API的时候因为驱动的问题,总是弹出视频选择对话框,让人很是无语,看到大牛们有的截获到了window消息,然后模拟点击确定按钮,这是在是不敢恭维啊,还有的大牛根据API原型重写了,至于我是一只IT小小鸟了,然后在继续百度,找到了一个AForge强大的C#类库,最后终于搞定了,接下来将我拙劣的代码部分贴出来,以便同行或者需要的朋友学习交流,

首先用到AForge类库下载地址:http://www.aforgenet.com/

然后引用AForge,AForge.Controls(这个是控件,可以添加到工具箱中),AForge.Imaging,AForge.Video,AForge.Video.DirectShow;

然后直接上代码

  1. private FilterInfoCollection videoDevices;
  2. private VideoCaptureDevice videoSource;
  3. public int selectedDeviceIndex = 0;

下面是获取设备

  1. public FilterInfoCollection GetDevices()
  2. {
  3. try
  4. {
  5. //枚举所有视频输入设备
  6. videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
  7. if (videoDevices.Count != 0)
  8. {
  9. LogClass.WriteFile("已找到视频设备.");
  10. return videoDevices;
  11. }
  12. else
  13. return null;
  14. }
  15. catch (Exception ex)
  16. {
  17. LogClass.WriteFile("error:没有找到视频设备!具体原因:" + ex.Message);
  18. return null;
  19. }
  20. }

选择设备,然后连接摄像头

  1. <p> /// <summary>
  2. /// 连接视频摄像头
  3. /// </summary>
  4. /// <param name="deviceIndex"></param>
  5. /// <param name="resolutionIndex"></param>
  6. /// <returns></returns>
  7. public VideoCaptureDevice VideoConnect(int deviceIndex = 0, int resolutionIndex = 0)
  8. {
  9. if (videoDevices.Count <= 0)
  10. return null;
  11. selectedDeviceIndex = deviceIndex;
  12. videoSource = new VideoCaptureDevice(videoDevices[deviceIndex].MonikerString);</p><p>            return videoSource;
  13. }</p>
  1. //抓图,拍照,单帧
  2. public void GrabBitmap(string path)
  3. {
  4. if (videoSource == null)
  5. return;
  6. g_Path = path;
  7. videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);
  8. }
  1. void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
  2. {
  3. Bitmap bmp = (Bitmap)eventArgs.Frame.Clone();
  4. string fullPath = path + "temp\\";
  5. if (!Directory.Exists(fullPath))
  6. Directory.CreateDirectory(fullPath);
  7. string img = fullPath + DateTime.Now.ToString("yyyyMMdd hhmmss") + ".bmp";
  8. bmp.Save(img);
  1. //如果这里不写这个,一会儿会不停的拍照,
  2. videoSource.NewFrame -= new NewFrameEventHandler(videoSource_NewFrame);
  3. }

这样就完成了操作摄像头的工作

但是发现一个问题,如果要拍照得到的照片先要处理在保存,这里就有问题了,所以需要在界面前台中添加控件,医用AForge.Controls,然后添加到工具箱,然后将VideoSourcePlayer控件拖到窗体中,想要得到单张图像处理:

Bitmap bmp = videoSourcePlayer1.GetCurrentFrame();

这样就可以拿来处理了,AForge类库是非常的强大,这里只是冰山一角,文章不足之处还请大家多多指正,欢迎提出宝贵意见和建议。谢谢。。。

转:C#操作摄像头的更多相关文章

  1. C# 调用AForge类库操作摄像头

    如有雷同,不胜荣幸,若转载,请注明 最近做项目需要操作摄像头,在网上百度了很多资料,很多都是C#调用window API 发送SendMessage,实现操作摄像头,但是C#调用window API的 ...

  2. C#操作摄像头 实现拍照功能

    从正式工作以来一直做的都是基于B/S的Web开发,已经很长时间不研究C/S的东西了,但是受朋友的委托,帮他做一下拍照的这么个小功能.其实类似的代码网上有很多,但是真的能够拿来运行的估计也没几个.本来是 ...

  3. Web操作摄像头、高拍仪、指纹仪等设备的功能扩展方案

    摘要:信息系统开发中难免会有要操作摄像头.高拍仪.指纹仪等硬件外设,异或诸如获取机器签名.硬件授权保护(加密锁)检测等情况.受限于Web本身运行机制,就不得不使用Active.浏览器插件进行能力扩展了 ...

  4. Android实例-操作摄像头(XE8+小米2)

    结果: 1.同样是照相,自己的程序设置为高质量时刷新慢,而小米手机的相机那真心反映快呀. 2.就算我设置为最高质量,可相片也没有小米手机的相片大.我最大是2000*1000,而小米可以做到3000*2 ...

  5. C# 操作摄像头

    如有雷同,不胜荣幸,若转载,请注明 这个是大众普通方法,鉴于有网友和朋友问相同的问题.在这里将我的拙劣的代码关键部分贴出来.以便帮助很多其它的朋友们,不足之处甚多,我能够学习,交流,请教阁下 废话到此 ...

  6. JS操作摄像头

    <script src="javascript/jquery-1.9.1.min.js"></script> <fieldset> <le ...

  7. Python操作摄像头

    实践环境: 操作系统:Windows 7(X64) Python版本:python-2.7.13.msi 使用插件:pygame-1.9.1.win32-py2.7.msi 软件下载: python- ...

  8. C#对摄像头的操作示例,采用Aforge库

    操作摄像头有三个办法:VFW.DirectShow.花钱买第三方控件 VFW技术比较古老,无法解决驱动不完善造成的某些问题 DirectShow技术相对完善一些,但这是C++才能实现的技术.如果用.N ...

  9. 在WPF中使用AForge.net控制摄像头拍照

    原文:在WPF中使用AForge.net控制摄像头拍照 利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox.必须 ...

随机推荐

  1. BZOJ 4247 挂饰(背包问题)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4247 [题目大意] JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将 ...

  2. [UOJ218]火车管理

    建一棵答案线段树存栈顶值,两棵可持久化线段树分别存栈顶值和栈顶元素入栈时间 询问就直接在答案线段树上查,弹栈就用入栈时间在对应版本的可持久化线段树上查询即可,修改就是可持久化线段树的区间覆盖 以前一直 ...

  3. 【最大流Dinic模板】HDU1532&POJ1273-Drainage Ditches(16/3/6更正)

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  4. [NOIp2017提高组]逛公园

    题目大意: 给你一个有向图,若用dis(u,v)表示从u到v的最短路长度,求从1到n的长度不超过dis(1,n)+k的路径数. 思路: 首先分别预处理出以1,n为起点的单.源最短路. 对于合法的边重构 ...

  5. BZOJ 4031: [HEOI2015]小Z的房间 高斯消元 MartixTree定理 辗转相除法

    4031: [HEOI2015]小Z的房间 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4031 Description 你突然有了一个 ...

  6. [Winform]线程间操作无效,从不是创建控件的线程访问它的几个解决方案,async和await?

    目录 概述 取消跨线程检查 使用委托异步调用 sync和await 总结 概述 最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或 ...

  7. delphi 杀死进程

    http://blog.sina.com.cn/s/blog_554b1f1b0100aygo.html unit Tlhelp323; interface uses  Windows,SysUtil ...

  8. GDB的一些技巧

    查看栈信息 bt info stack 查看源程序 list ctrl + x + a 分屏调试,上半部分显示代码,下半部分显示调试信息. 查看内存 p  xxxptr@n  查看xxxptr 指针内 ...

  9. 【Rocket MQ】RocketMQ 在windows7 64位安装使用 +RocketMQ管理界面的安装

    参考地址:https://blog.csdn.net/yucaifu1989/article/details/80960018 参考地址:https://blog.csdn.net/u01204090 ...

  10. 前端工业化工具Grunt初体验

    今天来学学Grunt~~目的是为了自动化!自动压缩...自动修复...自动合并等... 提示:Grunt基于Node.js,安装之前要先安装Node.js 1.安装 grunt-cli npm ins ...