import os import cv2 from paddleocr import PaddleOCR import re from flask import Flask, request, jsonify from PIL import Image import pandas as pd import requests from datetime import datetime import random app = Flask(__name__) app.config['UPLOAD_FOLDER'] = 'uploads/' os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) def convert_image_format(input_path, output_format='PNG'): try: image = Image.open(input_path) if hasattr(image, '_getexif'): exif = image._getexif() if exif and 0x112 in exif: orientation = exif[0x112] rotations = {3: 180, 6: 270, 8: 90} if orientation in rotations: image = image.rotate(rotations[orientation], expand=True) output_path = os.path.splitext(input_path)[0] + '.' + output_format.lower() image.convert("RGB").save(output_path, format=output_format) return output_path except Exception as e: return input_path def extract_text_with_paddleocr(file_path): ocr = PaddleOCR(use_angle_cls=True, lang='en', show_log=False) result = ocr.ocr(file_path, cls=True) return result def extract_numbers_from_paddleocr(result): detected_numbers = [] for line in result: for res in line: text = res[1][0] numbers = re.findall(r'\d+', text) if numbers: number_str = ''.join(numbers) detected_numbers.append(number_str) return detected_numbers def compare_numbers_with_excel(detected_numbers, excel_path='data/test.xlsx'): df = pd.read_excel(excel_path) matched_names = [] for number in detected_numbers: try: match = df[df['ID'] == int(number)] if not match.empty: name = match['Name'].values[0] matched_names.append({"ID": number, "name": name}) else: matched_names.append({"ID": number, "name": "The student is not in the database"}) except ValueError: pass return matched_names def send_attendance_to_external_api(student_id): url = 'http://54.242.19.19:3000/api/attendance' random_id = random.randint(10000, 99999) payload = { "id": str(random_id), "studentId": str(student_id), "status": "present", "date": datetime.now().strftime("%m/%d/%Y %I:%M:%S %p +00:00") } print(f"Sending payload: {payload}") try: response = requests.post(url, json=payload) try: return response.status_code, response.json() except ValueError: return response.status_code, {"error": "Response is not valid JSON", "raw_response": response.text} except Exception as e: print(f"Failed to send attendance for {student_id}: {e}") return 500, {"error": str(e)} @app.route('/detect_numbers', methods=['POST']) def detect_numbers(): if 'file' not in request.files: return jsonify({"error": "No file part"}), 400 file = request.files['file'] if file.filename == '': return jsonify({"error": "No selected file"}), 400 if file: filename = file.filename file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) try: file.save(file_path) file_path = convert_image_format(file_path, 'PNG') result = extract_text_with_paddleocr(file_path) detected_numbers = extract_numbers_from_paddleocr(result) if detected_numbers: matched_names = compare_numbers_with_excel(detected_numbers) for entry in matched_names: print(f"ID: {entry['ID']}, Name: {entry['name']}") if entry['name'] != "The student is not in the database": status_code, response = send_attendance_to_external_api(entry['ID']) print(f"External API response: {status_code} - {response}") return jsonify(matched_names) else: print("No numbers detected.") return jsonify({"message": "No numbers detected."}) except Exception as e: print(f"Error processing the image: {e}") return jsonify({"error": str(e)}), 500 if __name__ == "__main__": app.run(host='0.0.0.0', port=7860)