无忧编程_ASP.NET  / C# / PHP 程序员的软件世界

?找回密码
?立即注册

QQ登录

只需一步,快速开始

查看: 9056|回复: 1
打印 上一主题 下一主题

C# 调用AForge类库操作摄像头实现拍照录像功能

[复制链接]

423

主题

456

帖子

1899

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1899
跳转到指定楼层
楼主
发表于 2016-2-12 15:01:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C# 调用AForge类库操作摄像头实现拍照录像功能:

如有雷同,不胜荣幸,若转载,请注明

最近做项目需要操作摄像头,在网上百度了很多资料,很多都是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;

然后直接上代码:

[mw_shl_code=csharp,true]private FilterInfoCollection videoDevices;
private VideoCaptureDevice videoSource;

public int selectedDeviceIndex = 0;[/mw_shl_code]


下面是获取设备:
[mw_shl_code=csharp,true]public FilterInfoCollection GetDevices()
? ?? ???{
? ?? ?? ?? ?try
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? //枚举所有视频输入设备
? ?? ?? ?? ?? ? videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
? ?? ?? ?? ?? ? if (videoDevices.Count != 0)
? ?? ?? ?? ?? ? {
? ?? ?? ?? ?? ?? ???LogClass.WriteFile("已找到视频设备.");
? ?? ?? ?? ?? ?? ???return videoDevices;
? ?? ?? ?? ?? ? }
? ?? ?? ?? ?? ? else
? ?? ?? ?? ?? ?? ???return null;
? ?? ?? ?? ?}
? ?? ?? ?? ?catch (Exception ex)
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? LogClass.WriteFile("error:没有找到视频设备!具体原因:" + ex.Message);
? ?? ?? ?? ?? ? return null;
? ?? ?? ?? ?}

? ?? ???}[/mw_shl_code]


选择设备,然后连接摄像头:
[mw_shl_code=csharp,true]///
? ?? ???/// 连接视频摄像头
? ?? ???///

? ?? ???///
? ?? ???///
? ?? ???///
? ?? ???public VideoCaptureDevice VideoConnect(int deviceIndex = 0, int resolutionIndex = 0)
? ?? ???{
? ?? ?? ?? ?if (videoDevices.Count <= 0)
? ?? ?? ?? ?? ? return null;
? ?? ?? ?? ?selectedDeviceIndex = deviceIndex;
? ?? ?? ?? ?videoSource = new VideoCaptureDevice(videoDevices[deviceIndex].MonikerString);

? ?? ?? ?? ?return videoSource;

? ?? ???}
//抓图,拍照,单帧
public void GrabBitmap(string path)
? ?? ???{
? ?? ?? ?? ?if (videoSource == null)
? ?? ?? ?? ?? ? return;
? ?? ?? ?? ?g_Path = path;
? ?? ?? ?? ?videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);
? ?? ???}




void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
? ?? ???{
? ?? ?? ?? ?Bitmap bmp = (Bitmap)eventArgs.Frame.Clone();
? ?? ?? ?? ?string fullPath = path + "temp\\";
? ?? ?? ?? ?if (!Directory.Exists(fullPath))
? ?? ?? ?? ?? ? Directory.CreateDirectory(fullPath);
? ?? ?? ?? ?string img = fullPath + DateTime.Now.ToString("yyyyMMdd hhmmss") + ".bmp";
? ?? ?? ?? ?bmp.Save(img);
//如果这里不写这个,一会儿会不停的拍照,
? ?? ?? ?? ?videoSource.NewFrame -= new NewFrameEventHandler(videoSource_NewFrame);
? ?? ???}[/mw_shl_code]

