c#虚拟摄像头,C#摄像头,C# 利用AForge实现摄像头信息采集

c#虚拟摄像头,C#摄像头,C# 利用AForge实现摄像头信息采集

这篇文章主要介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • win10有录像功能吗,win10录屏打开摄像头
  • c#虚拟摄像头,C#摄像头
  • ,,JavaScript 如何在浏览器中使用摄像头
  • iPhone12promax摄像头介绍,iPhone14摄像头
  • 双摄像头测距离原理,测距摄像头的测距原理怎么设置,单目摄像头测距原理
  • 雨课堂期末考试有摄像头吗,雨课堂考试怎么开摄像头吗
  • 相机标定外参怎么得出,摄像头内外参标定的参数,相机的内外参数标定
  • 腾讯会议能否看到学生屏幕,腾讯课堂学生开摄像头其他同学能看见吗
  • 笔记本win10怎么打开摄像头拍照,win10摄像头怎么拍照
  • 树莓派控制摄像头拍照,树莓派连接摄像头教程
  • 树莓派摄像头实时监控,树莓派实现目标检测
  • 摄像头移动检测算法软件,摄像头移动检测算法有哪些
  • 笔记本摄像头倒置怎么解决,笔记本摄像头倒着是怎么回事
  • 单目摄像头像测距,双目摄像机测量距离准确吗,双目摄像头测距范围
  • opencv连接网络摄像头,opencv调用摄像头采集图像
  • 留言与评论(共有 条评论)
       
    验证码: