转:C#操作摄像头

摘要:
=0){LogClass.WriteFile;returnvideoDevices;}elsereturntnull;}捕获{LogClass.WriteFile(“错误:找不到视频设备!

转自:

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;

然后直接上代码

[csharp] view plain copy
 
 
  1. private FilterInfoCollection videoDevices;  
  2.         private VideoCaptureDevice videoSource;  
  3.         public int selectedDeviceIndex = 0;  


 

下面是获取设备

[csharp] view plain copy
 
 
  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.         }  


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

[csharp] view plain copy
 
 
  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>  
[csharp] view plain copy
 
 
  1. //抓图,拍照,单帧  
  2.   
  3. public void GrabBitmap(string path)  
  4.         {  
  5.             if (videoSource == null)  
  6.                 return;  
  7.             g_Path = path;  
  8.             videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);  
  9.         }  


 

[csharp] view plain copy
 
 
  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);  
[csharp] view plain copy
 
 
  1. //如果这里不写这个,一会儿会不停的拍照,  
  2.             videoSource.NewFrame -= new NewFrameEventHandler(videoSource_NewFrame);  
  3.         }  


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

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

Bitmap bmp = videoSourcePlayer1.GetCurrentFrame();

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

免责声明:文章转载自《转:C#操作摄像头》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Redis 中 byte格式 写入、取出log4j2常见配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#: 通过html调用WinForm 。。。。。

完整测试代码:Form1.cs 代码 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;n...

转载——关于C#延时

c#里的延时方法: 1.用sleep()使线程休眠。 直接在需要延时的地方插入System.Threading.Thread.Sleep(1000);即可。 这种方式最方便,但是延时过程中会停止其他响应,如果用在主线程中会造成程序的假死。如果有异步操作的话也会暂停,例如用webBrowser加载网页,本来希望延时一段时间等待网页加载完毕,但用sleep...

C#.Net C/S快速开发框架V2.2版本介绍

C#.Net C/S快速开发框架V2.2版本介绍 C/S结构快速开发框架V2.2 解决方案:CSFramework.* 命名的模块为框架共公模块(核心模块)框架版本:V2.2CSFramework3.* 是客户端及服务端的业务模块.高级版(WebService架构)已升级到3.0,此解决方案模块名是以高级版命名的。注:标准版和高级版框架核心是一样的,...

Delegate 委托 C#

delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。A delegate declaration defines a reference type that can be used to encapsulate...

C#和C++实现强制结束进程的两种实现方式

强制结束进程的两种实现方式--C#和C++实现   最近在做一个大型的项目,由于进程之间的关联出了一些问题,长话短说,就是我们不得不强制停止某些进程以保证系统正常的运行,在网上找了一下,没发现有这方面详细的介绍和写的比较全面的文章,于是按照MSDN的说明写了两种方法,希望对遇到类似问题的朋友有所帮助。 首先,我们来看看C#的实现方式, 由于C#对进程的封...

C#使用技巧之调用JS脚本方法一

有时候我们需要在C#中直接调用js方法,这是完全没问题的。当然,我们也可以把js代码转化为C#,然后在C#中执行,但是这个就得花时间了~~下面我给大家介绍下一种直接在C#中调用JS文件的方法。 0、贴个效果图 1、创建个Winform项目。 2、在From1上增加一个文本框一个按钮。 3、在解决方案中创建一个test.js文件。 test.js代码如下:...