This commit is contained in:
Andreas Knuth 2024-11-29 23:00:45 +01:00
parent 4f1158c144
commit 711b9d543f
2 changed files with 46 additions and 40 deletions

View File

@ -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/<bildname>', 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/<bildid>', 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/<bildname>', methods=['DELETE'])
def delete_images_by_bildname(bildname):
@deck_bp.route('/api/decks/image/<bildid>', 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()

View File

@ -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