返回
使用 Python 和 OpenCV 優化 QR 碼掃描以實現無縫重定向
python
2024-03-13 23:26:44
优化 QR 码扫描儀以實現成功掃描後的重定向
問題陳述
在開發使用 OpenCV、Flask 和 Python 的 QR 碼掃描儀時,我遇到了一個問題。成功掃描和解碼 QR 碼後,影片會停止或暫停,但不會進行重定向。我希望避免使用 JavaScript,除非它是一個小腳本,有助於重定向。我曾嘗試在 HTML 中嵌入 JavaScript 函式,但沒有成功。它會回調到另一個端點,該端點會在成功讀取 QR 碼時使用 JSON 回應。當这种情况發生時,並没有錯誤,瀏覽器只是暫停。
解決方法
要解決這個問題,我們需要:
- 在 QR 碼成功解碼後,手動關閉視窗和相機。
- 將
DECODED_QR_CODE
全域變數更新為解碼的資料。 - 使用
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 碼