利用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(); } } }

 

posted @ 2017-02-22 18:01  居~  阅读(7741)  评论(2编辑  收藏  举报