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

一维条码:

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

二维条码:

二维条码简称为二维码,常见的二维码为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. 设计模式学习心得<适配器 Adapter>

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...

  2. 初学html,任务2:写一个简单的登陆/注册界面

    先在body中把最基础的标签写出来 现在页面运行出来是这样的 就是一个没有任何样式的基础界面: 接下来我们为这些标签加上样式 首先还是让页面所有元素的padding和margin都设置为0, 清除浏览 ...

  3. linux RCU机制

    参考资料: https://www.cnblogs.com/qcloud1001/p/7755331.html https://www.cnblogs.com/chaozhu/p/6265740.ht ...

  4. C# 结构体和List<T>类型数据转Json数据保存和读取

    C#  结构体和List<T>类型数据转Json数据保存和读取 一.结构体转Json public struct FaceLibrary { public string face_name ...

  5. Java:编码与乱码问题

    一.为什么要编码? 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机的一个基本的存储单元----byte来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解. byte一个字节即8 ...

  6. Python Day 9

    阅读目录: 内容回顾 内存管理 ##内容回顾 #文件处理 #1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操 ...

  7. css摘要

    由于需要,今天花三个小时了解一下css,在此记录一些摘要: 参考w3school 1. 当同一个 HTML 元素被不止一个样式定义时,会使用哪个样式呢? 一般而言,所有的样式会根据下面的规则层叠于一个 ...

  8. redis学习-string常用命令

    keys * :查询所有的key值 set:为指定键设置对应的值 get:获取指定键的值 mset:一次传入多个键值对 mget:一次获取多个键的值 del:删除指定键 strlen:获取指定键值的长 ...

  9. Notes : <Hands-on ML with Sklearn & TF> Chapter 5

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  10. Python mayavi库及mayavi管线

    Mayavi库的基本元素Mayavi库中主要有两大部分功能 一类是用于处理图形可视化和图形操作的mlab模块 一类是操作管线对象窗口对象的apimlab包含 绘图函数:实现已有的数据进行可视化显示,可 ...