首先我们需要引用两个第三方组件: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 == )
  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 = ;
  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(, );
  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. }
  1. /// <summary>
  2. /// 全局变量,记录扫描线距离顶端的距离
  3. /// </summary>
  4. int top = ;
  5. /// <summary>
  6. /// 全局变量,保存每一次捕获的图像
  7. /// </summary>
  8. Bitmap img = null;
  9.  
  10. private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
  11. {
  12. img = (Bitmap)eventArgs.Frame.Clone();
  13.  
  14. }
  15.  
  16. //close the device safely
  17. private void CloseVideoSource()
  18. {
  19. if (!(videoSource == null))
  20. if (videoSource.IsRunning)
  21. {
  22. videoSource.SignalToStop();
  23. videoSource = null;
  24. }
  25. }

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

  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(, top);
  11. Point p2 = new Point(pictureBox1.Width, top);
  12. g.DrawLine(p, p1, p2);
  13. g.Dispose();
  14. top += ;
  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. }

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

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

  1. iOS--iOS7摄像头识别二维码功能

    iOS–iOS7摄像头识别二维码功能 属性介绍: AVFoundation 框架基于以下几个类实现图像捕捉 ,通过这些类可以访问来自相机设备的原始数据并控制它的组件. AVCaptureDevice ...

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

    现在前端技术发展飞快,前端都能做app了,那么项目中,也会遇到调用安卓手机基层的一些功能,比如调用摄像头,完成扫描二维码功能 下面我就为大家讲解一下,我在项目中调用这功能的过程. 首先我们需要一个中间 ...

  3. C# winfrom调用摄像头扫描二维码(完整版)

    前段时间看到一篇博客,是这个功能的,参考了那篇博客写了这个功能玩一玩,没有做商业用途.发现他的代码给的有些描述不清晰的,我就自己整理一下发出来记录一下. 参考博客链接:https://www.cnbl ...

  4. winform 扫码识别二维码

    因为公司业务需求,需要在Windows系统下调用摄像头识别二维码需求,就有了这个功能. 我根据网上网友提供的一些资料,自己整合应用到项目中,效果还不错(就是感觉像素不是太好) 现在将调用摄像头+识别二 ...

  5. 使用JS调用手机本地摄像头或者相册图片识别二维码/条形码

    接着昨天的需求,不过这次不依赖微信,使用纯js唤醒手机本地摄像头或者选择手机相册图片,识别其中的二维码或者是条形码.昨天,我使用微信扫一扫识别,效果超棒的.不过如果依赖微信的话,又怎么实现呢,这里介绍 ...

  6. python3 树莓派 + usb摄像头 做颜色识别 二维码识别

    今天又啥也没干 我完蛋了哦  就是没办法沉下心来,咋办....还是先来条NLP吧.. 七,凡事必有至少三个解决方法 对事情只有一个方法的人,必陷入困境,因为别无选择. 对事情有两个方法的人也陷入困境, ...

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

    扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源.  2. 利用canvas使用相关算法分析图片识别图 ...

  8. 使用ZXing.Net生成与识别二维码(QR Code)

    Google ZXing是目前一个常用的基于Java实现的多种格式的1D/2D条码图像处理库,出于其开源的特性其现在已有多平台版本.比如今天要用到的ZXing.Net就是针对微软.Net平台的版本.使 ...

  9. python实现树莓派生成并识别二维码

    python实现树莓派生成并识别二维码 参考来源:http://blog.csdn.net/Burgess_Liu/article/details/40397803 设备及环境 树莓派2代 官方系统R ...

随机推荐

  1. WINDOWS SOCKET编程中accept出来的新连接是阻塞还是非阻塞

    实践证明 SOCKET hNewSock=accept(hListenSock) 当hListenSock为阻塞模型时,hNewSock则为阻塞模型 否则 当hListenSock为非阻塞模型时,hN ...

  2. 【13】python time时间模块知识点备查

    表示时间的三种形式 # 时间模块 '''UTC(世界协调时间):格林尼治天文时间,世界标准时间,在中国来说是UTC+8DST(夏令时):是一种节约能源而人为规定时间制度,在夏季调快1个小时 时间的表示 ...

  3. C语言实现输出杨辉三角

    1.倒推法实现输出杨辉三角右半部分,代码如下: #include<stdio.h> int main() { ]; printf("请输入行数n:"); scanf(& ...

  4. django表格form无法保存评论排查步骤

    初学django项目,在网上找了个blog教程,还是很不错的,这里感谢一下博主https://www.zmrenwu.com/post/2/ 这个项目适合django初学者,是一个完整的blog项目 ...

  5. post请求体过大导致ngx.req.get_post_args()取不到参数体的问题

    http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size 该地址对于client_body_buf ...

  6. OpenCV——查找、绘制轮廓

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  7. python变量的引用,浅拷贝

    python的变量是对象引用 l1和l2引用的相同的对象,所以会相互影响 元组不变的是引用的物理地址,如果引用的对象是可变的,那么远祖也会发生变化 但是t1[2]的id时钟没有发生变化 2 默认是浅拷 ...

  8. PAT B1030 完美数列 (25 分)

    给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...

  9. 【转】为什么volatile不能保证原子性而Atomic可以?

    直接上好文链接!!! 为什么volatile不能保证原子性而Atomic可以?

  10. DQN(Deep Reiforcement Learning) 发展历程(一)

    目录 马尔可夫理论 马尔可夫性质 马尔可夫过程(MP) 马尔可夫奖励过程(MRP) 值函数(value function) MRP求解 马尔可夫决策过程(MDP) 效用函数 优化的值函数 贝尔曼等式 ...