利用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 == )
throw new ApplicationException();
ComboName.Items.Clear();
foreach (FilterInfo device in videoDevices)
{
ComboName.Items.Add(device.Name);
}
ComboName.SelectedIndex = ;
videoSource = new VideoCaptureDevice(videoDevices[ComboName.SelectedIndex].MonikerString);
for (int i = ; i < videoSource.VideoCapabilities.Length; i++)
{
ComboReso.Items.Add(videoSource.VideoCapabilities[i].FrameSize.Width + "*" + videoSource.VideoCapabilities[i].FrameSize.Height);
}
ComboReso.SelectedIndex = ;
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();
ShowIdentification = false;
videoSource.Stop();
videoSource = null;
//videPlayer.SignalToStop();
//videPlayer.WaitForStop();
ComboReso.Items.Clear();
videoSource = new VideoCaptureDevice(videoDevices[ComboName.SelectedIndex].MonikerString);
for (int i = ; i < videoSource.VideoCapabilities.Length; i++)
{
ComboReso.Items.Add(videoSource.VideoCapabilities[i].FrameSize.Width + "*" + videoSource.VideoCapabilities[i].FrameSize.Height);
}
ComboReso.SelectedIndex = ;
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();
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 = ;
string CodeValue = ""; if (barcodes.Length > )
{
label1.Text = "Existence Multiple BarCode";
Thread.Sleep();
}
else
{
foreach (Barcode bc in barcodes)
{
cnt++;
CodeValue = bc.Text;
}
if (cnt == )
{//解码不成功,继续抓取图像并解码
// tempImagePath = "";
tempLableValue = "NO BARCODES";
MethodInvoker invoke = new MethodInvoker(SetLableText);
BeginInvoke(invoke); label1.Text = "NO BARCODES";
Thread.Sleep();
}
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();
}
}
File.Delete(@imagePath + "\\Images\\" + rNumber + ".jpg");
}
}
catch (Exception ex)
{
Thread.Sleep();
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 = ;
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();
int i = Sp.BytesToRead;
if (i > )
{
try
{
strTemp = Sp.ReadExisting();
}
catch
{
}
if (strTemp.ToLower().IndexOf("=") < )
{
i = ;
}
else
{
string[] sd = strTemp.Split('=');
this.Invoke(interfaceUpdataHandle, sd[]);
}
} }
}
catch
{
ElectronicScale = false;
return;
}
} /// <summary>
/// 生成随机数
/// </summary>
/// <returns></returns>
public int RandomNumber()
{
Random random = new Random();
int num = random.Next(, );
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();
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();
ElectronicScale = false;
StartCameraA = false;
if (videoSource.IsRunning)
{
videoSource.SignalToStop();
}
//videoSource.Stop();
videoSource = null;
Thread.Sleep();
Sp.Close();
Thread.Sleep();
this.Dispose();
Thread.Sleep();
Application.Exit();
Thread.Sleep();
System.Diagnostics.Process.GetCurrentProcess().Kill();
}
}
}
利用AForge.NET 调用电脑摄像头进行拍照的更多相关文章
- WinForm利用AForge.NET调用电脑摄像头进行拍照和视频
当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...
- 利用html5调用本地摄像头拍照上传图片[转]
利用html5调用本地摄像头拍照上传图片 html5概念啥的就不废话了,不知道的 百度, 谷歌一堆..今天学了学html5中的Canvas结合新增的<video>标签来获取本地摄像头, ...
- 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
一.写在前面 前几天也是分享了一些学习必备干货(还没关注的,赶紧入坑:传送门),也好久没有与大家探讨技术方案了,心里也是挺痒痒的,这不,一有点闲暇之时,就迫不及待把最近测出来的坑分享给大家. 提起An ...
- c# 利用AForge和百度AI开发实时人脸识别
baiduAIFaceIdentify项目是C#语言,集成百度AI的SDK利用AForge开发的实时人脸识别的小demo,里边包含了人脸检测识别,人脸注册,人脸登录等功能 人脸实时检测识别功能 思路是 ...
- C# 利用AForge进行摄像头信息采集
概述 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人 ...
- Android下载图片/调用系统相机拍照、显示并保存到本地
package com.example.testhttpget; import java.io.BufferedReader; import java.io.FileNotFoundException ...
- Android 调用系统照相机拍照和录像
本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.a ...
- 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。
1. 拍照裁剪后 点击EditText会弹出输入法,却不能输入.可是点击点一EdtiText就能够输入了,所以我就写了一个看不见的EdtiText,切换焦点,这样就攻克了这个奇怪的这问题,应该是and ...
- 怎样让HTML5调用手机摄像头拍照——实践就是一切
原文:怎样让HTML5调用手机摄像头拍照--实践就是一切 NanShan 小编将思路提供给了大家.学编程最重要的是实践,我这尽管有完好的代码,可是希望大家都能够自己写出属于自己的代码 HTML5 Th ...
随机推荐
- 10天学会phpWeChat——第九天:数据库增、删、改、查(CRUD)操作
数据库的操作(CRUD)是一个现代化计算机软件的核心,尤其针对web应用软件.虽然在前面的几讲里,我们针对数据库操作大致有了一些了解,但今天我们需要再次强化下. 除了新瓶装老酒,我们今天还引入一个新的 ...
- mongodb学习(六)索引
准备工作: 先插入100万条数据 for(i=0;i<=1000000;i++){ db.users.insert({ "i":i, "username" ...
- yum命令被锁 Existing lock /var/run/yum.pid
有时使用yum命令,不知怎会回事就提示: Existing lock /var/run/yum.pid: another copy is running as... 感觉也没操作什么错误的事情. 此时 ...
- margin的简单应用
今晚学了盒模型的marg部分,简单仿下京东的官网首页部分 第一次制作,尽管看来实在惨不忍睹,毕竟娘不嫌儿丑,之后多加努力吧,这几天尽量加快学习进度,能单独制作一张精美的网页最好 附上代码 <!D ...
- iOS网络高级编程:iPhone和iPad的企业应用开发(书籍学习)
作者:Jack Cox.Nathan Jones.John Szumski 译者:张龙 勘误 前言 第 I 部分 理解iOS与企业网络 这一部分从高层次概览了iOS网络以及针对移动网络架构的最佳 ...
- @dynamic 与 @synthesize
@synthesize是默认选项,表示为属性自动生成getter方法和setter方法 @dynamic 需要在实现文件里注明.例如 @dynamic name:表示用开发者手动动态实现getter和 ...
- js dorado
1.dorado http://bsdn.org/projects/dorado7/deploy/sample-center/com.bstek.dorado.sample.Main.d#40350
- --@angularJS--ng-show应用
本篇给出ng-show的示例代码,以供参考. 1.NgShow.html: <!doctype html><html ng-app="MyCSSModule"&g ...
- redis 实例
打redis模块打开官网 http://www.redis.io/ 进入clients 找到PHP的选项 然后进入phpredis 这就是redis for php的扩展模块 phpize ./co ...
- PHP安全编程
转自:http://www.nowamagic.net/librarys/veda/detail/2076 1.关闭register_globals,以提高安全性 2.在部署环境,不要让不相关的人 ...