C# 利用AForge.NET 调用电脑摄像头进行拍照

来源:互联网 发布:origin8怎么导入数据 编辑:程序博客网 时间:2024/05/22 14:50

当然了,你需要去官网下载类库,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();        }     }}

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

 

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

AForge

AForge.Controls

AForge.Imaging

AForge.Video

AForge.Video.DirectShow

 

 

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

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

0 0
原创粉丝点击