From 711b9d543f61508229b767c175fc9170be85de9b Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Fri, 29 Nov 2024 23:00:45 +0100 Subject: [PATCH] Umbau --- deck_endpoints.py | 80 +++++++++++++++++++++++++---------------------- ocr_server3.py | 6 ++-- 2 files changed, 46 insertions(+), 40 deletions(-) diff --git a/deck_endpoints.py b/deck_endpoints.py index fa10c07..9178260 100644 --- a/deck_endpoints.py +++ b/deck_endpoints.py @@ -28,6 +28,7 @@ def init_db(): id INTEGER PRIMARY KEY AUTOINCREMENT, deckname TEXT NOT NULL, bildname TEXT, + bildid TEXT, iconindex INTEGER, x1 REAL, x2 REAL, @@ -40,7 +41,7 @@ def init_db(): def clean_debug_directories(): """ - Löscht alle Verzeichnisse unter 'debug_images', die keinen Eintrag in der Deck-Tabelle mit bildname haben. + Löscht alle Verzeichnisse unter 'debug_images', die keinen Eintrag in der Deck-Tabelle mit bildname oder bildid haben. """ debug_base_dir = 'debug_images' if not os.path.exists(debug_base_dir): @@ -50,18 +51,22 @@ def clean_debug_directories(): try: conn = get_db_connection() cursor = conn.cursor() + # Sammle alle bildname und bildid, die in der Deck-Tabelle vorhanden sind cursor.execute('SELECT DISTINCT bildname FROM Deck WHERE bildname IS NOT NULL') bildnames = {row['bildname'] for row in cursor.fetchall()} + + cursor.execute('SELECT DISTINCT bildid FROM Deck WHERE bildid IS NOT NULL') + bildids = {row['bildid'] for row in cursor.fetchall()} conn.close() except sqlite3.Error as e: - logger.error(f"Fehler beim Abrufen der bildname aus der Datenbank: {e}") + logger.error(f"Fehler beim Abrufen der bildname und bildid aus der Datenbank: {e}") return # Durchlaufe alle Verzeichnisse unter 'debug_images' for dir_name in os.listdir(debug_base_dir): dir_path = os.path.join(debug_base_dir, dir_name) if os.path.isdir(dir_path): - if dir_name not in bildnames: + if dir_name not in bildnames and dir_name not in bildids: try: shutil.rmtree(dir_path) logger.info(f"Nicht verwendetes Debug-Verzeichnis gelöscht: {dir_path}") @@ -117,9 +122,10 @@ def get_decks(): 'name': deckname, 'images': [] } - if entry['bildname']: + if entry['bildname'] and entry['bildid']: image = { 'name': entry['bildname'], + 'id': entry['bildid'], 'iconindex': entry['iconindex'], 'x1': entry['x1'], 'x2': entry['x2'], @@ -164,12 +170,13 @@ def update_image(): return jsonify({'error': 'No data provided'}), 400 # Überprüfen, ob die erforderlichen Felder vorhanden sind - required_fields = ['deckname', 'image', 'boxes'] + required_fields = ['deckname', 'bildname', 'bildid', 'boxes'] if not all(field in data for field in required_fields): return jsonify({'error': 'Missing fields in data'}), 400 deckname = data['deckname'] - bildname = data['image'] + bildname = data['bildname'] + bildid = data['bildid'] boxes = data['boxes'] # Überprüfen, ob 'boxes' eine Liste ist und mindestens ein Box-Element enthält @@ -210,9 +217,9 @@ def update_image(): iconindex = index cursor.execute(''' - INSERT INTO Deck (deckname, bildname, iconindex, x1, x2, y1, y2) - VALUES (?, ?, ?, ?, ?, ?, ?) - ''', (deckname, bildname, iconindex, x1, x2, y1, y2)) + INSERT INTO Deck (deckname, bildname, bildid, iconindex, x1, x2, y1, y2) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + ''', (deckname, bildname, bildid, iconindex, x1, x2, y1, y2)) inserted_image_ids.append(cursor.lastrowid) conn.commit() @@ -226,27 +233,27 @@ def update_image(): finally: conn.close() -@deck_bp.route('/api/decks/image/', methods=['GET']) -def get_images_by_bildname(bildname): - conn = get_db_connection() - cursor = conn.cursor() - images = cursor.execute('SELECT * FROM Deck WHERE bildname = ?', (bildname,)).fetchall() - conn.close() - image_list = [dict(image) for image in images] - return jsonify(image_list) +# @deck_bp.route('/api/decks/image/', methods=['GET']) +# def get_images_by_bildid(bildid): +# conn = get_db_connection() +# cursor = conn.cursor() +# images = cursor.execute('SELECT * FROM Deck WHERE bildid = ?', (bildid,)).fetchall() +# conn.close() +# image_list = [dict(image) for image in images] +# return jsonify(image_list) -@deck_bp.route('/api/decks/image/', methods=['DELETE']) -def delete_images_by_bildname(bildname): +@deck_bp.route('/api/decks/image/', methods=['DELETE']) +def delete_images_by_bildid(bildid): """ - Löscht alle Einträge in der Deck-Tabelle für den gegebenen bildname. - Falls es das letzte Image für ein Deck ist, wird ein neuer Deck-Eintrag erstellt. + Löscht alle Einträge in der Deck-Tabelle für die gegebene bildid. + Falls es das letzte Image für dieses Deck ist, wird ein neuer Deck-Eintrag erstellt. Optional: Löscht das zugehörige Debug-Verzeichnis, wenn keine weiteren Einträge bestehen. """ try: - # Sicherheitsmaßnahme: Nur erlaubte Zeichen im bildname - if not all(c.isalnum() or c in ('_', '-') for c in bildname): - logger.warning(f"Ungültiger bildname angefordert: {bildname}") - return jsonify({'error': 'Invalid image name'}), 400 + # Sicherheitsmaßnahme: Nur erlaubte Zeichen in bildid + if not all(c.isalnum() or c in ('_', '-') for c in bildid): + logger.warning(f"Ungültige bildid angefordert: {bildid}") + return jsonify({'error': 'Invalid image ID'}), 400 conn = get_db_connection() cursor = conn.cursor() @@ -255,27 +262,27 @@ def delete_images_by_bildname(bildname): conn.execute('BEGIN') # Schritt 1: Identifizieren der betroffenen Decks - cursor.execute('SELECT DISTINCT deckname FROM Deck WHERE bildname = ?', (bildname,)) + cursor.execute('SELECT DISTINCT deckname FROM Deck WHERE bildid = ?', (bildid,)) affected_decks = {row['deckname'] for row in cursor.fetchall()} if not affected_decks: conn.close() - return jsonify({'error': 'No entries found for the given image name'}), 404 + return jsonify({'error': 'No entries found for the given image ID'}), 404 # Schritt 2: Löschen der Image-Einträge - cursor.execute('DELETE FROM Deck WHERE bildname = ?', (bildname,)) - logger.info(f"Alle Einträge für bildname '{bildname}' wurden gelöscht.") + cursor.execute('DELETE FROM Deck WHERE bildid = ?', (bildid,)) + logger.info(f"Alle Einträge für bildid '{bildid}' wurden gelöscht.") # Schritt 3: Überprüfen und Wiederherstellen der Deck-Einträge for deckname in affected_decks: # Überprüfen, ob noch andere Image-Einträge für dieses Deck existieren - cursor.execute('SELECT COUNT(*) as count FROM Deck WHERE deckname = ? AND bildname IS NOT NULL', (deckname,)) + cursor.execute('SELECT COUNT(*) as count FROM Deck WHERE deckname = ? AND bildid IS NOT NULL', (deckname,)) result = cursor.fetchone() image_count = result['count'] if result else 0 if image_count == 0: - # Überprüfen, ob bereits ein Deck-Eintrag existiert - cursor.execute('SELECT COUNT(*) as count FROM Deck WHERE deckname = ? AND bildname IS NULL', (deckname,)) + # Überprüfen, ob bereits ein Deck-Eintrag existiert (ohne bildid) + cursor.execute('SELECT COUNT(*) as count FROM Deck WHERE deckname = ? AND bildid IS NULL', (deckname,)) deck_entry = cursor.fetchone() if deck_entry['count'] == 0: # Ein neuer Deck-Eintrag wird erstellt @@ -286,7 +293,7 @@ def delete_images_by_bildname(bildname): conn.commit() # Schritt 4: Optionales Löschen des Debug-Verzeichnisses - debug_dir = os.path.join('debug_images', bildname) + debug_dir = os.path.join('debug_images', bildid) if os.path.exists(debug_dir): try: shutil.rmtree(debug_dir) @@ -300,24 +307,23 @@ def delete_images_by_bildname(bildname): 'details': str(e) }), 200 - return jsonify({'status': 'success', 'message': f'All entries for image "{bildname}" have been deleted.'}), 200 + return jsonify({'status': 'success', 'message': f'All entries for image ID "{bildid}" have been deleted.'}), 200 except sqlite3.Error as e: # Rollback der Transaktion bei einem Datenbankfehler conn.rollback() - logger.error(f"Datenbankfehler beim Löschen der Image-Einträge für '{bildname}': {e}") + logger.error(f"Datenbankfehler beim Löschen der Image-Einträge für '{bildid}': {e}") return jsonify({'error': 'Database error', 'details': str(e)}), 500 except Exception as e: # Rollback der Transaktion bei einem unerwarteten Fehler conn.rollback() - logger.error(f"Unerwarteter Fehler beim Löschen der Image-Einträge für '{bildname}': {e}") + logger.error(f"Unerwarteter Fehler beim Löschen der Image-Einträge für '{bildid}': {e}") return jsonify({'error': 'Failed to delete image entries', 'details': str(e)}), 500 finally: conn.close() - # Sicherstellen, dass die Datenbank existiert if not os.path.exists(DATABASE): init_db() diff --git a/ocr_server3.py b/ocr_server3.py index d29ae6b..184093a 100644 --- a/ocr_server3.py +++ b/ocr_server3.py @@ -52,16 +52,16 @@ def preprocess_image(image, debug_dir): clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) enhanced = clahe.apply(gray) denoised = cv2.fastNlMeansDenoising(enhanced) - _, binary = cv2.threshold(denoised, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) + # _, binary = cv2.threshold(denoised, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # Speichern der Zwischenergebnisse im spezifischen Verzeichnis cv2.imwrite(os.path.join(debug_dir, 'gray.png'), gray) cv2.imwrite(os.path.join(debug_dir, 'enhanced.png'), enhanced) cv2.imwrite(os.path.join(debug_dir, 'denoised.png'), denoised) - cv2.imwrite(os.path.join(debug_dir, 'binary.png'), binary) + # cv2.imwrite(os.path.join(debug_dir, 'binary.png'), binary) logger.info(f"Debug images saved in: {debug_dir}") - return binary + return denoised except Exception as e: logger.error(f"Preprocessing error: {str(e)}") raise