Scanner de código QR usando Raspberry Pi e OpenCV
O código QR (código de resposta rápida) é um tipo de código de barras de matriz que contém informações sobre o item ao qual está anexado, como dados de localização, identificador ou rastreador que identifica um site ou aplicativo, etc. É uma óptica legível por máquina etiqueta que tem a forma de uma imagem 2D e tem um padrão diferente.
Neste tutorial, vamos construir um scanner de código QR baseado em Raspberry Pi usando a biblioteca OpenCV e ZBar. ZBar é a melhor biblioteca para detectar e decodificar os diferentes tipos de códigos de barras e códigos QR. O OpenCV é usado para capturar um novo quadro de um fluxo de vídeo e processá-lo.
Depois que o OpenCV captura um quadro, podemos passá-lo para uma biblioteca de decodificação de código de barras Python dedicada, como um ZBar, que decodifica o código de barras e o converte nas respectivas informações.
Raspberry Pi 3 (qualquer versão)
Módulo de câmera Pi
Antes de prosseguir com este scanner de código QR Raspberry Pi 3, primeiro, precisamos instalar o OpenCV, a biblioteca de decodificação de código de barras ZBar, imutils e algumas outras dependências neste projeto. OpenCV é usado aqui para processamento de imagem digital. As aplicações mais comuns de processamento digital de imagens são detecção de objetos, reconhecimento facial e contador de pessoas.
Aqui, a biblioteca OpenCV será usada para o scanner Raspberry Pi QR. Para instalar o OpenCV, primeiro atualize o Raspberry Pi.
sudo apt-get update
Em seguida, instale as dependências necessárias para instalar o OpenCV em seu Raspberry Pi.
sudo apt-get install libhdf5-dev -y
sudo apt-get install libhdf5-serial-dev –y
sudo apt-get install libatlas-base-dev –y
sudo apt-get install libjasper-dev -y
sudo apt-get install libqtgui4 –y
sudo apt-get install libqt4-test –y
sudo apt-get install libhdf5-dev -y
sudo apt-get install libhdf5-serial-dev –y
sudo apt-get install libatlas-base-dev –y
sudo apt-get install libjasper-dev -y
sudo apt-get install libqtgui4 –y
sudo apt-get install libqt4-test –y
Depois disso, instale o OpenCV no Raspberry Pi usando o comando abaixo.
pip3 install opencv-contrib-python==4.1.0.25
Anteriormente, usamos OpenCV com Raspberry pi e criamos muitos tutoriais sobre ele.
Instalando OpenCV no Raspberry Pi usando CMake
Reconhecimento facial em tempo real com Raspberry Pi e OpenCV
Reconhecimento de matrículas usando Raspberry Pi e OpenCV
Estimativa do tamanho da multidão usando OpenCV e Raspberry Pi
Também criamos uma série de tutoriais OpenCV começando no nível iniciante.
Instalando outros pacotes necessários
Instalando ZBar
Zbar é a melhor biblioteca para detectar e decodificar os diferentes tipos de códigos de barras e códigos QR. Use o comando abaixo para instalar a biblioteca:
pip3 install pyzbar
Instalando imutils
O imutils é usado para tornar as funções essenciais de processamento de imagem, como translação, rotação, redimensionamento, esqueletização e exibição de imagens Matplotlib mais fáceis com OpenCV. Use o comando abaixo para instalar os imutils:
pip3 install imutils
Instalando argparse
Use o comando abaixo para instalar a biblioteca argparse. argparse é responsável por analisar argumentos de linha de comando.
pip3 install argparse
Aqui, exigimos apenas a câmera Raspberry Pi e Pi para este scanner de código QR usando a câmera Raspberry Pi e você só precisa conectar o conector de fita da câmera no slot da câmera fornecido no Raspberry pi
A câmera Pi pode ser usada para construir vários projetos interessantes, como Câmera de Vigilância Raspberry Pi, Sistema de Monitoramento de Visitantes, Sistema de Segurança Doméstica, etc.
O código completo do leitor Raspberry Pi QR é fornecido no final da página. Antes de programarmos o Raspberry Pi, vamos entender o código.
Então, como de costume, inicie o código importando todos os pacotes necessários
from imutils.video import VideoStream
from pyzbar import pyzbar
import argparse
import datetime
import imutils
import time
import cv2
Em seguida, construa o analisador de argumentos e analise os argumentos. O argumento da linha de comando contém informações sobre o caminho do arquivo CSV. O arquivo CSV (Comma Separated Values) contém o carimbo de data / hora e a carga útil de cada código de barras de nosso stream de vídeo.
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())
Depois disso, inicialize o fluxo de vídeo e descomente a linha comentada se estiver usando uma webcam USB.
#vs = VideoStream(src=0).start()
vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)
Agora, dentro do loop, pegue um quadro do stream de vídeo e redimensione-o para 400 pixels. Depois de capturar o quadro, chame a função pyzbar.decode para detectar e decodificar o código QR.
frame = vs.read()
frame = imutils.resize(frame, width=400)
barcodes = pyzbar.decode(frame)
Agora, faça um loop sobre os códigos de barras detectados para extrair a localização do código de barras e desenhe a caixa delimitadora ao redor do código de barras na imagem.
for barcode in barcodes:
(x, y, w, h) = barcode.rect
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
Em seguida, decodifique o código de barras detectado em uma string "utf-8" usando a função decodificar ("utf-8") e extraia o tipo de código de barras usando a função barcode.type.
barcodeData = barcode.data.decode("utf-8")
barcodeType = barcode.type
Depois disso, salve os dados do código de barras extraídos e o tipo de código de barras dentro de uma variável chamada text e desenhe os dados e o tipo do código de barras na imagem.
text = "{} ({})".format(barcodeData, barcodeType)
cv2.putText(frame, text, (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
Agora exiba a saída com os dados do código de barras e o tipo de código de barras.
cv2.imshow("Barcode Reader", frame)
Agora, na última etapa, verifique se a tecla 's' foi pressionada, em seguida, quebre o loop principal e inicie o processo de limpeza.
key = cv2.waitKey(1) & 0xFF
# if the `s` key is pressed, break from the loop
if key == ord("s"):
break
print("[INFO] cleaning up...")
csv.close()
cv2.destroyAllWindows()
vs.stop()
Testando o scanner de código QR Raspberry Pi
Assim que a configuração estiver pronta, inicie o programa leitor de código QR. Você verá uma janela mostrando uma visualização ao vivo de sua câmera, agora você pode apresentar códigos de barras na frente da câmera PI. Quando pi decodifica um código de barras, ele desenha uma caixa vermelha ao redor dele com os dados do código de barras e o tipo de código de barras, conforme mostrado na imagem abaixo:
É assim que você pode construir facilmente um leitor de código QR da câmera Raspberry Pi usando apenas a placa Raspberry Pi e a câmera Pi ou câmera USB.
O código completo para este projeto é fornecido abaixo.
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())
#vs = VideoStream(src=0).start() #Uncomment this if you are using Webcam
vs = VideoStream(usePiCamera=True).start() # For Pi Camera
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)
print (text)
cv2.putText(frame, text, (x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
# if the barcode text is currently not in our CSV file, write
# the timestamp + barcode to disk and update the set
if barcodeData not in found:
csv.write("{},{}\n".format(datetime.datetime.now(),
barcodeData))
csv.flush()
found.add(barcodeData)
cv2.imshow("Barcode Reader", frame)
key = cv2.waitKey(1) & 0xFF
# if the `s` key is pressed, break from the loop
if key == ord("s"):
break
print("[INFO] cleaning up...")
csv.close()
cv2.destroyAllWindows()
vs.stop()