Leitor de código de barras e QR Code com Raspberry

Domótica - MQTT e Raspberry - servidor NTP no Raspberry

Que tal sair do tradicional e inovar um pouco a leitura de código de barras e QR Code com Raspberry?

Já temos para smartphone os aplicativos para ambos, mas não lembro de ter visto leitura de código de barras sem a utilização de smartphone, a não ser com leitores laser. Fazê-lo com Raspberry dará um charme especial, além de propiciar a leitura de ambos, o QR Code e o código de barras. Vamos então?

Instalar o Zbar

O primeiro passo é instalar a biblioteca para leitura do códigos. Em Python, temos a Zbar, por exemplo.

sudo pip2 install pyzbar

Se estiver utilizando Python3, troque pip2 por pip3. Se ainda não tem o pip instalado, faça-o com apt.

sudo apt-get install python-pip

Precisaremos da imutils também.

sudo pip2 install imutils

Basicamente, utilizamos a biblioteca pyzbar, argparse e OpenCV para ler a imagem. Isso significa que podemos abrir tanto uma imagem como uma câmera ou uma webcam.

Script leitor de código de barras

Esse é um exemplo básico para ler de imagem:

from pyzbar import pyzbar
import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to input image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])

barcodes = pyzbar.decode(image)

for barcode in barcodes:
    (x, y, w, h) = barcode.rect
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)

    barcodeData = barcode.data.decode("utf-8")
    barcodeType = barcode.type

    text = "{} ({})".format(barcodeData, barcodeType)
        print(text)

cv2.imshow("Imagem", image)
cv2.waitKey(0)

Você pode fazer seus códigos de barras para teste nesse site. Se utilizar o formato Code128, poderá digitar caracteres alfanuméricos, se optar por exemplo pelo EAN128, aí só numérico. Se não conhece os padrões, dê uma lida a respeito nesse site.

Gerei um código de barras para ilustrar o uso desse script supracitado, resultando em:

leitor de código de barras

 Leitor de código de barras no Raspberry

O código anterior serve para qualquer plataforma. Já para o Raspberry especificamente, devemos instalar mais um pacote:

sudo pip2 install picamera

Se ainda não configurou o sistema para habilitar a câmera do Raspberry, execute o programa raspi-config e habilite-a, depois reinicie o sistema.

O código tem pouca diferença:

from imutils.video import VideoStream
from pyzbar import pyzbar
import argparse
import datetime
import imutils
import time
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, default="barcodes.csv",
    help="path to output CSV file containing barcodes")
args = vars(ap.parse_args())

print("[INFO] starting video stream...")
# vs = VideoStream(src=0).start()
vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)

csv = open(args["output"], "w")
found = set()

while True:
    frame = vs.read()
    frame = imutils.resize(frame, width=400)

    barcodes = pyzbar.decode(frame)

    for barcode in barcodes:
        (x, y, w, h) = barcode.rect
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)

        barcodeData = barcode.data.decode("utf-8")
        barcodeType = barcode.type

        text = "{} ({})".format(barcodeData, barcodeType)
        cv2.putText(frame, text, (x, y - 10),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

        if barcodeData not in found:
            csv.write("{},{}\n".format(datetime.datetime.now(),
                barcodeData))
            csv.flush()
            found.add(barcodeData)

    cv2.imshow("Barcode Scanner", frame)
    key = cv2.waitKey(1) & 0xFF
 
    if key == ord("q"):
        break

print("[INFO] cleaning up...")
csv.close()
cv2.destroyAllWindows()
vs.stop()

Artigos relacionados à câmera do Raspberry

Se quiser dar uma olhada, também tem outros artigos interessantes relacionados (à câmera, não ao código de barras ) e que considero interessantes, talvez seja interessante para você também:

Fazer streaming com a câmera do Raspberry.

Brincando com a câmera do Raspberry.

Servidor de câmera com Raspberry.

Referências

Essa biblioteca para leitura de QR Code e código de barras é conceituada, qualquer pesquisa no Google retornará montes de referências. Abrir a câmera com OpenCV e ler a imagem para repassar à biblioteca também pode ser feita de muitas maneiras, mas minhas recomendações de leitura (em inglês) são o pyimagesearch e learnopencv, que são as melhores referências que encontrei relacionados a visão computacional e inteligência artificial.

Esse artigo é simples, mas achei necessário justamente porque vi em um grupo de Raspberry alguém pedindo sugestão para leitores de código de barras. Eis.

Até a próxima!