C# 利用AForge实现摄像头信息采集

概述

AForge.NET是一个专门为开发者和研究者基于C#框架设计的,提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。本文主要讲解利用AForge进行图像采集的相关内容【包括拍照,视频录制】,仅供学习分享使用。

AForge.Net相关类库介绍

  • AForge.dll 是框架的核心基础类库,为其他类库提供服务。
  • AForge.Controls.dll 包含AForge.Net的UI控件,主要用于页面显示。
  • AForge.Imaging.dll 主要是框架中用于图像处理的类库,主要负责图像的处理
  • AForge.Video.dll 主要是框架中对视频处理的类库。
  • AForge.Video.DirectShow.dll 主要是通过DirectShow接口访问视频资源的类库。
  • AForge.Video.FFMPEG.dll 是一个还未正式发布的类库,通过FFMPEG类库对视频进行读写。

通过NuGet管理器引入AForge类库

项目名称右键-->管理NuGet程序包,打卡NuGet包管理器  如下所示:

示例效果图

本示例主要包括打开,关闭摄像头,拍照,连续拍照,开始录制视频,暂停录制视频,停止录视频,退出等功能。

如下所示:左侧为摄像头投影区域,右侧为图像控件,显示拍照所得的图片

核心代码

获取视频设备列表以及设备对应的分辨率

/// <summary>
  /// 页面加载摄像头设备
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void FrmMain_Load(object sender, EventArgs e)
  {
   try
   {
    this.lblTime.Text = "";
    // 枚举所有视频输入设备
    videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    if (videoDevices.Count == 0)
    {
     lblStatus.Text = "No local capture devices";
    }
    foreach (FilterInfo device in videoDevices)
    {
     int i = 1;
     cmbDevices.Items.Add(device.Name);
     lblStatus.Text = ("摄像头" + i + "初始化完毕..." + "\n");
     i++;
    }
    cmbDevices.SelectedIndex = 0;
   }
   catch (ApplicationException)
   {
    this.lblStatus.Text = "No local capture devices";
    videoDevices = null;
   }
  }

  private void cmbDevices_SelectedIndexChanged(object sender, EventArgs e)
  {
   this.cmbResolution.Items.Clear();
   videoSource = new VideoCaptureDevice(videoDevices[cmbDevices.SelectedIndex].MonikerString);
   foreach(var cap in videoSource.VideoCapabilities) {
    this.cmbResolution.Items.Add(string.Format("({0},{1})",cap.FrameSize.Width,cap.FrameSize.Height));
   }
   if (this.cmbResolution.Items.Count > 0)
   {
    this.cmbResolution.SelectedIndex = 0;
   }
  }

打开视频设备和关闭视频设备

/// <summary>
  /// 设备打开
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnOpen_Click(object sender, EventArgs e)
  {
   int index = this.cmbResolution.SelectedIndex;
   videoSource = new VideoCaptureDevice(videoDevices[cmbDevices.SelectedIndex].MonikerString);
   videoSource.VideoResolution = videoSource.VideoCapabilities[index];
   this.vsPlayer.VideoSource = videoSource;
   //设置对应的事件
   videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);
   this.vsPlayer.Start();
  }

  /// <summary>
  /// 产生新帧的触发事件
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="eventArgs"></param>
  public void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
  {
   lock (objLock)
   {
    Bitmap bmp = null;
    if (isMultiPhoto)
    {
     bmp = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
     string imgFolder = Common.GetImagePath();
     string picName = string.Format("{0}\\{1}.jpg", imgFolder, DateTime.Now.ToString("yyyyMMddHHmmss"));
     Common.SaveImage(picName, bmp);
    }
    //Write Videos
    if (isRecordVideo)
    {
     bmp = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
     videoWriter.WriteVideoFrame(bmp);
    }
   }
  }

  /// <summary>
  /// 设备关闭
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnClose_Click(object sender, EventArgs e)
  {
   this.vsPlayer.SignalToStop();
   this.vsPlayer.WaitForStop();
  }

拍照

/// <summary>
  /// 拍照
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnCapture_Click(object sender, EventArgs e)
  {
   try
   {
    if (this.vsPlayer.IsRunning)
    {
     Bitmap bitMap = this.vsPlayer.GetCurrentVideoFrame();
     this.pbImage.Image = bitMap;
     //设置图片相对控件的大小
     this.pbImage.SizeMode = PictureBoxSizeMode.StretchImage;
    }
   }
   catch (Exception ex)
   {
    MessageBox.Show("摄像头异常:" + ex.Message);
   }
  }

连拍功能

