这篇文章主要介绍了C#如何利用一座桥实现摄像头信息采集,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
概述
一座桥。网是一个专门为开发者和研究者基于C#框架设计的,提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。本文主要讲解利用一座桥进行图像采集的相关内容【包括拍照,视频录制】,仅供学习分享使用。
AForge.Net相关类库介绍
AForge.dll是框架的核心基础类库,为其他类库提供服务。
一座桥。Controls.dll包含一座桥。网的用户界面控件,主要用于页面显示。
一座桥。Imaging.dll主要是框架中用于图像处理的类库,主要负责图像的处理
一座桥。Video.dll主要是框架中对视频处理的类库。
一座桥。Video.DirectShow.dll主要是通过微软公司开发的一项技术接口访问视频资源的类库。
一座桥。Video.FFMPEG.dll是一个还未正式发布的类库,通过FFMPEG类库对视频进行读写。
通过NuGet管理器引入AForge类库
项目名称右键-管理努格特程序包,打卡努格特包管理器如下所示:
示例效果图
本示例主要包括打开,关闭摄像头,拍照,连续拍照,开始录制视频,暂停录制视频,停止录视频,退出等功能。
如下所示:左侧为摄像头投影区域,右侧为图像控件,显示拍照所得的图片
核心代码
获取视频设备列表以及设备对应的分辨率
///摘要
///页面加载摄像头设备
////摘要
///param name='sender'/param
///param name='e'/param
私有void FrmMain_Load(对象发送方,EventArgs e)
{
尝试
{
这个。LBL时间。text=
//枚举所有视频输入设备
视频设备=新的FilterInfoCollection(筛选器类别.视频输入设备);
如果(视频设备。计数==0)
{
lblStatus .Text="没有本地捕获设备";
}
foreach(视频设备中的FilterInfo设备)
{
int I=1;
煤矿局(Coal Mines Board的缩写)设备1000个项目。添加(设备。姓名);
lblStatus .Text=('摄像头我初始化完毕.'\ n’);
我;
}
煤矿局(Coal Mines Board的缩写)设备SelectedIndex=0;
}
接住(应用程序异常)
{
this.lblStatus.Text="没有本地捕获设备";
视频设备=空
}
}
私有void CMB devices _ selectedindex已更改(对象发送方,EventArgs e)
{
这个。CMB分辨率。项目。clear();
视频源=新的视频捕获设备(视频设备[CMB设备.SelectedIndex].MonikerString);
视频源中的变量第10章.视频功能){
这个。CMB分辨率。项目。添加(字符串.格式('({0},{1})',大写。框架尺寸。宽度,上限框架尺寸。身高));
}
如果(这个。CMB分辨率。项目。计数0)
{
这个。CMB分辨率。selectedindex=0;
}
}
打开视频设备和关闭视频设备
///摘要
///设备打开
////摘要
///param name='sender'/param
///param name='e'/param
私有void btnOpen_Click(对象发送方,EventArgs e)
{
int index=this。CMB分辨率。selectedindex
视频源=新的视频捕获设备(视频设备[CMB设备.SelectedIndex].MonikerString);
视频来源。视频分辨率=视频源视频功能[索引];
这个。vs玩家。视频源=视频源;
//设置对应的事件
视频来源. new frame=new new frame eventhandler(视频源_ new frame);
这个。vs玩家。start();
}
///摘要
///产生新帧的触发事件
////摘要
///param name='sender'/param
///param name='eventArgs'/param
public void videoSource_NewFrame(对象发送方,NewFrameEventArgs eventArgs)
{
锁定(对象锁定)
{
位图bmp=空
if (isMultiPhoto)
{
bmp=(系统。绘图。位图)事件参数。框架。克隆();
字符串imgFolder=Common .GetImagePath();
字符串picName=字符串。格式(' {0}\\{1})。jpg ',imgFolder,DateTime .现在。ToString(' yyyymmdd hhmmss ');
常见. SaveImage(picName,BMP);
}
//写视频
if (isRecordVideo)
{
bmp=(系统。绘图。位图)事件参数。框架。克隆();
视频作者WriteVideoFrame(BMP);
}
}
}
///摘要
///设备关闭
////摘要
///param name='sender'/param
///param name='e'/param
私有void btnClose_Click(对象发送方,EventArgs e)
{
这个。vs玩家。signaltostop();
这个。vs玩家。waitforstop();
}
拍照
///摘要
///拍照
////摘要
///param name='sender'/param
///param name='e'/param
私有void btnCapture_Click(对象发送方,EventArgs e)
{
尝试
{
if (this.vsPlayer.IsRunning)
{
位图位图=这个。vs玩家。getcurrentvideoframe();
这个。Pb图像。图像=位图;
//设置图片相对控件的大小
这个。Pb图像。size mode=PictureBoxSizeMode .拉伸图像
}
}
接住(例外ex)
{
消息框.显示('摄像头异常:'例如.消息);
}
}
连拍功能
连拍主要是同时视频控件的一个帧触发事件,在事件中对图像进行保存,达到连拍的效果,如下所示:
//设置对应的事件
视频来源. new frame=new new frame eventhandler(视频源_ new frame);
视频录制
视频录制,是采用视频文件作者对获取到的每一帧进行写入到视频文件中,如下所示:
///摘要
///开始录视频
////摘要
///param name='sender'/param
///param name='e'/param
private void btnStartVideo_Click(对象发送方,EventArgs e)
{
尝试
{
//创建一个视频文件
字符串vdoPath=Common .GetVideoPath();
string vdoName=string .格式(' {0}\\{1})。avi ',vdoPath,DateTime .现在。ToString(' yyyyMMdd HH-mm-ss ');
这个。定时器1。enabled=true//是否执行系统。计时器计时器流逝事件;
this.lblStatus.Text='录制中.\ n ';
tick num=0;
video writer=new video file writer();
if (this.vsPlayer.IsRunning)
{
视频作者Open(vdoName,vdoWidth,vdoHeight,frameRate,VideoCodec .MPEG4);
isRecordVideo=true
}
其他
{
消息框.显示('没有视频源输入,无法录制视频。', '错误消息框按钮.好了MessageBoxIcon .错误);
}
}
接住(例外ex)
{
消息框.显示('摄像头异常:'例如.消息);
}
}
///摘要
///停止录视频
////摘要
///param name='sender'/param
///param name='e'/param
私有void btnStopVideo_Click(对象发送方,EventArgs e)
{
this.isRecordVideo=false
这个。视频作者。close();
这个。定时器1。enabled=false
tick num=0;
this.lblStatus.Text='录制停止!\ n ';
}
///摘要
///定时器
////摘要
///param name='sender'/param
///param name='e'/param
私有空定时器1_Tick(对象发送方,EventArgs e)
{
tickNum
int temp=tickNum
字符串勾选=普通.gettime span(temp);
这个。LBL时间。text=tick
}
///摘要
///暂停录制
////摘要
///param name='sender'/param
///param name='e'/param
私有void btnPauseVideo_Click(对象发送方,EventArgs e)
{
如果(这个。btnpausevideo。文字。trim()=='暂停录像)
{
isRecordVideo=false
this.btnPauseVideo.Text='恢复录像;
这个。定时器1。enabled=false//暂停计时
返回;
}
如果(这个。btnpausevideo。文字。trim()=='恢复录像)
{
isRecordVideo=true
this.btnPauseVideo.Text='暂停录像;
这个。定时器1。enabled=true//恢复计时
}
}
注意事项
1.由于视频录制是采用FFMPEG类库进行处理,所以除了需要一座桥视频。FFMPEG.dll以外,还需要FFMPEG类库(C),位于【前车之鉴】.NET框架-2。2 .5 \ Externals \ ffmpeg \ bin】目录下,复制到应用程序目下即可,如下图所示:
2.由于一座桥视频。FFMPEG.dll类库只支持。网络框架2.0,所以需要采用混合模式,App.config配置如下:
?可扩展标记语言版本='1.0 '编码='utf-8 '?
配置
启动uselegacyv2 runtimeactivationpolicy=' true '
supportedRuntime版本=' 4.0版' sku=' .NETFramework,版本=4 .6 .1 '//启动
supportedRuntime版本='v2.0.50727'/
/配置
3.由于FFMPEG只支持x86模式,不支持混合模式,所以需要在配置管理器进行配置x86平台,如下所示:
4.因为视频帧频太快,需要控制锁定,否则会造成【读写保护内存】的错误。
经过以上四个步骤,就可以录制视频了。如果是拍照,就不需要了。
以上是C#使用AForge实现摄像头信息采集的详细内容。更多关于c#相机信息采集的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。