分享到:? QQ好友和群QQ好友和群
收藏收藏
windows .net(C#+MSSQL) linux(php+mysql)

423

主题

456

帖子

1899

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1899
沙发
?楼主| 发表于 2016-2-12 15:03:29 | 只看该作者
C#调用本机摄像头
这段时间一个小项目中需要调用本机的摄像头进行拍照,网上搜集了一些资料以及解决的一些小问题,在此记录以便后续使用。
硬件环境:联想C360一体机,自带摄像头
编写环境:vs2010
语言:C# WPF

下载AForge类库,并添加引用:
[mw_shl_code=csharp,true]using AForge;
using AForge.Controls;
using AForge.Video;
using AForge.Video.DirectShow;
using Size = System.Drawing.Size;[/mw_shl_code]
在xaml界面中添加VideoSourcePlayer控件,此次稍微解释如何添加外来控件:
在工具箱中添加新的选项卡,右键添加选择项,浏览选择控件dll确定,引用控件即可添加到工具箱中。

枚举所有的摄像头:

[mw_shl_code=csharp,true]FilterInfoCollection videoDevices;videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
foreach (FilterInfo device in videoDevices)
? ?? ?? ?? ?? ? {
? ?? ?? ?? ?? ?? ???//可以做出处理
? ?? ?? ?? ?? ? }[/mw_shl_code]
连接摄像头:

声明:FileterInfo info;

[mw_shl_code=csharp,true]info = videoDevices[0];//选取第一个,此处可作灵活改动

VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[info.MonikerString);? ?? ?? ???videoSource.DesiredFrameSize = new System.Drawing.Size(214, 281);
videoSource.DesiredFrameRate = 1;
videoSourcePlayer.VideoSource = videoSource;
videoSourcePlayer.Start();[/mw_shl_code]
关闭摄像头:[mw_shl_code=csharp,true]videoSourcePlayer.SignalToStop();
videoSourcePlayer.WaitForStop();[/mw_shl_code]
拍照:
if (videoSourcePlayer.IsRunning)

? ?? ?? ?? ?? ? {
            string path = "e:\";

? ?? ?? ?? ?? ?? ???BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?videoSourcePlayer.GetCurrentVideoFrame().GetHbitmap(),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?IntPtr.Zero,? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? Int32Rect.Empty,? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?BitmapSizeOptions.FromEmptyOptions());? ?? ?? ?? ?? ?? ???PngBitmapEncoder pE = new PngBitmapEncoder();? ?? ?? ?? ?? ?? ???pE.Frames.Add(BitmapFrame.Create(bitmapSource));? ?? ?? ?? ?? ?? ???string picName = path + "paizhao" + ".jpg";? ?? ?? ?? ?? ?? ???if (File.Exists(picName))? ?? ?? ?? ?? ?? ???{? ?? ?? ?? ?? ?? ?? ?? ?File.Delete(picName);? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ?? ???using (Stream stream = File.Create(picName))? ?? ?? ?? ?? ?? ???{? ?? ?? ?? ?? ?? ?? ?? ?pE.Save(stream);? ?? ?? ?? ?? ?? ???}? ?? ?? ?? ?? ? }



项目中要求是摄像头处于监控状态,拍照后画面固定存储,不满意可以清空再次进行拍照,直到满意为止。
做法是在videoSourcePlayer的上面添加一个image控件,因为项目是WPF做的,所有照片显示只能添加image控件,有两点需要注意:
1)WPF引用winform控件需要使用WindowsFormsHost控件,所以监控视频和照片显示时是控件WindowsFormsHost和image控件的显示和隐藏,此处走了一段弯路所以记录下来。
2)image控件的source已经绑定,但是照片需要清空删除该照片资源,系统提示的大致意思是资源已经被占用无法删除。解决途径:
声明:BitmapImage bmi = new System.Windows.Media.Imaging.BitmapImage();

使用时:bmi.BgeinInit();
bmi.UriSource = new Uri(picName);
bmi.CacheOption = BitmapCacheOption.OnLoad;
bmi.EndInit();
绑定:this.image.Source = bmi;




windows .net(C#+MSSQL) linux(php+mysql)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|软件编程 ( 鄂ICP备11006601号 )鄂公网安备 42011102001337号 |

GMT+8, 2019-9-26 16:06 , Processed in 0.058090 second(s), 19 queries .

Powered by Discuz! X3.4

? 2001-2017 Comsenz Inc.

快速回复 返回顶部 365体育投注提款短信