WinForm利用AForge.NET调用电脑摄像头进行拍照和视频
当然了,你需要去官网下载类库,http://www.aforgenet.com/
调用本机摄像头常用的组件:
AForge
AForge.Controls
AForge.Imaging
AForge.Video
AForge.Video.DirectShow
图片展示方面,你可以使用PictureBox,也可以使用类库提供的控件 AForge.Controls.VideoSourcePlayer
因为我这个还集成了 条码识别、电子秤称重,所以代码有点多,多多见谅。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; using System.Drawing.Imaging; using com.google.zxing.client.j2se; using com.google.zxing; using System.IO; using System.Threading; using Urovo.ExternalIndustryLib; using System.IO.Ports; using AForge.Video.DirectShow; using AForge.Video; using Inlite.ClearImageNet; namespace SweepCode { public partial class FrmMain : Form { //关闭标识 private bool IsClose = false; //识别标识 private bool StartCameraA = false; //重量读取标识 private bool ElectronicScale = false; private string OnlyCode = ""; private SerialPort Sp = new SerialPort(); IndustryConfigDAL industryConfigDAL = new IndustryConfigDAL(); private string strTemp = ""; private FilterInfoCollection videoDevices; private bool ShowIdentification = false; private VideoCaptureDevice videoSource; public FrmMain() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } private void Form1_Load(object sender, EventArgs e) { FormLoad(); } public void FormLoad() { try { ShowIdentification = false; videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count == 0) throw new ApplicationException(); ComboName.Items.Clear(); foreach (FilterInfo device in videoDevices) { ComboName.Items.Add(device.Name); } ComboName.SelectedIndex = 0; videoSource = new VideoCaptureDevice(videoDevices[ComboName.SelectedIndex].MonikerString); for (int i = 0; i < videoSource.VideoCapabilities.Length; i++) { ComboReso.Items.Add(videoSource.VideoCapabilities[i].FrameSize.Width + "*" + videoSource.VideoCapabilities[i].FrameSize.Height); } ComboReso.SelectedIndex = 0; videoSource.VideoResolution = videoSource.VideoCapabilities[ComboReso.SelectedIndex]; videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);
videoSource.Start();
//类库提供的控件,也可以显示 //videPlayer.VideoSource = videoSource; //videPlayer.Start(); ShowIdentification = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Information); } } //选择不同视频 private void ComboName_SelectedIndexChanged(object sender, EventArgs e) { if (ShowIdentification == false) return; IsClose = true; Thread.Sleep(100); ShowIdentification = false; videoSource.Stop(); videoSource = null; //videPlayer.SignalToStop(); //videPlayer.WaitForStop(); ComboReso.Items.Clear(); videoSource = new VideoCaptureDevice(videoDevices[ComboName.SelectedIndex].MonikerString); for (int i = 0; i < videoSource.VideoCapabilities.Length; i++) { ComboReso.Items.Add(videoSource.VideoCapabilities[i].FrameSize.Width + "*" + videoSource.VideoCapabilities[i].FrameSize.Height); } ComboReso.SelectedIndex = 0; videoSource.VideoResolution = videoSource.VideoCapabilities[ComboReso.SelectedIndex]; videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame); videoSource.Start(); IsClose = false; //videPlayer.VideoSource = videoSource; //videPlayer.Start(); ShowIdentification = true; } //选择不同的分辨率 private void ComboReso_SelectedIndexChanged(object sender, EventArgs e) { if (ShowIdentification == false) return; ShowIdentification = false; //videPlayer.SignalToStop(); //videPlayer.WaitForStop(); IsClose = true; Thread.Sleep(100); videoSource.Stop(); videoSource = null; videoSource = new VideoCaptureDevice(videoDevices[ComboName.SelectedIndex].MonikerString); videoSource.VideoResolution = videoSource.VideoCapabilities[ComboReso.SelectedIndex]; videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame); videoSource.Start(); //videPlayer.VideoSource = videoSource; //videPlayer.Start(); IsClose = false; ShowIdentification = true; } //释放 private void CloseVideoSource() { if (!(videoSource == null)) if (videoSource.IsRunning) { videoSource.SignalToStop(); videoSource = null; } }
//加载图片到控件 private delegate void UpdateUI(); private void fun(Bitmap img) { if (this.pictureBox1.InvokeRequired) { UpdateUI update = delegate { this.pictureBox1.Image = img; }; this.pictureBox1.Invoke(update); } else { this.pictureBox1.Image = img; } } //保存图片 private delegate void SaveImage(); private void SaveImageHH(string ImagePath) { if (this.pictureBox1.InvokeRequired) { SaveImage saveimage = delegate { this.pictureBox1.Image.Save(ImagePath); }; this.pictureBox1.Invoke(saveimage); } else { this.pictureBox1.Image.Save(ImagePath); } } string tempImagePath = ""; /// <summary> /// 拍照-识别-显示 /// </summary> public void StartCamera() { try { while (StartCameraA) { // label1.Text = ""; List<BarcodeFormat> formats = new List<BarcodeFormat>(); formats.Add(BarcodeFormat.CODE128); formats.Add(BarcodeFormat.CODE39); int rNumber = RandomNumber(); string imagePath = System.Environment.CurrentDirectory; if (!Directory.Exists(@imagePath + "\\Images")) { Directory.CreateDirectory(@imagePath + "\\Images"); } StringBuilder p = new StringBuilder(@imagePath + "\\Images\\" + rNumber + ".jpg"); SaveImageHH(@imagePath + "\\Images\\" + rNumber + ".jpg"); BarcodeReader reader = new BarcodeReader(); reader.Horizontal = true; reader.Vertical = true; reader.Diagonal = true; reader.Code39 = true; reader.Code128 = true; Barcode[] barcodes = reader.Read(@imagePath + "\\Images\\" + rNumber + ".jpg"); string s = ""; int cnt = 0; string CodeValue = ""; if (barcodes.Length > 1) { label1.Text = "Existence Multiple BarCode"; Thread.Sleep(100); } else { foreach (Barcode bc in barcodes) { cnt++; CodeValue = bc.Text; } if (cnt == 0) {//解码不成功,继续抓取图像并解码 // tempImagePath = ""; tempLableValue = "NO BARCODES"; MethodInvoker invoke = new MethodInvoker(SetLableText); BeginInvoke(invoke); label1.Text = "NO BARCODES"; Thread.Sleep(100); } else { //解码成功 if (label1.Text != CodeValue) { label1.Text = CodeValue; tempLableValue = CodeValue; MethodInvoker invoke = new MethodInvoker(SetLableText); BeginInvoke(invoke); string applicationPath = Application.StartupPath; System.Media.SoundPlayer sndPlayer = new System.Media.SoundPlayer(@applicationPath + "\\WAV\\success.wav"); sndPlayer.Play(); } Thread.Sleep(100); } } File.Delete(@imagePath + "\\Images\\" + rNumber + ".jpg"); } } catch (Exception ex) { Thread.Sleep(100); label1.Text = ex.Message; tempLableValue = ex.Message; MethodInvoker invoke = new MethodInvoker(SetLableText); BeginInvoke(invoke); } } string tempLableValue; void SetLableText() { label1.Text = tempLableValue; } void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs) { if (IsClose) return; try { Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone(); fun(bitmap); } catch (Exception ex) { label1.Text = "保存图像失败!"; } } void videPlayer_NewFrame(object sender, ref Bitmap bitmapimage) { try { if (tempImagePath != "") { bitmapimage.Save(tempImagePath, System.Drawing.Imaging.ImageFormat.Bmp); } } catch (Exception ex) { label1.Text = ex.Message; } } /// <summary> /// 测试用-记录调用步骤 /// </summary> /// <param name="Value"></param> public void ShowMessage(string Value) { listBox1.Items.Add(Value); } public delegate void HandleInterfaceUpdataDelegate(string text); //委托,此为重点 private HandleInterfaceUpdataDelegate interfaceUpdataHandle; //拍照委托 /// <summary> /// 打开串口 /// </summary> /// <returns></returns> public bool OpenElectronicScale() { try { industryConfigDAL.ReadConfig(); interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象 Sp.PortName = industryConfigDAL.Port; Sp.BaudRate = Convert.ToInt32(industryConfigDAL.BaudRate); Sp.Parity = Parity.None; Sp.StopBits = StopBits.One; // Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived); Sp.ReceivedBytesThreshold = 1; Sp.Open(); } catch (Exception ex) { //btnIdentify.Enabled = true; //btnStopDistinguish.Enabled = false; label4.Text = "端口" + industryConfigDAL.Port + "打开失败!"; //MessageBox.Show("端口" + industryConfigDAL.Port + "打开失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } return true; } /// <summary> /// 更新值 /// </summary> /// <param name="text"></param> private void UpdateTextBox(string text) { char[] arr = text.ToCharArray(); Array.Reverse(arr); label4.Text = new string(arr); } /// <summary> /// 识别 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnIdentify_Click(object sender, EventArgs e) { try { toolStripDropDownButton1.Enabled = false; ComboName.Enabled = false; ComboReso.Enabled = false; btnIdentify.Enabled = false; btnStopDistinguish.Enabled = true; #region //读取电子秤 if (OpenElectronicScale()) { ElectronicScale = true; Thread th = new Thread(Distinguish); th.IsBackground = true; th.Start(); } //条码识别 StartCameraA = true; Thread thread = new Thread(StartCamera); thread.IsBackground = true; thread.Start(); #endregion } catch { } } /// <summary> /// 读取电子秤数据 /// </summary> public void Distinguish() { try { while (ElectronicScale) { Thread.Sleep(50); int i = Sp.BytesToRead; if (i > 0) { try { strTemp = Sp.ReadExisting(); } catch { } if (strTemp.ToLower().IndexOf("=") < 0) { i = 0; } else { string[] sd = strTemp.Split('='); this.Invoke(interfaceUpdataHandle, sd[1]); } } } } catch { ElectronicScale = false; return; } } /// <summary> /// 生成随机数 /// </summary> /// <returns></returns> public int RandomNumber() { Random random = new Random(); int num = random.Next(100000, 1000000); return num; } /// <summary> /// 停止 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStopDistinguish_Click(object sender, EventArgs e) { toolStripDropDownButton1.Enabled = true; ComboName.Enabled = true; ComboReso.Enabled = true; btnIdentify.Enabled = true; btnStopDistinguish.Enabled = false; StartCameraA = false; ElectronicScale = false; Thread.Sleep(1000); Sp.Close(); } /// <summary> /// 设置电子秤参数 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnElectronicScale_Click(object sender, EventArgs e) { FrmElectronicScale frmElectronicScale = new FrmElectronicScale(); frmElectronicScale.ShowDialog(); } /// <summary> /// 关闭窗体 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) { IsClose = true; Thread.Sleep(100); ElectronicScale = false; StartCameraA = false; if (videoSource.IsRunning) { videoSource.SignalToStop(); } //videoSource.Stop(); videoSource = null; Thread.Sleep(1000); Sp.Close(); Thread.Sleep(1000); this.Dispose(); Thread.Sleep(1000); Application.Exit(); Thread.Sleep(1000); System.Diagnostics.Process.GetCurrentProcess().Kill(); } } }
出处:https://www.cnblogs.com/qigao/p/6430169.html
==============================================
参考:
==============================================
测试代码文件:AForge.Camera.zip (下载请查看隐藏)
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/11137748.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
posted on 2019-07-05 13:16 jack_Meng 阅读(1730) 评论(0) 编辑 收藏 举报