Inicio » Programación » Reconocimiento de códigos de barras en tiempo real con OpenCV y PyZbar.

Reconocimiento de códigos de barras en tiempo real con OpenCV y PyZbar.

Siguiendo con la programación en Python, hoy os traigo un código muy sencillito que puede servir de base para otros proyectos más interesantes.

Simplemente es una muestra de cómo podemos aprovechar la potencia de OpenCV para tratar los vídeos frame a frame para poder aplicar a dichas imágenes individuales otras librerias y tratamientos.

Tal y como pone el título, el código es Python y utiliza un par de librerias: OpenCV para la captura del vídeo en tiempo real y PyZbar para la localización y decodificación de los códigos de barras encontrados.

El funcionamiento es sencillo. OpenCV separa cada uno de los frames de vídeo y se los va pasando a PyZbar. Dicha librería localiza en la imagen el código de barras almacenando las coordenadas del rectángulo que lo contiene así como el contenido y tipo de código localizado. Además es capaz de localizar más de uno simultáneamente.

Una vez tenemos los datos de dónde y qué contiene cada código de barras, simplemente aprovechando la posibilidad que nos da OpenCV de pintar sobre los propios frames de vídeo capturados incluimos la información para hacerla visible.

Aquí os dejo un vídeo demostrativo del proceso para que podáis echar un ojo a cómo funciona. Si preferís verlo en YouTube directamente podéis pulsar en el título del vídeo o directamente aquí.

Por último, os dejo por aquí también el código fuente para que le podáis echar un vistazo y modificarlo al gusto.

¡Un saludo!

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())

#PARA IMAGENES ESTATICAS
# 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)
#     cv2.putText(image, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
#     print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))
#
# cv2.imshow("Image", image)
# cv2.waitKey(0)

#PARA ARCHIVO DE VÍDEO
# cap = cv2.VideoCapture("video1.wmv")


#PARA VIDEO EN TIEMPO REAL
cap = cv2.VideoCapture(0)
#
if not cap.isOpened():
    print("Error")

while cap.isOpened():

    ret, frame = cap.read()
    if ret:

        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)
            print("[INFO] Found {} barcode: {}".format(barcodeType, barcodeData))

        cv2.imshow('Frame', frame)

        if cv2.waitKey(25) & 0xFF == ord('q'):
            break

    else:
        break

cap.release()
cv2.destroyAllWindows()

2 comentarios

  1. Cómo cargo la foto que quiero que el programa analice, porque me genera el error de main.py: error: the following arguments are required: -i/–codigo1.png

    • Buenos días, Juan.

      Para usarlo con imágenes, tienes que descomentar la parte de imágenes estáticas y comentar la parte de vídeo en tiempo real. Tal y como está el código ahora, es para vídeo. Luego con el parámetro -i o –image puedes pasarle la ruta a la imagen que quieres analizar (ruta completa). Si está en el mismo directorio puedes usar «./», si no la ruta completa.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.