|
from flask import Flask, request, jsonify |
|
from flask_cors import CORS |
|
import cv2 |
|
import numpy as np |
|
|
|
app = Flask(__name__) |
|
CORS(app) |
|
|
|
qr_detector = cv2.QRCodeDetector() |
|
prev_timer_roi = None |
|
CHANGE_THRESHOLD = 500 |
|
|
|
@app.route('/') |
|
def home(): |
|
return jsonify({"message": "Timer-aware QR Scanner API is running"}), 200 |
|
|
|
def is_timer_running(current_roi): |
|
global prev_timer_roi |
|
if prev_timer_roi is None: |
|
prev_timer_roi = current_roi |
|
return False |
|
|
|
diff = cv2.absdiff(prev_timer_roi, current_roi) |
|
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) |
|
_, thresh = cv2.threshold(gray, 25, 255, cv2.THRESH_BINARY) |
|
changed_pixels = cv2.countNonZero(thresh) |
|
prev_timer_roi = current_roi |
|
return changed_pixels > CHANGE_THRESHOLD |
|
|
|
@app.route('/scan', methods=['POST']) |
|
def scan_qr_if_timer_active(): |
|
if 'image' not in request.files: |
|
return jsonify({'error': 'No image uploaded'}), 400 |
|
|
|
file = request.files['image'] |
|
img_bytes = file.read() |
|
npimg = np.frombuffer(img_bytes, np.uint8) |
|
frame = cv2.imdecode(npimg, cv2.IMREAD_COLOR) |
|
|
|
|
|
timer_roi = frame[130:160, 360:430] |
|
|
|
if is_timer_running(timer_roi): |
|
data, points, _ = qr_detector.detectAndDecode(frame) |
|
if data: |
|
return jsonify({'qr_data': data}), 200 |
|
else: |
|
return jsonify({'message': 'QR code not detected'}), 204 |
|
else: |
|
return jsonify({'message': 'Timer not running'}), 204 |
|
|
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=7860) |
|
|