概述

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 == )
{
lblStatus.Text = "No local capture devices";
}
foreach (FilterInfo device in videoDevices)
{
int i = ;
cmbDevices.Items.Add(device.Name);
lblStatus.Text = ("摄像头" + i + "初始化完毕..." + "\n");
i++;
}
cmbDevices.SelectedIndex = ;
}
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 > )
{
this.cmbResolution.SelectedIndex = ;
}
}

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

    /// <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 = ;
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 = ;
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进行摄像头信息采集的更多相关文章

  1. c# 利用AForge和百度AI开发实时人脸识别

    baiduAIFaceIdentify项目是C#语言,集成百度AI的SDK利用AForge开发的实时人脸识别的小demo,里边包含了人脸检测识别,人脸注册,人脸登录等功能 人脸实时检测识别功能 思路是 ...

  2. Emgucv(一)Aforge切换摄像头并调用摄像头属性

    一.新建一个Windows窗体应用程序,在Form1窗体上添加一个PictureBox控件.一个ComboBox控件,命名为PictureBox1.cbCapture,还有两个Button控件,Tex ...

  3. Python 3 利用 Dlib 实现摄像头实时人脸检测和平铺显示

    1. 引言 在某些场景下,我们不仅需要进行实时人脸检测追踪,还要进行再加工:这里进行摄像头实时人脸检测,并对于实时检测的人脸进行初步提取: 单个/多个人脸检测,并依次在摄像头窗口,实时平铺显示检测到的 ...

  4. 利用AForge.NET 调用电脑摄像头进行拍照

    当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...

  5. C#调用AForge实现摄像头录像

    1: 首先下载库文件>> 也可以去官网寻找>> 下载本教程全代码>> 输出为MP4需要用到ffmpeg相关的文件,我打包的库已经带了,去官网找的库可以在这个目录找到 ...

  6. C#使用Aforge调用摄像头拍照

    一. 新建一个Winform项目 二.使用Nuget添加引用 安装下图中红色框住的两个程序包 安装完后发现安装了如下图的程序包,这是因为上述两个程序包存在对其它程序包的依赖. 三.编写程序 1. 窗体 ...

  7. Python 3 利用 Dlib 实现摄像头人脸检测特征点标定

    0. 引言 利用 Python 开发,借助 Dlib 库捕获摄像头中的人脸,进行实时人脸 68 个特征点标定: 支持多张人脸: 有截图功能: 图 1 工程效果示例( gif ) 图 2 工程效果示例( ...

  8. Ubuntu10.04中利用V4L2读取摄像头数据并保存成文件【转】

    转自:http://blog.chinaunix.net/uid-29339876-id-4042245.html 利用V4L2读取UVC摄像头数据并保存成视频文件,主要参考http://linuxt ...

  9. WinForm利用AForge.NET调用电脑摄像头进行拍照和视频

    当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...

随机推荐

  1. KubeCon 2019 北美会议完美落幕 | 云原生生态周报 Vol. 29

    作者 | 陈俊.张晓宇.徐迪 业界要闻 KubeCon 2019 北美会议召开 业界最隆重的盛会 KubeCon+CloudNativeCon 今年在圣地亚哥举办,超过 12000 名参会者以及 10 ...

  2. 02_Pandas基本使用

    1.Pandas读取数据 一般错误 import pandas as pd pd.read_csv(r'D:\数据分析\02_Pandas\pandas\food_info.csv') out: -- ...

  3. 02-tornado学习笔记-环境配置

    Ubuntu16.04开发环境 1.ubuntu默认root用户没有激活,激活root用户,就要为root用户创建密码   $sudo passwd root   2.修改主机名   $vi /etc ...

  4. centos7环境搭建一台mysql服务器启动多个端口

    在一台服务器上启动多个mysql实例,分别用不同的端口号,因centos7版本安装mysql5.7后不存在mysqld_multi .mysqld_safe等命令,做踩坑总结 Mysql多实例实现的3 ...

  5. Spring 框架基础(06):Mvc架构模式简介,执行流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集 ...

  6. 英语口语考试资料Food

    新东方推荐文章:Food and Health The food we eat seems to have profound effects on our health. Although scien ...

  7. jsp实现增加数据功能

    1. 环境的搭建 软件 数据库  sql myeclipse 8.0  tomcat 6.0 2. 安装完 myeclipse 配置下  部署tomcat 6.0 =1=> =2=>  新 ...

  8. JS&jQuery

    1.JavaScript概述    1.什么是JavaScript        JavaScript简称JS,是一种专门运行于JS解释器/引擎中的解释型脚本语言    2.JS发展史         ...

  9. node.js入门安装过程

    本次随笔的目的是教大家如何安装 node.js安装 第一步:安装node环境 下载地址:https://nodejs.org/en/download/ 下载好后 对应一下你的node版本 ,傻瓜式安装 ...

  10. 实战!轻松搭建图像分类 AI 服务

    人工智能技术(以下称 AI)是人类优秀的发现和创造之一,它代表着至少几十年的未来.在传统的编程中,工程师将自己的想法和业务变成代码,计算机会根据代码设定的逻辑运行.与之不同的是,AI 使计算机有了「属 ...