最近有个项目需要实现二维码的识别和摄像头的数据采集。在开始正式项目之前,我决定用python写几行简单的代码来测试每个库的识别效果。这次没有连续测量,也没有使用多线程识别。只是简单的测试了每个二维码的测试效果。这次测试的有opencv 4.2的QRCodeDetector库,BoofCV的库,Quirc,Zbar和ZXing。视频的采集统一使用cv的VideoCapture,视频的存储统一使用cv的VideoWriter。我的硬件环境是orange pi 3 的2G内存版,系统是armbian的Debian GNU/Linux 10 (buster)。事先已经配置好了opencv、java和PyBoof等必备条件。

1、首先测试的是opencv

代码如下(附件test_qr.py):

import numpy as np
import cv2
import os
import timevideo_path = '~/Downloads/'# VideoCapture
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
cap.set(3, 1280)
cap.set(4, 720)
cap.set(5, 30)# VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
outVideo = cv2.VideoWriter()
outVideo.open('output.mp4',fourcc,30.0,(1280,720), True )# QRCodeDetector
findQR = False
qrResult = ''
qrDetector = cv2.QRCodeDetector()print('Demo will work')
cnt = 0while(cap.isOpened()):ret, frame = cap.read()if ret==True:#frame = cv2.flip(frame,-1)outVideo.write(frame)# QR Code Detectorif not findQR :frame_mono = cv2.cvtColor(np.uint8(frame), cv2.COLOR_BGR2GRAY) start = time.time_ns()qrDone, points = qrDetector.detect(frame_mono)if qrDone:#print("find QR Code. Frame counter is ", cnt )qrString, straight = qrDetector.decode(frame_mono, points)if len(qrString) >1:end = time.time_ns()print("Running time is ",str(end - start))findQR = TrueqrResult = qrStringprint("find QR Code")else:print('fail to open camera')breakcnt += 1if cnt > 300 :print('Have created output.avi')breakif findQR:print("QR Code  is: {}".format(qrResult))
else:print("Didn't find QR Code!")cap.release()
outVideo.release()
cv2.destroyAllWindows()

评测结果是detect的效果很差,总有误动作。需要对decode的结果判断一下是否是空字符串。

用草料二维码生成的文本或者网址都可以很好识别,但很难识别微信和支付宝的二维码。可能需要提前对图片做一定的旋转和锐化处理。也可能与识别的光线有关系。

2、BoofCV(PyBoof)

这个库在该网站的分析报告中评价最高,无论是识别效果还是识别速率。本身是java编写的。但我们使用python版本的PyBoof。

代码如下(附件中test_boof.py):

import numpy as np
import pyboof as pb
import cv2
import os
import timevideo_path = '~/Downloads/'# VideoCapture
cap = cv2.VideoCapture(0, cv2.CAP_V4L2)
cap.set(3, 1280)
cap.set(4, 720)
cap.set(5, 30)# VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
outVideo = cv2.VideoWriter()
outVideo.open('output.mp4',fourcc,10.0,(1280,720), True )# QRCodeDetector
findQR = False
qrResult = ''
pb.init_memmap()
detector = pb.FactoryFiducial(np.uint8).qrcode()print('Demo will work')
cnt = 0while(cap.isOpened()):ret, frame = cap.read()if ret==True:#frame = cv2.flip(frame,-1)outVideo.write(frame)# QR Code Detectorif not findQR :frame_mono = cv2.cvtColor(np.uint8(frame), cv2.COLOR_BGR2GRAY)boof_img = pb.ndarray_to_boof(frame_mono)#boof_img = pb.load_single_band( 'path to image', np.uint8)start = time.time_ns()detector.detect(boof_img)if len(detector.detections)>0:end = time.time_ns()print("running time is ", str(end - start))print("find QR Code " )findQR = TrueqrResult = detector.detections[0].messageelse:print('fail to open camera')breakcnt += 1if cnt > 100 :print('Have created output.mp4')breakif findQR:print("QR Code  is: {}".format(qrResult))
else:print("Didn't find QR Code!")cap.release()
outVideo.release()
cv2.destroyAllWindows()

这个库可以识别多个二维码,总体来说识别准确率还是挺高的。但是昨晚测试时发现和opencv一样很难识别手机展示的微信和支付宝二维码。需要尝试很多次。但今天白天的测试发现和opencv一样都能正常测试。让人疑惑。总体上识别需要花费的时间也比opencv短。

3、测试

第一项测试是微信二维码截图:

可以看出识别速率都不高,都需要几百毫秒时间。可能与我使用的嵌入式板卡性能有关。后面将继续测试zbar,zxing和quirc的效果。

第二项测试是使用草料二维码生成的二维码字符串

可以看出来两者都很慢,需要600ms以上。可能与python有关系,因为opencv的原生环境是c++而boofcv的是java。也可能与硬件本身的性能有关系。

