C#多摄像头切换调用,并扫描二维码
最近使用使用平板调用摄像头扫描二维码,下面是分享我的代码:
1、使用的程序包:AForge和ZXing;在NuGet中均能加载,其中AForge主要用到 AForge.Video; AForge.Video.DirectShow;
Zxing 和ZXing.Common
2、由于平板上有两个摄像头,因此需要做切换,所以准备了一个List和全局变量 chosedVideoInde
#region 变量
private FilterInfoCollection videoDevices;
private VideoCaptureDevice videoSource;
private List<string> vidoDeviceName = new List<string>();
Bitmap bmp = null;//保存每次捕获的图像
private int chosedVideoIndex = 0;//切换摄像头
#endregion
3、获取摄像头
private void getVideDevices()
{
vidoDeviceName.Clear();
try
{
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if(videoDevices.Count>0)
{
foreach(FilterInfo device in videoDevices)
{
vidoDeviceName.Add(device.Name);
}
}
else
{
MessageBox.Show("未发现设备");
}
}
catch(Exception ex)
{
throw new Exception("获取设备时发生错误:"+ex.Message);
}
}
4、关闭设备和清空图像
private void closeVideoSource()
{
timer1.Enabled = false;
timer2.Enabled = false;
if (videoSource == null) return;
if(videoSource.IsRunning)
{
videoSource.SignalToStop();
videoSource.WaitForStop();
videoSource = null;
pictureBox1.Image = null;//清空图片
}
txtMsg.Text = "";//用于记录当天状态
}
5、打开设备
private void OpenVideo(int choseVideoIndex)
{
if (vidoDeviceName.Count == 0)
{
return;
}
try
{
closeVideoSource(); //先清空
videoSource = new VideoCaptureDevice(videoDevices[choseVideoIndex].MonikerString);
videoSource.DesiredFrameRate = 1;
videoSource.DesiredFrameSize = new Size(pictureBox1.Width,pictureBox1.Height);
videoSource.NewFrame += new NewFrameEventHandler(newframe);
videoSource.Start();
}
catch(Exception ex)
{
throw new Exception("开启设备发生错误:"+ex.Message);
}
timer1.Enabled = true;
}
private void newframe(object sender,NewFrameEventArgs args)
{
bmp = (Bitmap)args.Frame.Clone();
}
6、扫描和解码
private void ScanBarcode()
{
if(pictureBox1.Image==null)
{
return;
}
//设置读取二维码
DecodingOptions decodeOption = new DecodingOptions();
decodeOption.PossibleFormats = new List<BarcodeFormat>() { BarcodeFormat.QR_CODE};
//读取操作
BarcodeReader reader = new BarcodeReader();
reader.Options = decodeOption;
ZXing.Result result = reader.Decode(pictureBox1.Image as Bitmap);
if (result == null)
{
txtMsg.Text = "";
txtMsg.ForeColor = Color.Red;
}
else
{
txtMsg.Text = result.Text;
txtMsg.ForeColor = Color.Black;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
ScanBarcode();
}
7、符合条件时停止扫描,并跳转其他窗体,关闭本窗体
private void txtMsg_TextChanged(object sender, EventArgs e)
{
if(Regex.IsMatch(txtMsg.Text.Trim(), @"^-?[0-9]+(.[0-9]+)?$"))
{
closeVideoSource();
FrmScanResult fsr = new FrmScanResult(txtMsg.Text);//跳转其他窗体
fsr.ShowDialog();
fsr.Dispose();
Stop();
this.Close();
}
}
8、切换设备
private void changeVideo_Click(object sender, EventArgs e)
{
if (vidoDeviceName.Count == 0)
{
txtMsg.Text = "无设备可用";
return;
}
else
{
if (chosedVideoIndex < vidoDeviceName.Count-1)
{
chosedVideoIndex++;
}
else
{
chosedVideoIndex = 0;
}
OpenVideo(chosedVideoIndex);
}
}
C#多摄像头切换调用,并扫描二维码相关推荐
- Vue 移动端实现调用相机扫描二维码或条形码
一.开发前的准备 实现二维码或条形码的扫描识别比较普遍的做法是去调用微信 JS-SDK 的扫一扫功能(详见 概述 | 微信开放文档),或者支付宝 H5 开放的API(详见?支付宝H5开放文档). 但是 ...
- Java使用opencv调用微信扫描二维码引擎,附带windows和linux需要的动态库文件
前言 最近公司项目有一个需求,要用二维码传递数据.于是使用了zxing生成和解析二维码,但是zxing扫描二维码原图还可以,一旦扫描用户使用手机拍摄的二维码,识别率急剧下降.尝试了对拍摄的照片进行降噪 ...
- Vue 实现调用相机扫描二维码或条形码
扫条形码: 扫二维码: zxing 下载: npm install @zxing/library --save 扫码组件内容: <template><div><video ...
- 关于Unity调用摄像头扫描二维码与生成二维码的实现方法
1.常用的生成二维码网址 https://cli.im/ 2.上官网下载二维码插件 http://zxingnet.codeplex.com/ 3.将下载的插件中zxing.unity.dll文件放入 ...
- PC端调用摄像头扫描二维码,拿到二维码信息
PC端调用摄像头扫描二维码,拿到二维码信息 <template><el-dialogtitle="扫描设备二维码":visible.sync="dial ...
- C#生成二维码、调用摄像头扫描二维码
二维码的生成和解码,有两个开源项目可以参考: 一个是google的zxing,另外一个是ThroughWork. zxing做的很全面,支持各种语言和平台,具体不多讲,自己查去.ThroughWork ...
- vue实现调用摄像头扫描二维码
安装依赖:vue-qrcode-reader npm install vue-qrcode-reader -s 直接上代码 <template><div><div cla ...
- Python实现PC摄像头扫描二维码,让你的电脑变身QR码识读器!
目录 简介: 源代码: 源代码说明: 效果如下所示: 简介: 使用PC摄像机扫描二维码可以有很多应用场景,例如: 支付宝.微信支付等移动支付方式需要使用二维码进行支付,PC摄像机可以扫描这些支付二维码 ...
- h5端呼起摄像头扫描二维码并解析
2016年6月29日补充: 最近做了一些与表单相关的项目,使用了h5的input控件,在使用过程中遇到了很多的坑.也包括与这篇文章相关的. 首先我们应该知道使用h5新提供的属性getUserMedia ...
最新文章
- linux 组调度浅析
- gcc和g++的区别[zz]
- 人工智能技术为大脑制作地图 前沿
- 饿了么风神登录_海底捞首度登陆第三方外卖!联手饿了么全国配送“小火锅”...
- 《C++ Primer》7.5.1节练习
- jax-rs jax-ws_什么是JAX-RS注释? (第3部分)
- php 表格分页代码,[Php]分页及表格样式
- virtualbox手动挂载共享文件夹
- Java语言跨平台性质的优点和缺点_机器人热门编程语言及优缺点分析
- runtime简单的使用解决实际问题(交换方法)
- Uber宣布停止无人卡车项目,研发重心将转向无人小汽车
- memcache的资料集
- 新手学习selenium路线图(老司机亲手绘制)-学前篇(转上海悠悠)
- linux mysql 集群搭建_MySQL分布式集群搭建
- css让四个div并排显示,css如何让两个div并排显示?
- 初学者如何搭建React开发环境并且创建react项目
- POI使用详解 java 复杂excel导出
- 什么是恒流源?如何工作的?
- CATIA软件如何在实体零件上提取面体?
- 工作流Flowable实战 (五)自定义表单
热门文章
- 网络系统规划与设计的基本原则
- 微信小程序在苹果上出现[request:fail 发生了 SSL 错误无法建立与该服务器的安全连接。]错误的解决方案
- 时尚漂亮的充电头,苹果安卓都能用,Anker安芯充20W上手
- 【Python笔记】列表基础操作 :创建,增加、删除、查询。附加:练习题。用简单代码解释。
- 教你2种常用的电商高并发处理解决方案
- word/excel 里的表格如何到PS里使用
- 团队环境搭建:MTK平台,PTK5.1、Supernova编译环境配置
- 打叉图标html,SVG 勾号和叉号图标
- japi项目需求分析阶段
- db2 dec函数oracle,DB2常用函数与Oracle有什么区别?