[RESOLVIDO] Ler QR Code usando Python

Fala pessoal, tudo bem?

Eu andei procurando como poderia fazer isso com Java, mas achei bem complicado então preferi buscar como fazia em Python, consegui juntar uns códigos aqui e ali e no final ficou um bem agradável, até melhor do que eu esperava.

Então agora consigo pegar o resultado do que eu li (QR CODE) e trabalhar tranquilo.

Segue o código:

Arquivo: webcam.py

import cv2

def show_webcam(mirror=False):
    cam = cv2.VideoCapture(0)
    while True:
        ret_val, img = cam.read()
        if mirror:
            img = cv2.flip(img, 1)
        cv2.imshow('Leitor', img)
        if cv2.waitKey(1) == 27:
            break  # esc to quit
    cv2.destroyAllWindows()


def main():
    show_webcam(mirror=True)


if __name__ == '__main__':
    main()

Arquivo: custom_qr.py

# Importando as libs
from imutils.video import VideoStream
from pyzbar import pyzbar
import argparse
import datetime
import imutils
import time
import cv2
import pygame

# Construir o analisador de argumentos e analisar os argumentos
ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, default="resultado.csv", help="caminho que será salvo o arquivo .CSV") # esse é o arquivo que vai ser salvo com os dados que foram lidos.
args = vars(ap.parse_args())

# Iniciar a stream (iniciar a webcam) e permitir que o sensor da câmera aqueça
print("[INFO] Iniciando o stream e o arquivo .CSV")
vs = VideoStream(src=0).start()
# vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)

# abra o arquivo CSV de saída para gravar e inicializar o conjunto de
# códigos de barras (qr code) encontrados até agora
csv = open(args["output"], "w")
found = set()

# loop sobre a stream
while True:
    # pega o quadro do fluxo de vídeo encadeado e redimensione-o para
    # conter uma largura máxima de 400 pixels
    frame = vs.read()
    frame = imutils.resize(frame, width=400)

    # encontrar os códigos de barras (qr code) no quadro e decodificar cada um dos códigos de barras
    barcodes = pyzbar.decode(frame)

    # loop sobre os códigos de barras detectados
    for barcode in barcodes:
        # extrair o local da caixa delimitadora do código de barras e desenhar
        # a caixa delimitadora que envolve o código de barras na imagem (nesse caso está verde)
        (x, y, w, h) = barcode.rect
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        # os dados do código de barras é um objeto de bytes por isso, se queremos desenhá-lo
        # na nossa imagem de saída, precisamos convertê-lo para uma string primeiro
        barcodeData = barcode.data.decode("utf-8")
        barcodeType = barcode.type

        # desenha os dados do código de barras e o tipo de código de barras na imagem
        text = "{}".format(barcodeData)
        cv2.putText(frame, '', (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        # eu não fiz a impressão do texto que contém os dados e etc... caso vc queira mostrar
        # basta trocar o '' por text, ficaria assim \/
        # text = "{} ({})".format(barcodeData, barcodeType)
        # cv2.putText(frame, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

        # se o texto do código de barras não estiver no nosso arquivo CSV, vai escrever
        # a data e a hora + código de barras no disco e atualizar os dados

        # eu não quis a data e a hora, caso vc queira, basta usar esse código abaixo \/
        # csv.write("{},{}\n".format(datetime.datetime.now(), barcodeData))

        if barcodeData not in found:
            # aqui é opcional, eu coloquei só pra avisar que o resultado foi guardado
            # o pygame é responsável por fazer um som tocar
            pygame.mixer.init()
            pygame.mixer.music.load('sucess.wav')
            pygame.mixer.music.play()
            # fim da musica

            csv.write("{}\n".format(barcodeData))
            csv.flush()

            found.clear()
            found.add(barcodeData)

    # Título do Frame
    cv2.imshow("Registro de Ponto", frame)
    key = cv2.waitKey(1) & 0xFF

    # se a tecla `q` foi pressionada, vai interromper o loop e fechar a janela
    if key == ord("q"):
        break

# fecha o arquivo CSV
print("[INFO] Finalizando a stream e fechando o arquivo CSV...")
csv.close()
cv2.destroyAllWindows()
vs.stop()
1 curtida

Teste de execução:

Arquivo salvo:

image

1 curtida

Legal.

Outra biblioteca que tem bindings pra várias linguagens, inclusive Java é Zebra Crossing (zxing).

Sim!! Inclusive com o zxing eu não consegui fazer a leitura em tempo real, apenas quando o QR Code é gerado e fica todo ‘bonitinho’. Mas pra gerar, eu uso o zxing mesmo.

Olá abner, eu estava tentando fazer isso em meu Pycharm, sou novo em programação gostaria de perguntar se funciona normal, porque não estou conseguindo importar a biblioteca cv2, tem alguma dica?

Fala Lucas, Tudo ceto? Cara, faz um tempinho (tempão) que nao mexo com pyhon, nem com esse projeto… Nao sei como está a funcionalide.

Ao inves de importar a CV2, importe a opencv-python.

  • CTRL+ALT+S (vai abrir uma janela)
  • Project: *Nome do Projeto
  • Clique em Python Interpreter.
  • Aperte no teclado: ALT+Insert
  • Procure por opencv-python
    Clique em instalar e pronto!

Opa boa tarde abner, eu tentei fazer as mudanças e mesmo assim não foi, o que eu consegui fazer foi usar a biblioteca cv no lugar da cv2 ou da opencv-python e funcionou, só tenho um pequeno problema que quando eu escaneio QR Code ele não gera o link proporcionado por ele, tem resolução? Ele cria o arquivo o Excel mas nele não mostra nada

Puts, preciso dar uma olhadinha nele depois pra te dar um retorno