(后面一篇将继续测试另外几个library)

用不同的QR Code识别库实现二维码的识别(第一篇:opencv 和BoofCV)相关推荐

  1. Zxing和QR CODE 生成与解析二维码实例(带logo篇)

    上一篇介绍了普通的二位码的生成与解析,本篇来介绍两种工具类生成带Logo的二维码的实例 下载jar包地址:http://download.csdn.net/detail/gao36951/816186 ...

  2. Zxing和QR CODE 生成与解析二维码实例(普通篇)

    首先下载对应的jar包,本实例用的是Zxing2.2jar 下载地址:http://download.csdn.net/detail/gao36951/8161861 Zxing是Google提供的关 ...

  3. python解析二维码_Python二维码生成识别实例详解

    前言 在 JavaWeb 开发中,一般使用 Zxing 来生成和识别二维码,但是,Zxing 的识别有点差强人意,不少相对模糊的二维码识别率很低.不过就最新版本的测试来说,识别率有了现显著提高. 对比 ...

  4. python二维码生成识别代码_Python学习案例之二维码生成识别

    前言 在 JavaWeb 开发中,一般使用 Zxing 来生成和识别二维码,但是,Zxing 的识别有点差强人意,不少相对模糊的二维码识别率很低.不过就最新版本的测试来说,识别率有了现显著提高. 对比 ...

  5. 【Python-利用动态二维码传输文件(四)】使用pyautogui库录屏(连续截图),然后利用OpenCV逐张读取截图,识别当中的二维码信息,并把信息重组成原文件

    程序示意图 目录 一.使用pyautogui库,对电脑屏幕进行录屏 二.使用OpenCV库对100帧截图进行识别,并与原29帧二维码图片内含信息进行比对 三.把获取的100帧二维码信息去重,并保持原来 ...

  6. C/C++使用Quirc库解析二维码(QRcode)

    C/C++使用Quirc库解析二维码 Quirc介绍 Quirc库使用 遇到的坑 整理的知识点 总结 Quirc介绍 Quirc是一个基于C/C++的一个二维码库,其在码云上的官网 https://g ...

  7. python二维码生成识别代码_Python3+qrcode+zxing生成和识别二维码教程

    一.安装依赖库 pip install qrcode pillow image zxing pillow是python3中PIL的代替库,image是生成图版需要用到的库 安装image时报错&quo ...

  8. 手机移动端-纯js浏览器h5调用摄像头扫描识别解析 条形码+二维码

    一.场景 手机移动端-原生js 浏览器h5 解决 识别二维码 条形码功能: 不借助Hbuilder.需要自己打包成APP,比如用Hbuilder打包,浏览器端项目h5 无打包成app部署 X 不采用 ...

  9. Java中识别二维码并且提高二维码的识别率

    我们在Java开发的时候,发现对二维码的识别是不足的.所以我们需要提高识别率. 第一步.识别图片二维码.准备相应的jar包.我们在gradle+idea中开发. compile group: 'com ...

最新文章

  1. day13 paramiko、数据库表操作
  2. 20180827-Java网络编程
  3. Java多线程02(线程安全、线程同步、等待唤醒机制)
  4. 从文件夹中批量抽取(复制or剪切)文件 批处理脚本
  5. 标准单元测试步骤:A -B-C-D-E-F
  6. LeetCode(268)——缺失数字(JavaScript)
  7. iOS求职之OC面试题完整版---持续更新中...
  8. (HDU)1061 --Rightmost Digit( 最右边的数字)
  9. 机器学习sklearn
  10. log4j日志级别以及配置
  11. 剑桥教授项目 | 机器学习在推荐系统中的应用
  12. 【poj1743-Musical Theme】不可重叠最长重复子串-后缀数组
  13. 实用ps教程-第一节:使用ps制作GIF动图
  14. windows中office无法使用撤销键
  15. 如何排查内存飙升的情况
  16. 永中office linux卸载,安装永中Office for linux
  17. C语言-投票选举问题
  18. 论文笔记--InterFusion
  19. java入门好学吗_java好学吗?我是小白中的小白,零基础...
  20. iOS 10 is the maximum deployment target for 32-bit targets

热门文章

  1. 如何用阿里云服务器建立个人网站(针对新手)
  2. Html5常见面试题总结
  3. 深度学习——A Gentle Introduction to Graph Neural Networks
  4. 微信公众号监听 关注/取消关注事件 消息接收与响应处理(比较细微)
  5. 微软账号被锁定后的记录历程(已永久封禁)
  6. python pickle文件大小_Python Pandas to_pickle()压缩文件
  7. mysql获取去年同期_mysql 查询当天、昨天、本周、上周、本月、上月、今年、去年数据...
  8. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
  9. 【徕卡全站仪Geocom开发】开发日志#01
  10. 藤子不二雄博物馆之行