カメラスキャンは3層に責務分離する — ライブ検出は誘導専用、精度は静止画1回抽出、保証はユーザー補正
画像処理
設計判断
UX
判断
原則
カメラで対象(書類・カード等)を検出して切り出すスキャン機能は、リアルタイム検出器の精度を上げ続けるのではなく、責務を3層に分離すると全体が頑健になる。
- ライブ層(誘導専用): プレビュー上の枠表示は「だいたい合っていればよい」ガイダンスに限定する。低解像度・低頻度で動かし、座標は時間平滑化する。検出成否を撮影操作の可否(シャッターの有効/無効)に結びつけない。
- 抽出層(静止画1回): 精密な四隅抽出は、撮影されたフル解像度の静止画に対して1回だけ実行する。毎フレームのリアルタイム制約が外れるため、重い処理や高解像度入力を使える。複数対象の分割もここで行う。
- 保証層(ユーザー補正): 確認画面で四隅をドラッグ編集できるようにし、検出の最終保証を自動処理でなくユーザーに置く。これにより検出精度の要求が「常に正しい」から「だいたい合っていて手直しが楽」へ下がる。
併せて、切り出しは非破壊にする: 元静止画と四隅座標を保持し、切り出し画像は派生物として編集確定時に再生成する。撮影時に切り出しだけ残して元画像を捨てると、検出ミスがデータ破壊になり保証層が機能しない。
判断基準
- リアルタイム検出が撮影可否のハードゲートになっている場合、検出できない対象は撮影自体が不可能になり、検出精度が体験全体の単一障害点になる。この構造を見つけたら検出器の改善より先に責務分離を行う。
- 難条件(低コントラスト・テクスチャ背景・対象内部の強い模様)での検出失敗は必ず残るため、失敗を前提にした回復経路(ユーザー補正)を設けるほうが、検出器の改善を積むより費用対効果が高い。
- 市販のスキャナ系アプリが概ねこの構造(誘導枠+撮影後補正)を採るのは、リアルタイム側の精度保証が原理的に難しいため。
落とし穴
- ライブ層の検出結果をそのまま切り出しに流用すると、低解像度・平滑化済みの矩形で高解像度画像を切ることになり品質が落ちる。抽出層は静止画から独立して検出し直す。