gray6666 发表于 2021-3-28 20:02:47

树莓派玩条形码

本帖最后由 gray6666 于 2021-4-1 12:56 编辑

一、项目来源
粤教版信息技术必修2 第三章 信息系统与外部连接的方式 P64条码技术;



测试环境
树莓派4B,CSI接口摄像头和USB摄像头均可 ;操作系统brust ,Thonny编辑器或python3
需要安装库
一维码生成库 pyBarcode
二维码生成库 qrcode
一、二维码读取库 pyzbar
实时读取摄像头库opencv(cv2)
图像处理库pillow
二、知识科普
    条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用。

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



二维条码:
      二维条码简称为二维码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。例如PDF417二维条形码。


三维条码(资料较少,暂无参考案例):
    三维条码具有更大的信息容量、相同的识别便易性和较好的安全性。三维码的主要特征在于利用色彩或灰度(或称黑密度)表示不同的数据并进行编码。

三、扫码设备扫码枪(用法十分简单,和键盘一样USB即插即用,打开记事本,随扫描随输入;设计原理较为复杂,普及度高,价格便宜)
    常见的平板式扫描枪一般由光源、光学透镜、扫描模组、模拟数字转换电路加塑料外壳构成。它利用光电元件将检测到的光信号转换成电信号,再将电信号通过模拟数字转换器转化为数字信号传输到计算机中处理。当扫描一副图像的时候,光源照射到图像上后反射光穿过透镜会聚到扫描模组上,由扫描模组把光信号转换成模拟数字信号(即电压,它与接受到的光的强度有关),同时指出那个像数的灰暗程度。这时候模拟-数字转换电路把模拟电压转换成数字讯号,传送到电脑。


这学期我又被调整到图书馆兼职,案例来自借书系统配置的扫码枪(扫码枪只能扫描一维码)
https://www.bilibili.com/video/BV1UK4y1T7u8

四、条形码生成方法

1.在线网页
一维码在线生成网址http://www.t-x-m.com/
二维码在线生成网址https://cli.im/
2.代码生成


一维码参考网站 https://pypi.org/project/pyBarcode/0.8b1/
安装库 pip3 install pybarcode
from barcode.writer import ImageWriter
from barcode.ean import EuropeanArticleNumber13
ean = EuropeanArticleNumber13("123456789012", writer=ImageWriter())
ean.save("/home/pi/image")
二维码参考网站 https://pypi.org/project/qrcode/
安装库 pip3 install qrcode
命令窗口运行
qr "www.dfrobot.com.cn" > test.png





五、python3读取实现代码
参考网址
https://pypi.org/project/pyzbar/
安装库命令
pip3 install pyzbar
pip3 install pillow
1.python3读取单张条形码图片代码(一二维码均可)
# coding=UTF-8
import pyzbar.pyzbar as pyzbar
from PIL import Image,ImageEnhance

<font color="#ff0000"><b>image = "/home/pi/two.png"#待识别图片位置和名称</b></font>

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(out)
2.python3摄像头试试读取条形码图片
参考网址
https://pypi.org/project/pyzbar/

安装库命令
pip3 install opencv-python
pip3 install pyzbar
pip3 install pillow
参考代码
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))

      # 参数(字体,默认大小)
      <b><font color="#ff0000">font = ImageFont.truetype('/home/pi/simkai.ttf', 35) #此处字体可替换成系统自带的,没有会报错</font></b>六、测试视频
https://www.bilibili.com/video/BV1Af4y1x7Qt/


















pATAq 发表于 2021-3-31 22:46:17

感谢葛老师的分享,图书馆工作怎么样,我以前觉得泡图书馆特舒服

gray6666 发表于 2021-4-1 13:03:06

pATAq 发表于 2021-3-31 22:46
感谢葛老师的分享,图书馆工作怎么样,我以前觉得泡图书馆特舒服

晒晒太阳,练练剑。

一壶清茶,一本书;

{:6_205:}
页: [1]
查看完整版本: 树莓派玩条形码