最近使用使用平板调用摄像头扫描二维码,下面是分享我的代码:

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#多摄像头切换调用,并扫描二维码相关推荐

  1. Vue 移动端实现调用相机扫描二维码或条形码

    一.开发前的准备 实现二维码或条形码的扫描识别比较普遍的做法是去调用微信 JS-SDK 的扫一扫功能(详见 概述 | 微信开放文档),或者支付宝 H5 开放的API(详见?支付宝H5开放文档). 但是 ...

  2. Java使用opencv调用微信扫描二维码引擎,附带windows和linux需要的动态库文件

    前言 最近公司项目有一个需求,要用二维码传递数据.于是使用了zxing生成和解析二维码,但是zxing扫描二维码原图还可以,一旦扫描用户使用手机拍摄的二维码,识别率急剧下降.尝试了对拍摄的照片进行降噪 ...

  3. Vue 实现调用相机扫描二维码或条形码

    扫条形码: 扫二维码: zxing 下载: npm install @zxing/library --save 扫码组件内容: <template><div><video ...

  4. 关于Unity调用摄像头扫描二维码与生成二维码的实现方法

    1.常用的生成二维码网址 https://cli.im/ 2.上官网下载二维码插件 http://zxingnet.codeplex.com/ 3.将下载的插件中zxing.unity.dll文件放入 ...

  5. PC端调用摄像头扫描二维码,拿到二维码信息

    PC端调用摄像头扫描二维码,拿到二维码信息 <template><el-dialogtitle="扫描设备二维码":visible.sync="dial ...

  6. C#生成二维码、调用摄像头扫描二维码

    二维码的生成和解码,有两个开源项目可以参考: 一个是google的zxing,另外一个是ThroughWork. zxing做的很全面,支持各种语言和平台,具体不多讲,自己查去.ThroughWork ...

  7. vue实现调用摄像头扫描二维码

    安装依赖:vue-qrcode-reader npm install vue-qrcode-reader -s 直接上代码 <template><div><div cla ...

  8. Python实现PC摄像头扫描二维码,让你的电脑变身QR码识读器!

    目录 简介: 源代码: 源代码说明: 效果如下所示: 简介: 使用PC摄像机扫描二维码可以有很多应用场景,例如: 支付宝.微信支付等移动支付方式需要使用二维码进行支付,PC摄像机可以扫描这些支付二维码 ...

  9. h5端呼起摄像头扫描二维码并解析

    2016年6月29日补充: 最近做了一些与表单相关的项目,使用了h5的input控件,在使用过程中遇到了很多的坑.也包括与这篇文章相关的. 首先我们应该知道使用h5新提供的属性getUserMedia ...

最新文章

  1. linux 组调度浅析
  2. gcc和g++的区别[zz]
  3. 人工智能技术为大脑制作地图 前沿
  4. 饿了么风神登录_海底捞首度登陆第三方外卖!联手饿了么全国配送“小火锅”...
  5. 《C++ Primer》7.5.1节练习
  6. jax-rs jax-ws_什么是JAX-RS注释? (第3部分)
  7. php 表格分页代码,[Php]分页及表格样式
  8. virtualbox手动挂载共享文件夹
  9. Java语言跨平台性质的优点和缺点_机器人热门编程语言及优缺点分析
  10. runtime简单的使用解决实际问题(交换方法)
  11. Uber宣布停止无人卡车项目,研发重心将转向无人小汽车
  12. memcache的资料集
  13. 新手学习selenium路线图(老司机亲手绘制)-学前篇(转上海悠悠)
  14. linux mysql 集群搭建_MySQL分布式集群搭建
  15. css让四个div并排显示,css如何让两个div并排显示?
  16. 初学者如何搭建React开发环境并且创建react项目
  17. POI使用详解 java 复杂excel导出
  18. 什么是恒流源?如何工作的?
  19. CATIA软件如何在实体零件上提取面体?
  20. 工作流Flowable实战 (五)自定义表单

热门文章

  1. 网络系统规划与设计的基本原则
  2. 微信小程序在苹果上出现[request:fail 发生了 SSL 错误无法建立与该服务器的安全连接。]错误的解决方案
  3. 时尚漂亮的充电头,苹果安卓都能用,Anker安芯充20W上手
  4. 【Python笔记】列表基础操作 :创建,增加、删除、查询。附加:练习题。用简单代码解释。
  5. 教你2种常用的电商高并发处理解决方案
  6. word/excel 里的表格如何到PS里使用
  7. 团队环境搭建:MTK平台,PTK5.1、Supernova编译环境配置
  8. 打叉图标html,SVG 勾号和叉号图标
  9. japi项目需求分析阶段
  10. db2 dec函数oracle,DB2常用函数与Oracle有什么区别?