条码在生活中随处可见,其可分为三类:一维条码、二维条码、三维条码

一维条码:

我们平时习惯称为条形码。条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。

二维条码:

二维条码简称为二维码,常见的二维码为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相关库,可参考以下链接进行简单认识和库的安装

玩转Python图片处理(OpenCV-Python)

Python的GUI编程(TK)

三、系统环境准备

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)的更多相关文章

  1. 利用Python制作二维码

    利用简单的Python代码制作二维码 一.制作工具 安装Python环境 + PyCharm编译器. 二.电脑系统 本人win10 + Python3.7.0 + PyCharm. 三.写代码前先下载 ...

  2. 使用python制作二维码

    python-qrcode是个用来生成二维码图片的第三方模块,主要依赖的是 PIL 模块和 qrcode 库.(PIL模块只支持python2.7及以下版本,python3之后无法使用,官方推荐pyt ...

  3. python制作二维码

    1.安装MyQR    pip install MyQR  2.打开pycharm,新建项目文件 from MyQR import myqr 2.1黑白二维码 2.2,彩色动态二维码 3.当前项目本地 ...

  4. python实现二维码、条形码识别

    环境: python 3.7 Win7 依赖包安装: pip install pillow pip install opencv-python pip install opencv-contrib-p ...

  5. 有关python下二维码识别用法及识别率对比分析

    最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar .zbarlight.zxing. 1.三个模块的用法: #-*-coding=utf-8-*- import ...

  6. zbar+opencv检测图片中的二维码或条形码

    zbar本身自带检测二维码条形码功能,这里使用opencv只是做一些简单的读取图片,灰度图片以及显示条形码和二维码时用到一些绘制 // barcode-qrcodescanner.cpp: 定义控制台 ...

  7. 如何使用二维码进行表白-一键制作二维码,gif二维码制作

    " 如何使用二维码进行表白-一键制作二维码" 二维码在我们现在生活中随处可见,因为一次突发奇想,那我们可不可以制作一个自己的二维码呢!然后让女朋友去扫描一下----嘿嘿嘿--不行, ...

  8. GJM : Unity3D结合ZXING制作二维码识别

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. 【Demo】 生成二维码 和 条形码

    条形码 和 二维码 对比 一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准. 在水平和垂直方向的二维空间存储信息的条形码, 称为 ...

随机推荐

  1. Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again

    虚拟机恢复快照后,使用yum安装软件,提示下面的信息,开始以为是yum源的问题或者DNS的问题,但是无果,最后再看一下服务器的时间,坑了,还原快照,时间变成以前的了. [root@localhost ...

  2. python基础之Day24

    1.补充内置函数 2.反射 什么是? 通过字符串操作类或者对象的属性 hasattri(a,"b")  判断能否访问到a.b setattri(a,"b",c) ...

  3. 从信息论的角度分析DNN的工作原理

    在前面的文章里,使用神经网络的任意函数拟合性结合了一点黎曼几何的坐标系变化的知识,解释了神经网络是怎样根据输入x,计算出每个分类下的能量Ei(x)的,再之后使用能量模型推算出了概率,从而展示了理论上可 ...

  4. Filter笔记

    1.Filter [1] Filter简介 > Filter翻译为中文是过滤器的意思. > Filter是JavaWeb的三大web组件之一:Servlet.Filter.Listener ...

  5. Alpha冲刺四

    第四天    日期:2018/6/19 1.1 今日完成任务情况以及遇到的问题. 成员 汝春瑞.曹  阳 赵红波.梁玉龙 傅  康.丁炜轩 今日完成任务 设计餐厅每个店家的餐品界面 完成公告和失物招领 ...

  6. 招聘ETL开发工程师

    上班地点徐汇 本科以上学历 3年以上ETL开发经验熟悉Oracle数据库,精通PL  SQL开发与优化,熟悉Vertica或者GreenPlum库优先 熟悉数据库性能优化,有海量数据处理经验优先 自荐 ...

  7. 渗透测试的理论部分4——开放式Web应用程序安全项目

    开放式Web应用程序安全项目(Open Web Application Security Project OWASP) 定期退出Top 10 project(排名前十的安全隐患防守规则) 公开了编写安 ...

  8. (30)3 ways to make better decisions — by thinking like a computer

    https://www.ted.com/talks/tom_griffiths_3_ways_to_make_better_decisions_by_thinking_like_a_computer0 ...

  9. SpringCloud消息总线

    我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端 ...

  10. 海龟绘图turtle库之二级基础编程题

    一.画一个太极图 import turtle as t t.pensize(2)#设置笔画宽度 t.circle(100)#以100为半径的圆 t.circle(50, 180) t.circle(- ...