连拍主要是同时视频控件的一个帧触发事件,在事件中对图像进行保存,达到连拍的效果,如下所示:

 //设置对应的事件
videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);

视频录制

视频录制,是采用VideoFileWriter对获取到的每一帧进行写入到视频文件中,如下所示:

/// <summary>
  /// 开始录视频
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnStartVideo_Click(object sender, EventArgs e)
  {
   try
   {
    //创建一个视频文件
    string vdoPath = Common.GetVideoPath();
    string vdoName = string.Format("{0}\\{1}.avi", vdoPath, DateTime.Now.ToString("yyyyMMdd HH-mm-ss"));

    this.timer1.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
    this.lblStatus.Text="录制中...\n";
    tickNum = 0;
    videoWriter = new VideoFileWriter();
    if (this.vsPlayer.IsRunning)
    {
     videoWriter.Open(vdoName, vdoWidth, vdoHeight, frameRate, VideoCodec.MPEG4);
     isRecordVideo = true;
    }
    else
    {
     MessageBox.Show("没有视频源输入,无法录制视频。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
   }
   catch (Exception ex)
   {
    MessageBox.Show("摄像头异常:" + ex.Message);
   }
  }

  /// <summary>
  /// 停止录视频
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnStopVideo_Click(object sender, EventArgs e)
  {
   this.isRecordVideo = false;
   this.videoWriter.Close();
   this.timer1.Enabled = false;
   tickNum = 0;
   this.lblStatus.Text="录制停止!\n";
  }

  /// <summary>
  /// 定时器
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void timer1_Tick(object sender, EventArgs e)
  {
   tickNum++;
   int temp = tickNum;
   string tick = Common.GetTimeSpan(temp);
   this.lblTime.Text = tick;
  }

  /// <summary>
  /// 暂停录制
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btnPauseVideo_Click(object sender, EventArgs e)
  {
   if (this.btnPauseVideo.Text.Trim() == "暂停录像")
   {
    isRecordVideo = false;
    this.btnPauseVideo.Text = "恢复录像";
    this.timer1.Enabled = false; //暂停计时
    return;
   }
   if (this.btnPauseVideo.Text.Trim() == "恢复录像")
   {
    isRecordVideo = true;
    this.btnPauseVideo.Text = "暂停录像";
    this.timer1.Enabled = true;  //恢复计时
   }
  }

注意事项

1. 由于视频录制是采用FFMPEG类库进行处理,所以除了需要AForge.Video.FFMPEG.dll以外,还需要FFMPEG类库(C++),位于【AForge.NET Framework-2.2.5\Externals\ffmpeg\bin】目录下,copy到应用程序目下即可,如下图所示:

2. 由于AForge.Video.FFMPEG.dll类库只支持.NetFrameWork2.0,所以需要采用混合模式,App.config配置如下:

 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/></startup>
  <supportedRuntime version="v2.0.50727"/>
 </configuration>

3. 由于FFMPEG只支持x86模式,不支持混合模式,所以需要在配置管理器进行配置x86平台,如下所示:

4. 由于视频帧频率过快,所以需要进行加锁控制,否则会造成【读写受保护的内存】错误。

经过以上4步,才可以进行视频录制。如果是进行拍照,则不需要。

以上就是C# 利用AForge实现摄像头信息采集的详细内容,更多关于c# 摄像头信息采集的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#结合AForge实现摄像头录像

    输出为MP4需要用到ffmpeg相关的文件,我打包的库已经带了,去官网找的库可以在这个目录找到: 2: 添加这些引用: 3: 两个全局变量: //用来操作摄像头 private VideoCaptureDevice Camera = null; //用来把每一帧图像编码到视频文件 private VideoFileWriter VideoOutPut = new VideoFileWriter(); 开始代码: //获取摄像头列表 var devs = new FilterInfoCollect

  • C# WPF使用AForge类库操作USB摄像头拍照并保存

    项目中用到 USB 摄像头,需要根据情况进行图像抓拍,查了半天资料,比较多的是使用 WPFMediaKit 和 AForge . 但是由于项目要求不显示 USB 摄像头拍摄的画面,最终确定使用 AForge 解决. 下面用一个测试程序记录一下. 一.无预览拍照 首先建立一个 WPF 项目,我的就叫 AForgeTest,你们随意就好: 然后在 NuGet 包管理器中安装 AForge 库: 我只安装了图中打勾的几个库,这个根据自己项目需要安装就好. 不过用 USB 摄像头拍照必须安装: AFor

  • C#使用Aforge调用摄像头拍照的方法

    本文实例为大家分享了C#使用Aforge调用摄像头拍照的具体代码,供大家参考,具体内容如下 一.新建一个Winform项目 二.使用Nuget添加引用 安装下图中红色框住的两个程序包 安装完后发现安装了如下图的程序包,这是因为上述两个程序包存在对其它程序包的依赖. 三.编写程序 1.窗体设计,摄像头是下拉列表(cmbCamera,控件命名,下同),虽然示例只用到一个摄像头,但是该Demo可用于多个摄像头间切换场景,分辨率是下拉列表(cmbResolution),列出摄像头所支持的分辨率,一个Vi

  • 基于AForge实现C#摄像头视频录制功能

    本文为大家分享了AForge实现C#摄像头视频录制功能的具体方法,供大家参考,具体内容如下 1. 概述 最近由于兴趣学习了下在C#上使用AForge录制摄像头视频并压缩编码.总体上来说这个第三方.net视觉开发库还是比较稳定的(AForge lib下载.离线帮助文档下载).但是由于这个第三方库维护不怎么样,导致会出现不兼容的问题.这里将这些与大家分享,希望对您有帮助. 在使用AForge第三方库录制本地视频所要使用到的类主要有这几个:FilterInfoCollection.VideoCaptu

  • C#调用AForge实现摄像头录像的示例代码

    1:首先下载库文件>> 也可以去官网寻找>> 下载本教程全代码>> 输出为MP4需要用到ffmpeg相关的文件,我打包的库已经带了,去官网找的库可以在这个目录找到: 2:添加这些引用: 3:两个全局变量: //用来操作摄像头 private VideoCaptureDevice Camera = null; //用来把每一帧图像编码到视频文件 private VideoFileWriter VideoOutPut = new VideoFileWriter(); 开始代

  • C# 利用AForge实现摄像头信息采集

    概述 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域.本文主要讲解利用AForge进行图像采集的相关内容[包括拍照,视频录制],仅供学习分享使用. AForge.Net相关类库介绍 AForge.dll 是框架的核心基础类库,为其他类库提供服务. AForge.Controls.dll 包含AForge.Net的UI控件,主要用于页面显示. A

  • Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的人脸: 图 1 动态实时检测效果图 检测到的人脸矩形图像,会依次平铺显示在摄像头的左上方: 当多个人脸时候,也能够依次铺开显示: 左上角窗口的大小会根据捕获到的人脸大小实时变化: 图 2 单个/多个人脸情况下摄像头识别显示结果 2. 代码实现 主要分为三个部分: 摄像头调用,利用 OpenCv 里面

  • 利用python打开摄像头及颜色检测方法

    最近两周由于忙于个人项目,一直未发言了,实在是太荒凉了....,上周由于项目,见到Python的应用极为广泛,用起来也特别顺手,于是小编也开始着手学习Python,-下面我就汇报下今天的学习成果吧 小编运行环境unbuntu 14.0.4 首先我们先安装一下Python呗,我用的2.7,其实特别简单,一行指令就OK sudo apt-get install python-dev 一般安装系统的时候其实python已经自带了,这步基本可以不用做,OK,我们继续往下走吧,安装python-openc

  • 利用python调用摄像头的实例分析

    这篇文章主要介绍了python调用摄像头的示例代码,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 一.打开摄像头 import cv2 import numpy as np def video_demo(): capture = cv2.VideoCapture(0)#0为电脑内置摄像头 while(True): ret, frame = capture.read()#摄像头读取,ret为是否成功打开摄像头,true,false. frame为视频的每一帧图像 frame = c

  • WPF使用AForge调用摄像头

    AForge引用 1.创建WPF项目, 在NuGet安装AForge相关SDK包: 2.项目引用 2.1.由于在WPF当中使用AForge,需要通过WindowsFormsHost嵌入在WPF当中使用, 所以需要给项目添加相关引用: 2.2.页面添加命名空间 .xaml文件中,添加以下命名空间: xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xml

  • python利用opencv调用摄像头实现目标检测

    目录 使用到的库 实现思路 实现代码 2020/4/26更新:FPS计算 FPS记录的原理 FPS实现代码 使用到的库 好多人都想了解一下如何对摄像头进行调用,然后进行目标检测,于是我做了这个小BLOG. opencv-python==4.1.2.30 Pillow==6.2.1 numpy==1.17.4 这些都是通用的库,版本不同问题应该也不大. 实现思路 利用opencv调用摄像头,读取每一帧传入目标检测网络检测,将检测结果呈现. 由于本文所用的检测格式为RGB格式,CV2读取的时候会使用

随机推荐