返回

使用 Python 和 OpenCV 優化 QR 碼掃描以實現無縫重定向

python

优化 QR 码扫描儀以實現成功掃描後的重定向

問題陳述

在開發使用 OpenCV、Flask 和 Python 的 QR 碼掃描儀時,我遇到了一個問題。成功掃描和解碼 QR 碼後,影片會停止或暫停,但不會進行重定向。我希望避免使用 JavaScript,除非它是一個小腳本,有助於重定向。我曾嘗試在 HTML 中嵌入 JavaScript 函式,但沒有成功。它會回調到另一個端點,該端點會在成功讀取 QR 碼時使用 JSON 回應。當这种情况發生時,並没有錯誤,瀏覽器只是暫停。

解決方法

要解決這個問題,我們需要:

  1. 在 QR 碼成功解碼後,手動關閉視窗和相機。
  2. DECODED_QR_CODE 全域變數更新為解碼的資料。
  3. 使用 redirect() 方法重定向到首頁。

改進後的程式碼

import cv2
from flask import Flask, render_template, redirect, Response
from pyzbar.pyzbar import decode

app = Flask(__name__, template_folder='templates')

DECODED_QR_CODE = "PLACEHOLDER"

@app.route('/')
def index():
    global DECODED_QR_CODE
    return f"""<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
    </head>
    <body>
        <h1>{ DECODED_QR_CODE }</h1>
        <a href="/scanner">
        <button type="button">Go to QR Code Scanner</button>
        </a>
    </body>
    </html>"""

@app.route('/scanner')
def second():
    return render_template('scan.html')

@app.route('/video_feed')
def video_feed():
    return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

def gen_frames():
    camera = cv2.VideoCapture(0)  # Use 0 for the default camera
    global DECODED_QR_CODE
    while True:
        success, frame = camera.read()  # Read the camera frame
        if not success:
            break
        else:
            # Detect and decode QR codes in the frame
            decoded_objects = decode(frame)
            for obj in decoded_objects:
                # Print decoded data
                print(obj.data.decode('utf-8'))
                # if valid QR code detected, redirect to the index page
                if obj.data.decode('utf-8'):
                    DECODED_QR_CODE = obj.data.decode('utf-8')
                    cv2.destroyAllWindows()
                    camera.release()
                    return redirect("/")
                
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  # Concat frame one by one and show result

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True)

結論

透過關閉視窗、相機並使用 redirect() 方法,我們成功解決了在成功掃描 QR 碼後重定向的問題。這個增強功能提供了更好的使用者體驗,並允許我們從掃描器介面無縫返回首頁。

常見問題解答

1. 我可以在沒有 JavaScript 的情況下進行重定向嗎?

是的,如上所述,你可以使用 Python 的 redirect() 方法在沒有 JavaScript 的情況下進行重定向。

2. 如何偵測 QR 碼?

你可以使用像 OpenCV 這樣的庫來偵測 QR 碼。

3. 我可以在重定向後傳遞資料嗎?

是的,你可以使用查詢字串或表單資料在重定向後傳遞資料。

4. 如何在 QR 碼中編碼資料?

你可以使用像 pyqrcode 這樣的庫來在 QR 碼中編碼資料。

5. QR 碼掃描儀還有哪些其他功能?

QR 碼掃描儀可以具有各種功能,例如:

  • 儲存掃描過的 QR 碼的歷史記錄
  • 提供掃描過的 QR 碼的額外資訊,例如位置或網址
  • 允許使用者建立自訂 QR 碼