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】 生成二维码 和 条形码
条形码 和 二维码 对比 一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准. 在水平和垂直方向的二维空间存储信息的条形码, 称为 ...
随机推荐
- docker_sd
docker exec --user jovyan -d jupyter nohup jupyter nbconvert --ExecutePreprocessor.timeout=-1 --Code ...
- [html]CSS中的margin、border、padding区别
图解CSS padding.margin.border属性W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层. ...
- UWP作业(二)A Mobile App
看到给出的十个技术主题,我第一反应就是,对于大部分社交软件来讲,运用到全部这些都并不是什么难题,倒不如谈谈我手机里现有的社交软件中,使用时间最短但(you)是(dian)最(bu)好(hao)奇(yo ...
- Nginx服务器中配置非80端口的端口转发方法详解
这篇文章主要介绍了Nginx服务器中配置非80端口的端口转发方法详解,文中使用到了Nginx中的proxy_pass配置项,需要的朋友可以参考下 nginx可以很方便的配置成反向代理服务器: 1 2 ...
- Linux下安装numpy
转自:https://blog.csdn.net/abc_321a/article/details/82056019 1.下载源码包 ,命令如下 wget http://jaist.dl.source ...
- 现网环境业务不影响,但是tomcat启动一直有error日志,ERROR org.apache.catalina.startup.ContextConfig- Unable to process Jar entry [module-info.class] from Jar [jar:file:/home/iufs/apache-tomcat/webapps/iufs/WEB-INF/lib/asm
完整的错误日志信息: 2019-03-19 15:30:42,021 [main] INFO org.apache.catalina.core.StandardEngine- Starting Ser ...
- Day03(黑客成长日记)------>元祖及列表的增减改查
#昨日作业解析: # s = 'sadagwa'# i = 0# while i < len(s):# s1 = s[i]# print(s1)# i += 1# while使用技巧,先找递增变 ...
- liunx_second_day
liunx-基本权限 1.文件和目录权限的区别 A.文件的权限:所有者,所属组,其他人 rwx,读,写,执行,没有权限就是- 第一组rwx:文件所有者的权限 第二组rwx:文件所属组的权限 第三组rw ...
- 逻辑回归 vs 决策树 vs 支持向量机(II)
原文地址: Logistic Regression vs Decision Trees vs SVM: Part II 在这篇文章,我们将讨论如何在逻辑回归.决策树和SVM之间做出最佳选择.其实 第一 ...
- pm2模块编写入门
PM2 模块 PM2模块是通过PM2来安装和管理,代码可以托管在NPM中.任何人都可以创建和发布一个PM2模块,可以是日志模块.http代理模块.负载均衡模块.DNS服务器模块或任何类型的实用程序. ...