2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日々の開発をまとめるAdvent Calendar 2023

Day 24

手軽に実現!OpenCVとWebカメラでQRコードの位置を特定する方法

Last updated at Posted at 2023-12-29

本記事では、OpenCVを使用してWebカメラからQRコードの位置を特定します。
スクリーンショット 2023-12-30 134537.png

QRコードの生成に関しては以下の記事を参照してください。
QRコードの生成

必要なもの
Python: プログラミング言語として使用。
OpenCV: 画像処理を行うためのオープンソースライブラリ。

1: 環境設定

まず、Pythonがインストールされていることを確認してください。次に、OpenCVをインストールします。コマンドラインまたはターミナルで以下のコマンドを実行します。

pip install opencv-python

2: カメラからの映像取得

Webカメラから映像を取得するためのコードを書きます。OpenCVを使ってカメラにアクセスし、映像を取得し表示します。

import cv2

# カメラのキャプチャを開始
cap = cv2.VideoCapture(0)

while True:
    # フレームをキャプチャする
    ret, frame = cap.read()
    if not ret:
        break

    # フレームを表示する
    cv2.imshow('QR Code Scanner', frame)

    # 'q'を押して終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# キャプチャを解放
cap.release()
cv2.destroyAllWindows()

3: QRコードの検出と位置の特定

OpenCVには、QRコードを検出し、その位置を特定する機能が備わっています。以下のコードは、カメラのフレームごとにQRコードを検出し、その位置を四角で囲む方法を示しています。また、コマンドラインには検出したQRコードの座標を出力します。

import cv2

# QRコード検出器を初期化
qrCodeDetector = cv2.QRCodeDetector()

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # QRコードを検出し、その位置を取得
    decodedText, points, _ = qrCodeDetector.detectAndDecode(frame)

    if points is not None:
        points = points[0]

        # Debugging: Print the points to check their structure.
        print(f"Points: {points}")

        # Validate and draw lines around QR code
        if len(points) == 4 and all(len(point) == 2 for point in points):
            for i in range(len(points)):
                start_point = tuple(map(int, points[i]))
                end_point = tuple(map(int, points[(i + 1) % len(points)]))

                cv2.line(frame, start_point, end_point, (0, 255, 0), 3)
        else:
            print("Invalid points structure.")

        # デコードされたテキストを表示
        print(decodedText)

    cv2.imshow('QR Code Scanner', frame)

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

cap.release()
cv2.destroyAllWindows()

このコードは、Webカメラからの映像に対してリアルタイムでQRコードを検出し、その位置を四角で囲み、デコードされたテキストをコンソールに表示します。プログラムを終了するには、'q'キーを押してください。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?