c# winform调用摄像头识别二维码

首先我们需要引用两个第三方组件:AForge和zxing。

Aforge是摄像头操作组件,zxing是二维码识别组件。都是开源项目。避免重复造轮子。

其实一些操作代码我也是参照别人的,若侵犯您的版权,请和我联系。

此博客仅供技术交流。

下载和用法大家可以自行搜索下。

首先获取所有可用的摄像头设备,并加入到comboBox1中

 1         private void getCamList()
 2         {
 3             try
 4             {
 5                 //AForge.Video.DirectShow.FilterInfoCollection 设备枚举类
 6                 videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
 7                 //清空列表框
 8                 comboBox1.Items.Clear();
 9                 if (videoDevices.Count == 0)
10                     throw new ApplicationException();
11                 //全局变量,标示设备摄像头设备是否存在
12                 DeviceExist = true;
13                 //加入设备
14                 foreach (FilterInfo device in videoDevices)
15                 {
16                     comboBox1.Items.Add(device.Name);
17                 }
18                 //默认选择第一项
19                 comboBox1.SelectedIndex = 0;
20             }
21             catch (ApplicationException)
22             {
23                 DeviceExist = false;
24                 comboBox1.Items.Add("未找到可用设备");
25             }
26         }

以下是启动按钮事件代码和一些其他代码。

 1         private void start_Click(object sender, EventArgs e)
 2         {
 3             if (start.Text == "Start")
 4             {
 5                 if (DeviceExist)
 6                 {
 7                     //视频捕获设备
 8                     videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
 9                     //捕获到新画面时触发
10                     videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
11                     //先关一下,下面再打开。避免重复打开的错误
12                     CloseVideoSource();
13                     //设置画面大小
14                     videoSource.DesiredFrameSize = new Size(160, 120);
15                     //启动视频组件
16                     videoSource.Start();
17                     start.Text = "Stop";
18                     //启动定时解析二维码
19                     timer1.Enabled = true;
20                     //启动绘制视频中的扫描线
21                     timer2.Enabled = true;
22                 }
23             }
24             else
25             {
26                 if (videoSource.IsRunning)
27                 {
28                     timer2.Enabled = false;
29                     timer1.Enabled = false;
30                     CloseVideoSource();
31                     start.Text = "Start";
32                 }
33             }
34         }
        /// <summary>
        /// 全局变量,记录扫描线距离顶端的距离
        /// </summary>
        int top = 0;
        /// <summary>
        /// 全局变量,保存每一次捕获的图像
        /// </summary>
        Bitmap img = null;

        private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            img = (Bitmap)eventArgs.Frame.Clone();

        }

        //close the device safely
        private void CloseVideoSource()
        {
            if (!(videoSource == null))
                if (videoSource.IsRunning)
                {
                    videoSource.SignalToStop();
                    videoSource = null;
                }
        }

下面的代码是在画面中绘制扫描线。

 1         private void timer2_Tick(object sender, EventArgs e)
 2         {
 3             if (img == null)
 4             {
 5                 return;
 6             }
 7             Bitmap img2 = (Bitmap)img.Clone();
 8             Pen p = new Pen(Color.Red);
 9             Graphics g = Graphics.FromImage(img2);
10             Point p1 = new Point(0, top);
11             Point p2 = new Point(pictureBox1.Width, top);
12             g.DrawLine(p, p1, p2);
13             g.Dispose();
14             top += 2;
15
16             top = top % pictureBox1.Height;
17             pictureBox1.Image = img2;
18
19         }

下面是解码二维码:

 1         private void timer1_Tick(object sender, EventArgs e)
 2         {
 3             if (img == null)
 4             {
 5                 return;
 6             }
 7             #region 将图片转换成byte数组
 8             MemoryStream ms = new MemoryStream();
 9             img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
10             byte[] bt = ms.GetBuffer();
11             ms.Close();
12             #endregion
13             LuminanceSource source = new RGBLuminanceSource(bt, img.Width, img.Height);
14             BinaryBitmap bitmap = new BinaryBitmap(new ZXing.Common.HybridBinarizer(source));
15             Result result;
16             try
17             {
18                 //开始解码
19                 result = new MultiFormatReader().decode(bitmap);
20             }
21             catch (ReaderException re)
22             {
23                 return;
24             }
25             if (result != null)
26             {
27                 textBox1.Text = result.Text;
28
29             }
30         }

用了第三方组件,开发难度真是直线下降。内部具体怎么解码的,真的是一点不知道。还望有经验的高手不吝赐教。

