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

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

AForge

AForge.Controls

AForge.Imaging

AForge.Video

AForge.Video.DirectShow

图片展示方面,你可以使用PictureBox,也可以使用类库提供的控件 AForge.Controls.VideoSourcePlayer

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

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

出处:https://www.cnblogs.com/qigao/p/6430169.html

==============================================

参考:

==============================================

测试代码文件:AForge.Camera.zip   (下载请查看隐藏)

WinForm利用AForge.NET调用电脑摄像头进行拍照和视频的更多相关文章

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

    当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...

  2. 利用html5调用本地摄像头拍照上传图片[转]

    利用html5调用本地摄像头拍照上传图片   html5概念啥的就不废话了,不知道的 百度, 谷歌一堆..今天学了学html5中的Canvas结合新增的<video>标签来获取本地摄像头, ...

  3. c# 利用AForge和百度AI开发实时人脸识别

    baiduAIFaceIdentify项目是C#语言,集成百度AI的SDK利用AForge开发的实时人脸识别的小demo,里边包含了人脸检测识别,人脸注册,人脸登录等功能 人脸实时检测识别功能 思路是 ...

  4. HTML之调用摄像头实现拍照和摄像功能

    应该有很多人知道,我们的手机里面有个功能是“抓拍入侵者”,说白了就是在解锁应用时如果我们输错了密码手机就会调用这一功能实现自动拍照. 其实在手机上还有很多我们常用的软件都有类似于这样的功能,比如微信扫 ...

  5. 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!

    一.写在前面 前几天也是分享了一些学习必备干货(还没关注的,赶紧入坑:传送门),也好久没有与大家探讨技术方案了,心里也是挺痒痒的,这不,一有点闲暇之时,就迫不及待把最近测出来的坑分享给大家. 提起An ...

  6. C# 利用AForge进行摄像头信息采集

    概述 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人 ...

  7. Android下载图片/调用系统相机拍照、显示并保存到本地

    package com.example.testhttpget; import java.io.BufferedReader; import java.io.FileNotFoundException ...

  8. Android 调用系统照相机拍照和录像

    本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.a ...

  9. 手机调用系统的拍照和裁剪功能,假设界面有输入框EditText,在一些手机会出现点击EditText会弹出输入法,却不能输入的情况。

    1. 拍照裁剪后 点击EditText会弹出输入法,却不能输入.可是点击点一EdtiText就能够输入了,所以我就写了一个看不见的EdtiText,切换焦点,这样就攻克了这个奇怪的这问题,应该是and ...

随机推荐

  1. 打开nginx配置的站点报错500

    打开站点报错500的原因 有很多,这里只说明一点:nginx 的fastcgi.conf配置引起的问题 环境说明 1 站点目录结构 wwwroot website public application ...

  2. This is this

    首先,我们来了解一下 this 的几种绑定方式: this的默认绑定: 当一个函数没有明确的调用对象的时候,即作为独立函数调用时,this绑定到全局window对象. function func() ...

  3. django缓存相关

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39726347/articl ...

  4. 编译器的系统include路径查询

    环境:Ubuntu 18.04.3 LTS 以 aarch64-linux-gnu-gcc 为例,运行如下命令: echo "main(){}" | aarch64-linux-g ...

  5. PHP pdo单例模式连接数据库

    PHP pdo单例模式连接数据库<pre><?php class Db{ private static $pdo; public static function getPdo () ...

  6. 【剑指offer】数组在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. 分析:数组有序,采用二分查找无疑 两种方法,时间复杂度差不多,都是利用二分查找,不过统计k出现的次数有所不同而已 方法1:二分查找k,找到任意一个k的下 ...

  7. 【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜

    原题传送门 这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法 实际线段树+树状数组的做法也很暴力 我们先用树状数组维护每个ac数量有多少个队伍.这样就能快速求出有多少队伍ac数比现在 ...

  8. git学习笔记 ---分支管理

    分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平行宇宙合并 ...

  9. 据时间生成唯一序列ID

    据时间生成唯一序列ID /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> ...

  10. 两个div并排显示,当浏览器界面缩小时会出现换行

    解决:规定两个子div的父div的宽 <div id="showDataDiv" style="width: 1000px"> <div st ...