ID-OCR / app.py
kerols77's picture
Update app.py
04945ca verified
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)