From ff2bb79a91461ae47b384b6c7cf6003898dd78b3 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 26 Feb 2026 18:10:34 +0100 Subject: [PATCH] fix(dewarp): change manual slider to percentage (0-200%) instead of raw multiplier The old -3.0 to +3.0 scale multiplied the full displacement map (up to ~79px) directly, causing extreme distortion at values >1. New slider: - 0% = no correction - 100% = auto-detected correction (default) - 200% = double correction - Step size: 5% Co-Authored-By: Claude Opus 4.6 --- .../ocr-pipeline/DewarpControls.tsx | 22 +++++++++---------- klausur-service/backend/cv_vocab_pipeline.py | 6 ++--- klausur-service/backend/ocr_pipeline_api.py | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/admin-lehrer/components/ocr-pipeline/DewarpControls.tsx b/admin-lehrer/components/ocr-pipeline/DewarpControls.tsx index 02c3c1e..b5c0308 100644 --- a/admin-lehrer/components/ocr-pipeline/DewarpControls.tsx +++ b/admin-lehrer/components/ocr-pipeline/DewarpControls.tsx @@ -29,7 +29,7 @@ export function DewarpControls({ onNext, isApplying, }: DewarpControlsProps) { - const [manualScale, setManualScale] = useState(0) + const [manualScale, setManualScale] = useState(100) const [gtFeedback, setGtFeedback] = useState<'correct' | 'incorrect' | null>(null) const [gtNotes, setGtNotes] = useState('') const [gtSaved, setGtSaved] = useState(false) @@ -94,22 +94,22 @@ export function DewarpControls({ {/* Manual scale slider */} {dewarpResult && (
-
Manuelle Staerke
+
Korrekturstaerke
- -3.0 + 0% setManualScale(parseFloat(e.target.value))} + onChange={(e) => setManualScale(parseInt(e.target.value))} className="flex-1 h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer dark:bg-gray-700 accent-teal-500" /> - +3.0 - {manualScale.toFixed(1)} + 200% + {manualScale}%

- 0 = keine Korrektur, positiv = nach rechts entzerren, negativ = nach links + 100% = automatisch erkannte Korrektur, 0% = keine, 200% = doppelt so stark

)} diff --git a/klausur-service/backend/cv_vocab_pipeline.py b/klausur-service/backend/cv_vocab_pipeline.py index 6b05018..d70f9ce 100644 --- a/klausur-service/backend/cv_vocab_pipeline.py +++ b/klausur-service/backend/cv_vocab_pipeline.py @@ -668,13 +668,13 @@ def dewarp_image_manual(img: np.ndarray, displacement_map: np.ndarray, Args: img: BGR image (deskewed, before dewarp). displacement_map: The displacement map from auto-dewarp. - scale: Manual scale factor (-3.0 to +3.0). + scale: Fraction of auto-detected correction (0.0 = none, 1.0 = auto, 2.0 = double). Returns: Corrected image. """ - scale = max(-3.0, min(3.0, scale)) - if abs(scale) < 0.01: + scale = max(0.0, min(2.0, scale)) + if scale < 0.01: return img return _apply_displacement_map(img, displacement_map, scale=scale) diff --git a/klausur-service/backend/ocr_pipeline_api.py b/klausur-service/backend/ocr_pipeline_api.py index 54eebac..07e57f4 100644 --- a/klausur-service/backend/ocr_pipeline_api.py +++ b/klausur-service/backend/ocr_pipeline_api.py @@ -400,9 +400,9 @@ async def manual_dewarp(session_id: str, req: ManualDewarpRequest): if deskewed_bgr is None: raise HTTPException(status_code=400, detail="Deskew must be completed before dewarp") - scale = max(-3.0, min(3.0, req.scale)) + scale = max(0.0, min(2.0, req.scale)) - if displacement_map is None or abs(scale) < 0.01: + if displacement_map is None or scale < 0.01: # No displacement map or zero scale — use deskewed as-is dewarped_bgr = deskewed_bgr else: