diff --git "a/docs/04_SPEC/SPEC_02_\343\202\253\343\203\241\343\203\251\346\222\256\345\275\261\344\273\225\346\247\230\346\233\270.md" "b/docs/04_SPEC/SPEC_02_\343\202\253\343\203\241\343\203\251\346\222\256\345\275\261\344\273\225\346\247\230\346\233\270.md" index b7bfc1b..872b4b8 100644 --- "a/docs/04_SPEC/SPEC_02_\343\202\253\343\203\241\343\203\251\346\222\256\345\275\261\344\273\225\346\247\230\346\233\270.md" +++ "b/docs/04_SPEC/SPEC_02_\343\202\253\343\203\241\343\203\251\346\222\256\345\275\261\344\273\225\346\247\230\346\233\270.md" @@ -127,7 +127,7 @@ ### ファイル命名規則 -撮影 1 回で 3 ファイルを生成する(baseName は共通.重複時 `_1`, `_2` ...): +撮影 1 回で 3 ファイルを生成する(baseName は共通.重複時 `_1`, `_2` ...): | 種別 | ファイル名 | 概要 | | --- | --- | --- | @@ -159,8 +159,8 @@ - 一覧画面の詳細表示オーバーレイから削除を実行する - 削除前に確認ダイアログを表示する - - `.preview.jpg` の場合:「この画像を削除しますか?(DNG ファイルとメタデータも一緒に削除されます)」 - - `.png`(旧通常モード)の場合:「この画像を削除しますか?」 + - `.preview.jpg` の場合: 「この画像を削除しますか?(DNG ファイルとメタデータも一緒に削除されます)」 + - `.png`(旧通常モード)の場合: 「この画像を削除しますか?」 - `.preview.jpg` 削除時は同 baseName の `.dng` と `.meta.json` も**連動削除**する - ファイルシステムから物理削除する(ゴミ箱機能なし) - 削除後,MediaStore からも当該エントリを除去する diff --git "a/docs/04_SPEC/SPEC_04_\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274\345\220\221\343\201\215\343\201\250\343\202\257\343\203\255\343\203\203\343\203\227.md" "b/docs/04_SPEC/SPEC_04_\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274\345\220\221\343\201\215\343\201\250\343\202\257\343\203\255\343\203\203\343\203\227.md" index 52d0a66..af2bcdf 100644 --- "a/docs/04_SPEC/SPEC_04_\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274\345\220\221\343\201\215\343\201\250\343\202\257\343\203\255\343\203\203\343\203\227.md" +++ "b/docs/04_SPEC/SPEC_04_\343\203\227\343\203\254\343\203\223\343\203\245\343\203\274\345\220\221\343\201\215\343\201\250\343\202\257\343\203\255\343\203\203\343\203\227.md" @@ -7,12 +7,12 @@ - カメラ制御・撮影フロー・保存ファイルは [SPEC_02 カメラ撮影仕様書](SPEC_02_カメラ撮影仕様書.md) を参照 - 本書はプレビュー表示の向き・クロップについて SPEC_02「プレビュー表示」の記述を**詳細化・優先**する -> **重要:撮影画像(DNG)には影響しない.** 本書が扱う向き変換・クロップは +> **重要: 撮影画像(DNG)には影響しない.** 本書が扱う向き変換・クロップは > すべて**プレビュー表示のみ**の処理である.保存される DNG は別経路(Camera2)で取得する. --- -## 1. 背景:なぜ向き変換が必要か +## 1. 背景: なぜ向き変換が必要か スマホを**画面が下向き**になるようにアタッチメントへ載せて口元を撮影する運用のため, カメラの生プレビューをそのまま表示すると,撮影者から見て上下・左右が反転している. @@ -24,7 +24,7 @@ - 上部のアタッチメントラベル「SmTIAS 001」が**鏡像+上下反転**で写る(=向き変換が効いている証拠) - カラーチャートが画面右,位置合わせマーカーが四隅 -> **基準スクリーンショットについて:** 実機の基準画像は被写体(顔・口元)の +> **基準スクリーンショットについて:** 実機の基準画像は被写体(顔・口元)の > 個人情報を含むため Git にはコミットせず,`.gitignore` 除外の `local_reference/` > にローカル保管する.確認時はその画像と見比べる(§5). @@ -49,7 +49,7 @@ プレビューには **ライブ系(描画)** と **スナップショット系(保存中表示)** の2系統があり, **いずれも最終的に同じ `RegionCrop`(同じ `region`)でクロップ**して表示を一致させる. -``` +```text ┌─ ライブプレビュー系 (Flutter 描画) ───────────┐ │ AspectRatio(h/w で横→縦補正) │ 生カメラフレーム │ OrientedPreview(向き変換 = 180°回転) │ @@ -101,9 +101,9 @@ 向き変換・クロップに関わる変更を行ったら,**2段階**で確認する. -### 段階1:自動チェック(リファクタ前後で見た目が変わっていないか) +### 段階1: 自動チェック(リファクタ前後で見た目が変わっていないか) -``` +```bash flutter test test/widgets/preview_orientation_golden_test.dart ``` @@ -116,12 +116,12 @@ > その場合のみ `flutter test --update-goldens` で正解を更新し, > 更新後のゴールデン画像が意図通りかを目視確認してからコミットする. -### 段階2:実機での最終確認(向きが本当に正しいか) +### 段階2: 実機での最終確認(向きが本当に正しいか) - 実機で口元を撮影し,**画面全体のスクリーンショット**を撮る - ローカル保管の基準画像(`local_reference/` 配下,個人情報のため非コミット) と並べて目視で一致を確認する -- 確認観点: +- 確認観点: - 口元が中央に拡大表示されているか - 上部ラベル「SmTIAS 001」が鏡像+上下反転で写るか - カラーチャートが右,マーカーが四隅にあるか diff --git "a/docs/05_TECH/TECH_01_\345\256\232\351\207\217\343\203\242\343\203\274\343\203\211\350\250\255\350\250\210\343\201\256\347\265\214\347\267\257\343\201\250\345\220\210\346\204\217.md" "b/docs/05_TECH/TECH_01_\345\256\232\351\207\217\343\203\242\343\203\274\343\203\211\350\250\255\350\250\210\343\201\256\347\265\214\347\267\257\343\201\250\345\220\210\346\204\217.md" index 1f3ef58..a86562e 100644 --- "a/docs/05_TECH/TECH_01_\345\256\232\351\207\217\343\203\242\343\203\274\343\203\211\350\250\255\350\250\210\343\201\256\347\265\214\347\267\257\343\201\250\345\220\210\346\204\217.md" +++ "b/docs/05_TECH/TECH_01_\345\256\232\351\207\217\343\203\242\343\203\274\343\203\211\350\250\255\350\250\210\343\201\256\347\265\214\347\267\257\343\201\250\345\220\210\346\204\217.md" @@ -8,7 +8,7 @@ > 原文の往復書簡には SmTIAS-LightSim リポジトリ側のファイル(検証履歴 TEST_01/03,評価仕様 SPEC_03/04 など.**本リポジトリの SPEC_03 とは別物**)への参照が含まれるが,それらは SmTIAS-LightSim 側に残り本リポジトリには存在しない. -## 背景:なぜ定量モードが必要だったか +## 背景: なぜ定量モードが必要だったか SmTIAS-LightSim(Mitsuba 3 による光散乱シミュ)と実機撮影を定量比較する研究で,シミュ vs 実機の残差が縮まらなかった.原因は,SmTIAS-Capture の通常撮影(PNG)が **AE/AWB/NR/EDGE/TONEMAP すべて自動**で,同じシーンを撮っても値が揺らいでいたこと.つまり「比較対象の実機データ自体が定量的に不安定」だった. @@ -16,7 +16,7 @@ ## 実機能力(AQUOS sense3 / SH-02M フロントカメラ) -実機診断(`getCameraDiagnostics`)の結果,定量モードに必要な能力をすべて満たすことを確認: +実機診断(`getCameraDiagnostics`)の結果,定量モードに必要な能力をすべて満たすことを確認: | 項目 | 値 | |---|---| @@ -32,7 +32,7 @@ ## 確定した撮影設定(要点) -全パラメータは [SPEC_02 §撮影設定](../04_SPEC/SPEC_02_カメラ撮影仕様書.md) に記載.要点のみ: +全パラメータは [SPEC_02 §撮影設定](../04_SPEC/SPEC_02_カメラ撮影仕様書.md) に記載.要点のみ: - `CONTROL_MODE=OFF` で AE/AWB/AF/NR/EDGE をすべて OFF,TONEMAP は線形 - 露光 **1/120s**・ISO **40** 固定,`BLACK_LEVEL_LOCK=true` @@ -44,14 +44,14 @@ 定量モードの核心的な設計判断.観察と物理的整合性から **HIGH_QUALITY を本流で維持**することで合意した. -- 実装中の観察:`SHADING_MODE=OFF` だと LSC マップが**全要素 1.0**(Android 仕様)になり情報が取れない.`HIGH_QUALITY` だと ISP が LSC を適用し,**実ゲインマップ**が取得できる. -- 物理的整合性:SmTIAS-LightSim の Mitsuba **orthographic 出力**は平行光線サンプリングで cos⁴ falloff を持たず,**「ISP が完璧に LSC 補正できた場合の理想値」相当**.これと **HIGH_QUALITY DNG** を直接比較するのが物理的に最も整合する(残差=「実機 LSC 補正の不完全度+シミュ物理モデル誤差」=まさに評価したい本質). +- 実装中の観察: `SHADING_MODE=OFF` だと LSC マップが**全要素 1.0**(Android 仕様)になり情報が取れない.`HIGH_QUALITY` だと ISP が LSC を適用し,**実ゲインマップ**が取得できる. +- 物理的整合性: SmTIAS-LightSim の Mitsuba **orthographic 出力**は平行光線サンプリングで cos⁴ falloff を持たず,**「ISP が完璧に LSC 補正できた場合の理想値」相当**.これと **HIGH_QUALITY DNG** を直接比較するのが物理的に最も整合する(残差=「実機 LSC 補正の不完全度+シミュ物理モデル誤差」=まさに評価したい本質). - 逆に `OFF`(生 Bayer)を使うとシミュ側に物理 cos⁴ モデル(絞り径・口径食など)を足す必要があり,**自由度が増えて overfitting リスク**が上がる. -- 結論:**HIGH_QUALITY 維持.SmTIAS-Capture 側の実装変更は不要**.LSC マップは検証用に meta.json へ温存する. +- 結論: **HIGH_QUALITY 維持.SmTIAS-Capture 側の実装変更は不要**.LSC マップは検証用に meta.json へ温存する. ### 将来 SHADING_OFF を追加検証する条件(フォールバック C1–C3) -次のいずれかが起きたら「同一シーンを HQ と OFF で 1 セット撮影」する追加実装を検討する(現時点では未到達・実装不要): +次のいずれかが起きたら「同一シーンを HQ と OFF で 1 セット撮影」する追加実装を検討する(現時点では未到達・実装不要): - **C1**: シミュ vs HQ DNG の残差が再現的に大きい(CoV/勾配残差 1.5× 以上 + 形が物理的に説明不能) - **C2**: LSC マップが撮影ごとに大きく変動(中央値の変動 > 5%)→ ISP が AWB 連動で動的計算している証拠 @@ -59,16 +59,16 @@ ## 露光・ISO の目安(合意値) -10-bit DNG(黒レベル 64 除去後)で: +10-bit DNG(黒レベル 64 除去後)で: - 白板中央の **mean = 400〜600**(中央値約 500) -- 飽和回避:**p99 < 900**(除去後 836) +- 飽和回避: **p99 < 900**(除去後 836) → 確定値 **1/120s + ISO 40** で mean G ≈ 461・飽和率 0% を達成(基準測定値は PROGRESS.md 参照). ## 作業フェーズ分け(合意) -「再現性より先に,そもそもシミュと対応が取れるかを 1 ショットで確認する」二段階方式: +「再現性より先に,そもそもシミュと対応が取れるかを 1 ショットで確認する」二段階方式: - **フェーズ A(1 ショット対応検証)**: SmTIAS-Capture 側は ①画素統計を meta.json に追加 ②Hot pixel map 取得 ③白板 1 枚を試し撮りして adb pull 転送.SmTIAS 側が DNG/メタ読み込みを実装し 1 ショット突合 → 残差 2.1× がどう変化するか観察.**①②は実装済み**. - **フェーズ B(連射 V1 再現性)**: フェーズ A で対応の見通しが立った場合のみ着手.10 連射 UI(`*_burst{0..9}.dng`)+ 再現性検証(mean CoV < 1%).