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

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

 

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

AForge

AForge.Controls

AForge.Imaging

AForge.Video

AForge.Video.DirectShow

 

 

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

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 AForge.Video.DirectShow; using AForge.Video; namespace AForgeDemo { public partial class Form1 : Form { private bool DeviceExist = false; private FilterInfoCollection videoDevices; private VideoCaptureDevice videoSource = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { getCamList(); } private void getCamList() { try { videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); cbDev.Items.Clear(); if (videoDevices.Count == 0) throw new ApplicationException(); DeviceExist = true; foreach (FilterInfo device in videoDevices) { cbDev.Items.Add(device.Name); } cbDev.SelectedIndex = 0; } catch (ApplicationException) { DeviceExist = false; cbDev.Items.Add("无设备"); } } private void CloseVideoSource() { if (!(videoSource == null)) if (videoSource.IsRunning) { videoSource.SignalToStop(); videoSource = null; } } private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) { Bitmap img = (Bitmap)eventArgs.Frame.Clone(); picVideo.Image = img; } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { CloseVideoSource(); } private void btnOpen_Click(object sender, EventArgs e) { if (DeviceExist) { videoSource = new VideoCaptureDevice(videoDevices[cbDev.SelectedIndex].MonikerString); videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame); CloseVideoSource(); videoSource.DesiredFrameSize = new Size(picVideo.Width, picVideo.Height); videoSource.Start(); lbinfo.Text = "设备运行..."; } else { lbinfo.Text = "没有选择设备"; } } private void btnStop_Click(object sender, EventArgs e) { if (videoSource.IsRunning) { CloseVideoSource(); lbinfo.Text = "设备停止"; } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值