Python制作二维码和条形码扫描器 (pyzbar)
条码在生活中随处可见,其可分为三类:一维条码、二维条码、三维条码
一维条码:
我们平时习惯称为条形码。条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。
二维条码:
二维条码简称为二维码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
三维条码:
三维条码具有更大的信息容量、相同的识别便易性和较好的安全性。三维码的主要特征在于利用色彩或灰度(或称黑密度)表示不同的数据并进行编码。
一、实现效果

二、安装所需的库
2.1、安装扫描库
安装命令:pip3 install pyzbar
其实Python的条码扫描库,一直都有一个很是出名,那就是zbar,但此库虽然牛,却已经停止维护了,如果是python3,则不能使用zbar库了,python2.7还是可以用的。忙活了一下午才发现我的python3.5不能用zbara库,哈哈蓝瘦
2.2、安装其他必要库
后续功能需要用到PIL和OpenCV-Python相关库,可参考以下链接进行简单认识和库的安装
三、系统环境准备
3.1、Windows环境
如果是Windows电脑则可以跳过。* 0 *
3.2、树莓派环境
第一步:插入并打开CSI摄像头(参考:https://www.cnblogs.com/dongxiaodong/p/9814119.html)
第二步:配置系统启动之后加载bcm2835-v4l2这个模块,原因是树莓派中的camera module是放在/boot/目录中以固件形式加载的,不是一个标准的V4L2的摄像头驱动,所以用opencv的(cv2.VideoCapture(0)会无视频数据),加上这句之后就可以解决以上问题。
命令:sudo vi /etc/modules
加入:bcm2835-v4l2

四、实现简单的图识别
使用pyzbar和PIL 进行图片的二维码识别,并输出识别结果
识别结果:

找到一张二维码图片,并下载其中二维码:

基本代码:
import pyzbar.pyzbar as pyzbar
from PIL import Image,ImageEnhance image = "imgx\dongxiao.png" img = Image.open(image)
#处理图片
#img = ImageEnhance.Brightness(img).enhance(2.0)#增加亮度 #img = ImageEnhance.Sharpness(img).enhance(17.0)#锐利化 #img = ImageEnhance.Contrast(img).enhance(4.0)#增加对比度 #img = img.convert('L')#灰度化 #显示原图,调用系统默认的图片显示器
img.show() texts = pyzbar.decode(img)
#输出结果
for text in texts:
tt = text.data.decode("utf-8")
print(tt)
五、图识别进阶
使用pyzbar和PIL 及OpenCV-Python,实现二维码图片框选和在图片上印字体
识别结果:


基本代码:
import cv2
import pyzbar.pyzbar as pyzbar
import numpy
from PIL import Image, ImageDraw, ImageFont def decodeDisplay(imagex1):
# 转为灰度图像
gray = cv2.cvtColor(imagex1, cv2.COLOR_BGR2GRAY)
barcodes = pyzbar.decode(gray) for barcode in barcodes: # 提取条形码的边界框的位置
# 画出图像中条形码的边界框
(x, y, w, h) = barcode.rect
cv2.rectangle(imagex1, (x, y), (x + w, y + h), (255, 255, 0), 2) # 条形码数据为字节对象,所以如果我们想在输出图像上
# 画出来,就需要先将它转换成字符串
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type #不能显示中文
# 绘出图像上条形码的数据和条形码类型
#text = "{} ({})".format(barcodeData, barcodeType)
#cv2.putText(imagex1, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,5, (0, 0, 125), 2) #更换为:
img_PIL = Image.fromarray(cv2.cvtColor(imagex1, cv2.COLOR_BGR2RGB)) # 参数(字体,默认大小)
font = ImageFont.truetype('fontx/hwst.ttf', 25)
# 字体颜色(rgb)
fillColor = (255,0,0)
# 文字输出位置
position = (x, y-10)
# 输出内容
str = barcodeData # 需要先把输出的中文字符转换成Unicode编码形式( str.decode("utf-8) ) draw = ImageDraw.Draw(img_PIL)
draw.text(position, str, font=font, fill=fillColor)
# 使用PIL中的save方法保存图片到本地
# img_PIL.save('02.jpg', 'jpeg') # 转换回OpenCV格式
imagex1 = cv2.cvtColor(numpy.asarray(img_PIL), cv2.COLOR_RGB2BGR) # 向终端打印条形码数据和条形码类型
print("扫描结果==》 类别: {0} 内容: {1}".format(barcodeType, barcodeData))
cv2.imshow("camera", imagex1)
# 窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
cv2.waitKey(0) # 销毁窗口,退出程序
cv2.destroyAllWindows() def detect():
cv2.namedWindow("camera",cv2.WINDOW_NORMAL)
frame=cv2.imread("imgx\dongxiao2.png")
decodeDisplay(frame) if __name__ == '__main__':
detect()
六、实现视频实时读取
OpenCV-Python视频读取,并帧处理视频,实现条码的动态框选和识别
识别结果:

基本代码:
import cv2
import pyzbar.pyzbar as pyzbar
import numpy
from PIL import Image, ImageDraw, ImageFont def decodeDisplay(imagex1):
# 转为灰度图像
gray = cv2.cvtColor(imagex1, cv2.COLOR_BGR2GRAY)
barcodes = pyzbar.decode(gray) for barcode in barcodes: # 提取条形码的边界框的位置
# 画出图像中条形码的边界框
(x, y, w, h) = barcode.rect
cv2.rectangle(imagex1, (x, y), (x + w, y + h), (0, 255, 0), 2) # 条形码数据为字节对象,所以如果我们想在输出图像上
# 画出来,就需要先将它转换成字符串
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type #不能显示中文
# 绘出图像上条形码的数据和条形码类型
#text = "{} ({})".format(barcodeData, barcodeType)
#cv2.putText(imagex1, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX,5, (0, 0, 125), 2) #更换为:
img_PIL = Image.fromarray(cv2.cvtColor(imagex1, cv2.COLOR_BGR2RGB)) # 参数(字体,默认大小)
font = ImageFont.truetype('fontx/hwst.ttf', 35)
# 字体颜色(rgb)
fillColor = (0,255,255)
# 文字输出位置
position = (x, y-10)
# 输出内容
str = barcodeData # 需要先把输出的中文字符转换成Unicode编码形式( str.decode("utf-8) ) draw = ImageDraw.Draw(img_PIL)
draw.text(position, str, font=font, fill=fillColor)
# 使用PIL中的save方法保存图片到本地
# img_PIL.save('02.jpg', 'jpeg') # 转换回OpenCV格式
imagex1 = cv2.cvtColor(numpy.asarray(img_PIL), cv2.COLOR_RGB2BGR) # 向终端打印条形码数据和条形码类型
print("扫描结果==》 类别: {0} 内容: {1}".format(barcodeType, barcodeData))
cv2.imshow("camera", imagex1) def detect():
cv2.namedWindow("camera",cv2.WINDOW_NORMAL)
camera = cv2.VideoCapture(0) while True:
# 读取当前帧
ret, frame = camera.read()
#print(ret.shape)
decodeDisplay(frame) if(cv2.waitKey(5)==27):
break
camera.release()
cv2.destroyAllWindows() if __name__ == '__main__':
detect()
参考:
http://www.cnblogs.com/xushengming/p/9872061.html
https://blog.csdn.net/zx66zx/article/details/82785334
https://blog.csdn.net/x115104/article/details/78878599
https://blog.csdn.net/shanzhizi/article/details/50755168
Python制作二维码和条形码扫描器 (pyzbar)的更多相关文章
- 利用Python制作二维码
利用简单的Python代码制作二维码 一.制作工具 安装Python环境 + PyCharm编译器. 二.电脑系统 本人win10 + Python3.7.0 + PyCharm. 三.写代码前先下载 ...
- 使用python制作二维码
python-qrcode是个用来生成二维码图片的第三方模块,主要依赖的是 PIL 模块和 qrcode 库.(PIL模块只支持python2.7及以下版本,python3之后无法使用,官方推荐pyt ...
- python制作二维码
1.安装MyQR pip install MyQR 2.打开pycharm,新建项目文件 from MyQR import myqr 2.1黑白二维码 2.2,彩色动态二维码 3.当前项目本地 ...
- python实现二维码、条形码识别
环境: python 3.7 Win7 依赖包安装: pip install pillow pip install opencv-python pip install opencv-contrib-p ...
- 有关python下二维码识别用法及识别率对比分析
最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar .zbarlight.zxing. 1.三个模块的用法: #-*-coding=utf-8-*- import ...
- zbar+opencv检测图片中的二维码或条形码
zbar本身自带检测二维码条形码功能,这里使用opencv只是做一些简单的读取图片,灰度图片以及显示条形码和二维码时用到一些绘制 // barcode-qrcodescanner.cpp: 定义控制台 ...
- 如何使用二维码进行表白-一键制作二维码,gif二维码制作
" 如何使用二维码进行表白-一键制作二维码" 二维码在我们现在生活中随处可见,因为一次突发奇想,那我们可不可以制作一个自己的二维码呢!然后让女朋友去扫描一下----嘿嘿嘿--不行, ...
- GJM : Unity3D结合ZXING制作二维码识别
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- 【Demo】 生成二维码 和 条形码
条形码 和 二维码 对比 一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准. 在水平和垂直方向的二维空间存储信息的条形码, 称为 ...
随机推荐
- POJ 3162.Walking Race 树形dp 树的直径
Walking Race Time Limit: 10000MS Memory Limit: 131072K Total Submissions: 4123 Accepted: 1029 Ca ...
- pymysql-python爬虫数据存储准备
mongodb 和mysql 在使用哪个数据库 来存储数据上 小哥还是纠结了一下下. 很多爬虫教程都推荐mongodb 优势是速度快 因为我已经本机安装了一下 php开发环境,mysql是现成的, s ...
- UI交互设计关键词:情感化设计与心理
情感化设计,一定有一个关键词.情感,是指人对周围事物和自身以及对自己行为的态度,它是人对客观事物的一种特殊的反映形式,是主体对外界刺激给予肯定或否定的心理反应,也是对客观事物是否符合自己需要的态度或体 ...
- git学习笔记:常用命令总结
本文根据廖雪峰的博客,记录下自己的学习笔记.主要记录常用的命令,包括仓库初始化.添加文件.提交修改.新建分支.内容暂存.分支管理.标签管理等内容. git是分布式版本控制系统. 首先是安装,从官网下载 ...
- vue history模式 apache配置
我的服务器apache 版本是2.4.6 看文档上面说加那些代码,但是加上去重启服务器就不能重启,显示代码错误,然后百度查开启mod_rewrite这个重写URL 弄了半天也不会,百度上面的不知道是不 ...
- 移动端比较好用的滑动条 vue-slider-component
安装: npm install vue-slider-component <template> <div> <vue-slider v-model="value ...
- 《Linux就该这么学》第十五天课程
本次课所学习的是DNS域名解析服务! 下面提供一些DNS有关的内容 如需进一步学习,请前往https://www.linuxprobe.com/chapter-13.html 工作模式: 1.主服务器 ...
- 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)
传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...
- 走进JDK(十一)------LinkedHashMap
概述LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,LinkedHas ...
- 【转】在Linux下安装python3
原文链接:http://www.cnblogs.com/feng18/p/5854912.html 1.linux下安装python3 a. 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wg ...