caso opencv 03: generación, descubrimiento, posicionamiento y reconocimiento de código bidimensional basado en OpenCV

1. Generación de código QR

No hay muchas tonterías, solo ve al código.

# 生成二维码
import qrcode

# 二维码包含的示例数据
data = "B0018"
# 生成的二维码图片名称
filename = "qrcode.png"
# 生成二维码
img = qrcode.make(data)
# 保存成图片输出
img.save(filename)

img.show()

resultado de ejecución:

generará una imagen en el momento actual
inserte la descripción de la imagen aquí

Reconocer el código QR generado

Opencv ha lanzado una interfaz de reconocimiento de código bidimensional desde la cuarta generación. El método de llamada es así, el código es el siguiente:

import cv2

img = cv2.imread('qrcode.png')
qrcode = cv2.QRCodeDetector()
result, points, code = qrcode.detectAndDecode(img)

print(result)

resultado de la operación:

B0018

Hay tres valores de retorno,

  • El primer resultado es el contenido decodificado, por ejemplo, el resultado de mi código QR es "B0018", por supuesto, también puede ser un número puro.

  • Los segundos puntos son las cuatro esquinas del contorno del código QR, en el sentido de las agujas del reloj desde la esquina superior izquierda.

  • El tercer código es la disposición original del código bidimensional, es decir, una matriz de si cada punto es 0 o 255. El blanco es 255 y el negro es 0. Es muy conveniente llamar, y si no lo hace necesita decodificar, puede llamarlo si solo desea ubicar. La función de detección devuelve solo cuatro puntos de esquina.

¿Qué pasa si se trata de un reconocimiento de código QR en una imagen grande? Por ejemplo, la imagen de abajo
inserte la descripción de la imagen aquí

Si continúa utilizando el código QR de identificación anterior, no será reconocido.

Echemos un vistazo al principio y al principio de posicionamiento del código bidimensional.

La estructura y principio básico del código QR.

La estructura del código QR estándar es la siguiente:

inserte la descripción de la imagen aquí
Se debe prestar especial atención a las tres áreas del cuadrado negro en la figura, que son las tres áreas más importantes que se utilizan para ubicar un código QR. Lo primero que debemos hacer al escanear y detectar un código QR es encontrar estas tres áreas. Si tras encontrar estas tres zonas, hemos descubierto con éxito un código QR, y podremos localizarlo e identificarlo.

Las descripciones de otras partes del código QR son las siguientes:

inserte la descripción de la imagen aquí
El área del cuadrado en las tres esquinas es de izquierda a derecha, y de arriba a abajo, la proporción de blanco y negro es 1:1:3:1:1.

inserte la descripción de la imagen aquí
No importa cómo cambie el ángulo, esta es la característica más importante: a través de esta función, podemos realizar la detección y posicionamiento del escaneo de códigos QR.

Además del paquete qrcode anterior que puede reconocer códigos QR, también existe un paquete pyzbar que también puede reconocer códigos QR. Comparado con el paquete pyzbar, es más eficiente que el paquete qrcode. el código de abajo

import cv2
import numpy as np
import time
import pyzbar.pyzbar as pyzbar

# 显示条码和二维码位置
def display(im, decodedObjects):
    # 遍历所有已解码的对象
    for decodedObject in decodedObjects:
        points = decodedObject.polygon

        # 如果点不形成四边形,请找到凸包
        if len(points) > 4:
            hull = cv2.convexHull(np.array([point for point in points], dtype=np.float32))
            hull = list(map(tuple, np.squeeze(hull)))
        else:
            hull = points;
        # 凸包中的点数
        n = len(hull)
        # 绘制凸包
        for j in range(0, n):
            cv2.line(im, hull[j], hull[(j + 1) % n], (255, 0, 0), 3)
# 创建一个 qrCodeDetector 对象
qrDecoder = cv2.QRCodeDetector()

# 检测和解码二维码
t = time.time()
inputImage = cv2.imread("66.jpg")

decodedObjects = pyzbar.decode(inputImage)
if len(decodedObjects):
    zbarData = decodedObjects[0].data
else:
    zbarData = ''


if zbarData:
    cv2.putText(inputImage, "result : {}".format(zbarData.decode()), (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1,
                (0, 255, 0), 2, cv2.LINE_AA)
else:
    cv2.putText(inputImage, "ZBAR : QR Code NOT Detected", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2,
                cv2.LINE_AA)

display(inputImage, decodedObjects)

print("Time Taken for Detect and Decode : {:.3f} seconds".format(time.time() - t))
cv2.imshow("Result", inputImage)
cv2.waitKey(0)
cv2.destroyAllWindows()





resultado de ejecución:

inserte la descripción de la imagen aquí

De los resultados, se puede ver que se puede ubicar la posición del código QR y el resultado del reconocimiento se muestra en la esquina superior izquierda.

Supongo que te gusta

Origin blog.csdn.net/hai411741962/article/details/132496222
Recomendado
Clasificación