时间: 2024-08-08 10:37:25

c# winform调用摄像头识别二维码的相关文章

使用vue做移动app时,调用摄像头扫描二维码

现在前端技术发展飞快,前端都能做app了,那么项目中,也会遇到调用安卓手机基层的一些功能,比如调用摄像头,完成扫描二维码功能 下面我就为大家讲解一下,我在项目中调用这功能的过程. 首先我们需要一个中间框架,hbuilder http://www.html5plus.org/doc/zh_cn/accelerometer.html 这个是html5+的文档地址,我们找到Barcode模块, 有这么多,然后我们往下找 找到这段代码 <!DOCTYPE html> <html> <

unity 调用手机摄像机 识别二维码

简单的调用手机摄像 拍摄 然后识别二维码 显示二维码的内容 需要导入一个zxing.unity.dll文件,现在这个脚本的识别数据是放在Updata里边扫描的 数据量特别大会卡  要是用的话就自己做一下一秒执行一次.我这里没有弄 下载地址http://download.csdn.net/detail/chh19941125/8734149 代码: using System.Threading; using UnityEngine; using ZXing; public class WebCam

HTML5实现扫描识别二维码/生成二维码

扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源. 2. 利用canvas使用相关算法分析图片识别图片得出结果,可用jquery.qrcode分析二维码 .(技术点:getImageData) 局限性: 移动平台支持getUserMedia/Stream API的浏览器比较少,支持列表http://caniuse.com/#feat=stream (目前没发现有IOS是支持的) 代码实现: 感谢gi

Qt+QZXing编写识别二维码的程序

本人最近在用Qt编写程序,需要用编写二维码识别功能.在网上搜寻一番,找到了QZXing.配置过程中确实出了一大把汗,这里我写这篇文章记录配置方法,替后人省一把汗吧!我的开发环境:MSVC2010 + Qt5 从这里下载最新版的QZXing_sourceV2.3.zip,解压之后得到的是源代码,里面有一个QZXing.pri文件.理论上用MSVC加载这个pri文件之后这个库的代码就会出现在工程的代码列表中,但是理论归理论,实际上msvc在加载pri的过程中,弹出一大堆错误信息,完全不知所云,网上找

Android的二维码功能实现以及长按识别二维码

一.初步集成Zxing项目 二维码的识别可是在生活中随处可见的,现在基本上所有APP都有二维码的相关操作,如果识别二维码从头开始开发做起来还是相当复杂和麻烦的,从零开始开发肯定不现实,最好的做法就是借助现有的开源项目,Github上名气最大的就是Zxing了,提供了多个平台的二维码扫码解决方案,开源项目地址是:https://github.com/zxing/zxing,我们今天集成Zxing到我们自己的项目中去,并实现一些二维码生成.扫描.长按识别二维码等相关操作: 1.下载Zxing项目所依

spa(单页应用)中,使用history模式时,微信长按识别二维码在ios下失效的问题

spa(单页应用,vue)中,使用history模式时,微信长按识别二维码在ios下失效的问题. 触发条件: spa单页应用: 路由模式 history 从其他页面跳转到带有微信二维码识别的页面(不是直接打开该页面) ios版本的微信(实测版本6.5.19) 结果: 二维码长按无法识别,刷新页面后恢复正常,安卓下正常. 解决方案: 1. 进入该页面的方式不使用路由跳转,而改为 <a href="xxx">目标二维码页面</a>的方式: 2. 在beforeCre

【咸鱼教程】Egret可长按识别二维码(精确位置和大小)

教程目录一 实现原理二 实现过程三 Demo下载 本教程是在Egret中实现长按识别的二维码,并可以精确定位二维码的位置和大小,支持横屏和竖屏. 一 实现原理 微信中长按识别二维码,需要长按jpg或png等图片上,才会调起识别. 因为egret中的二维码,是绘制在canvas上的,故不能被长按识别. 所以为了解决这个问题,需要在canvas上覆盖一个二维码<img>标签, 达到可以长按识别的需求. 二 实现过程 1 在index.html中为div增加id = gameDiv,以备在egret

Jquery生成二维码(微信中长按图片识别二维码功能)

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.1.1/jquery.js"></script> <script src="

C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(一)

一.ZXing.Net 源代码地址:http://zxingnet.codeplex.com/ 也可以使用Nuget包管理,添加如图: 说明:ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android.现在也有了对应的.Net版本 二.生成二维码 将字符编码时可以指定字符格式:默认为ISO-8859-1英文字符集,但一般移动设备常用UTF-8字符