AFORGE库对摄像头操作的封装(续)
来源:互联网 发布:杯装茶 知乎 编辑:程序博客网 时间:2024/06/07 06:57
下午做的封装嘛。 感觉不是很好。 操作还是太多。但是我觉得 适用的还是比较广。刚刚手残, 把下午的代码都删了,现在都没法贴上下午笔记中的图了。
我这里重新做了次封装。
----------------------------封装约定
按照下面的这个模式封装的:
1, open
2,capture
3, close
----------------------------准备工作
------A
1, 去AFORGE下载DLL。我这里丢个链接。AFORGE_DLL (所有的)
-----B
在封装 DLL的工程中添加要用到AFORGE 的DLL 的 引用
AForge.Video.dll;
AForge.Video.DirectShow.dll;
system.drawing.dll接着添加名称空间:
///---using AForge.Video;using AForge.Video.DirectShow;using System.Drawing;using System.Windows.Forms;
-------C
在测试用例中添加自己写的DLL后,添加名称空间:
using Webcam;
----------------------------上码
下面是使用我自己封装的DLL 的测试结果(晚上拍的, 我的摄像头的分比率也不高):
我用的是控件pictureBox承载图像的。DLL 中也是的回调函数也是用的pictureBox。
不废话了, 直接上码。
-----------------DLL源码:
/* 使用该DLL操作摄像头, 操作结束后,一定要使用 close()函数断开摄像头的连接。 */using System;using System.Collections.Generic;using System.Linq;using System.Text;///---using AForge.Video;using AForge.Video.DirectShow;using System.Drawing;using System.Windows.Forms;namespace Webcam{ public class WebcamHelper { #region 变量区 private FilterInfoCollection videoDevices; private VideoCaptureDevice WebCam; private int pic_NewWidth; ///--指定图片的宽度, private int pic_NewHeight; ///---指定图片的高度度 private PictureBox picturebox; ///--承载图像 private string filepath; ///---保存图片的路径, 路径中不需要指明 图片的格式。 ///---例如:filepath = C: ///--不能传: filepath = C:1.jpg。 private Bitmap bitmap; ///--保存抓拍截图 #endregion #region 方法区 ///--构造函数 ///--picturebox是承载图像的, ///--picturepath 是抓图的存储路径, ///---newWidth 是指定存图的宽度 ///---newHeight 是指定存图的高度 public WebcamHelper(ref PictureBox pictureBox, string picturePath, int newWidth, int newHeight) { ///--指定图片缩放的宽度和高度 this.pic_NewHeight = newHeight; this.pic_NewWidth = newWidth; ///--图片路径 this.filepath = picturePath; ///---picturebox, this.picturebox = new PictureBox(); this.picturebox = pictureBox; } ///--函数功能:枚举输入设备;选择摄像头输入设备;保存图片的路径; public void Open(string videoDeviceName = "") { ///--枚举可用的摄像头输入设备 this.videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (0 == videoDevices.Count) { ///---没有可用的输入设备 throw new Exception("当前没有可用的摄像头输入设备"); } ///--保存当前输入设备的名称 string[] videoDevicesName = new string[videoDevices.Count]; ///---计数器 int count = 0; ///---获取设备名称 foreach (FilterInfo item in videoDevices) { ///--将设备名称返回到数组中 videoDevicesName[count++] = item.Name; } ///--计数器清零 count = 0; ///---判断传入的指定的设备名是否为空 ///---为空,默认使用第一个设备 if (string.Empty == videoDeviceName) { this.WebCam = new VideoCaptureDevice(videoDevices[0].MonikerString); } else { ///-设备索引 int index = 0; ///--使用指定的输入设备名称 ///---查找当前指定的输入设备在输入设备中的索引 for (int i = 0; i < videoDevices.Count; i++) { if (videoDeviceName == videoDevicesName[i]) { index = i; break; } } ///---连接指定的设备 this.WebCam = new VideoCaptureDevice(videoDevices[index].MonikerString); } ///--设定摄像头的分辨率为默认使用的分辨率 this.WebCam.VideoResolution = this.WebCam.VideoCapabilities[0]; ///--打开摄像头 this.WebCam.Start(); this.WebCam.NewFrame += new NewFrameEventHandler(WebcamNewFrameCallBack); } ///---回调函数 private void WebcamNewFrameCallBack(object obj, NewFrameEventArgs eventArgs) { bitmap = (Bitmap)eventArgs.Frame.Clone(); this.picturebox.Image = bitmap; GC.Collect(); } ///--函数功能:抓拍图片,并保存 ///---成功返回:true. 失败返回:false、 public bool Capture() { if (bitmap != null) { ///--缩放图片 Zoom(ref this.bitmap, this.pic_NewWidth, this.pic_NewHeight).Save(this.filepath+".jpg"); return true; } else { ///--存储失败 return false; } } ///--函数功能:实现抓拍的图像缩放 ///---返回缩放的图片。 private Bitmap Zoom(ref Bitmap bitmap, int new_Width, int new_Height) { ///--新建一个bitmap对象 Bitmap newBitmap = new Bitmap(new_Width, new_Width); Graphics newG = Graphics.FromImage(newBitmap); ///--插入算法的质量 newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; ///--重绘 newG.DrawImage(bitmap, new Rectangle(0, 0, new_Width, new_Width), new Rectangle(0, 0, bitmap.Width, bitmap.Height), GraphicsUnit.Pixel); ///--释放绘图工具 newG.Dispose(); ///---返回新结果 return newBitmap; } ///---函数功能:断开摄像头连接 ///---参数,无 public void Close() { if (this.WebCam != null) { if (this.WebCam.IsRunning) { this.WebCam.Stop(); } } } #endregion 方法区 }}
------------使用DLL 测试源码
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using Webcam;namespace WindowsFormsApplication1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private WebcamHelper newW; /// <summary> /// --打开按钮被单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void openBtn_Click(object sender, EventArgs e) { string filepath =Application.StartupPath + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss"); newW = new WebcamHelper(ref this.pictureBox1, filepath, 200, 100); newW.Open(""); } /// <summary> /// ---窗口加载事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { } /// <summary> /// --关闭按钮被单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 关闭_Click(object sender, EventArgs e) { newW.Close(); } /// <summary> /// --抓图按钮被单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void captureBtn_Click(object sender, EventArgs e) { if (true == newW.Capture()) { MessageBox.Show("拍照成功"); } } }}
----------------------------下载
上面的 DLL + DLL 源码 + 测试用例源码 下载链接:
点我试试
0 0
- AFORGE库对摄像头操作的封装(续)
- AFORGE库学习之封装对摄像头的操作
- C# 调用AForge类库操作摄像头
- Aforge做摄像头操作
- AForge类库调用摄像头
- c# 利用AForge.NET组件操作摄像头
- c# 利用AForge.NET组件操作摄像头
- C#使用aforge框架打开摄像头(续)
- C#简单的Aforge调用摄像头
- 基于AForge的C#摄像头视频录制
- C#WPF使用AForge类库操作USB摄像头拍照并保存
- c# 使用AForge.NET操作摄像头操作代码
- C#操作Aforge摄像头 实现拍照、录像功能
- C# AForge 关闭摄像头
- WPF集成 AForge VideoSourcePlayer 摄像头不出图像的问题
- 对Cookie操作的封装
- Aforge.net类库调用摄像头拍照(C#)
- 封装的摄像头类
- Ubuntu Apache2开启mod_rewrite解决laravel路由失效问题
- 【数据加密】AES加密和解密安卓篇(一)
- Hive数据倾斜
- GPS数据处理
- DW学习心得(3)
- AFORGE库对摄像头操作的封装(续)
- 性能考虑,数组是首选
- Android 通过 Intent 传递类对象
- 汇编语言jmp和call的区别
- 《leetCode》:Reverse Integer
- 使用struts2的 下载
- ios打包ipa的四种实用方法(.app转.ipa)
- swift 快速奔跑的兔几 本节的内容是:应用程序沙盒
- 模板方法模式----设计模式系列