zoukankan      html  css  js  c++  java
  • 利用AForge.NET 调用电脑摄像头进行拍照

    当然了,你需要去官网下载类库,http://www.aforgenet.com/

    调用本机摄像头常用的组件:

    AForge

    AForge.Controls

    AForge.Imaging

    AForge.Video

    AForge.Video.DirectShow

    图片展示方面,你可以使用PictureBox,也可以使用类库提供的控件videPlayer。  

    因为我这个还集成了 条码识别、电子秤称重,所以代码有点多,多多见谅。

    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(); } } }
  • 相关阅读:
    混合背包
    二维背包
    0/1背包问题(DP)
    冒泡排序
    快速排序
    最长上升子序列
    二分查找
    n后问题
    crontab 定时任务
    删除以某字符串开头的表
  • 原文地址:https://www.cnblogs.com/qigao/p/6430169.html
Copyright © 2011-2022 走看看