opencv case 03 - OpenCV に基づく 2 次元コードの生成、検出、位置決め、認識

1. QRコードの生成

あまりナンセンスではありません。コードにアクセスしてください

# 生成二维码
import qrcode

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

img.show()

実行結果:

現在の画像を生成します
ここに画像の説明を挿入

生成されたQRコードを認識する

Opencvは第4世代から二次元コード認識インターフェースを開始しましたが、その呼び出し方法は次のようになります。

import cv2

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

print(result)

操作結果:

B0018

戻り値は3つありますが、

  • 最初の結果はデコードされた内容です。たとえば、私の QR コードの結果は「B0018」です。もちろん、純粋な数字にすることもできます。

  • 2 番目の点は、QR コードの輪郭の左上隅から時計回りに、4 隅です。

  • 3番目のコードは2次元コードの本来の配列、つまり各点が0か255かの行列です。白は255、黒は0です。呼び出すと非常に便利です。デコードする必要があるため、位置を特定したいだけの場合に呼び出すことができます。 detect 関数は 4 つの隅の点のみを返します。

大きな画像での QR コード認識の場合はどうなるでしょうか? たとえば、下の写真
ここに画像の説明を挿入

上記識別用QRコードを使用し続けると認識されなくなります。

二次元コードの原理と位置決め原理を見てみよう

QRコードの構造と基本原理

標準的な QR コードの構造は次のとおりです。

ここに画像の説明を挿入
図の 3 つの黒い四角形の領域に特に注意を払う必要があります。これらは、QR コードを見つけるために使用される 3 つの最も重要な領域です。QR コードをスキャンして検出するときに最初に行う必要があるのは、これら 3 つの領域を見つけることです。これら 3 つの領域を見つけたら、QR コードの発見に成功し、それを見つけて識別できるようになります。

QR コードの他の部分の説明は次のとおりです。

ここに画像の説明を挿入
三隅の正方形の領域は左から右、上から下に向かって、白と黒の比率は 1:1:3:1:1 です。

ここに画像の説明を挿入
これが最大の特徴であり、角度が変わってもQRコード読み取りの検出と位置決めを実現します。

QR コードを認識できる上記の qrcode パッケージに加えて、QR コードを認識できる pyzbar パッケージもあります。pyzbar パッケージと比較すると、qrcode パッケージよりも効率的です。以下のコード

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





実行結果:

ここに画像の説明を挿入

この結果から、QRコードの位置が特定でき、左上隅に認識結果が表示されていることがわかります。

おすすめ

転載: blog.csdn.net/hai411741962/article/details/132496222