Skip to content

指定した矩形のみをテキスト認識する機能 - #481

Open
Freeesia with Copilot wants to merge 35 commits into
masterfrom
copilot/add-text-recognition-rectangle-feature
Open

指定した矩形のみをテキスト認識する機能#481
Freeesia with Copilot wants to merge 35 commits into
masterfrom
copilot/add-text-recognition-rectangle-feature

Conversation

Copilot AI commented Oct 12, 2025

Copy link
Copy Markdown
Contributor

概要

OCR対象範囲を矩形で登録し、矩形が1件以上ある場合は画像全体を認識せず、指定範囲内だけをOCRするようにします。

Fixes #286

挙動

  • OCR対象範囲が未設定の場合
    • 従来どおり画像全体をOCRします。
  • OCR対象範囲が1件以上ある場合
    • 指定範囲内だけをOCRします。
    • 指定範囲で文字を認識できなくても、画像全体のOCRへフォールバックしません。
    • リストの前方にある範囲ほど優先度を高く扱います。
    • 設定範囲同士が重なっていても、実際の認識結果が重ならないテキストは両方保持します。
    • 低優先度側の認識結果の面積に対する重なりが50%以上の場合、その低優先度側の結果を破棄します。
    • 範囲に設定したキーワードを翻訳コンテキストへ引き継ぎます。
  • 矩形選択UI
    • 対象ウィンドウに対して幅または高さが0.5%未満の選択は受け付けず、再選択できます。
    • 選択画面の小数DIPを切り捨てずに相対座標へ変換します。

主な変更

  • 共通の指定範囲認識処理を PriorityRectRecognizer に集約
  • 次のOCRモジュールへ指定範囲処理を適用
    • Windows Media OCR
    • Tesseract OCR
    • OneOCR
    • ChatGPT API
    • Gemini
  • 元画像からの切り出し、拡大、OCR、縮尺復元、切り出し位置の加算という座標変換順序へ統一
  • 小数の相対座標と交差する全ピクセルを含む整数範囲を切り出し、その同じ左上座標で認識結果を元画像座標へ復元
  • 矩形選択UIの基準サイズを小数DIPのまま相対座標へ変換
  • Windows Media OCR / Tesseract OCR / OneOCR が同じ縮尺復元処理を使うように統一
  • Tesseract OCR の文字結合閾値を拡大後の認識座標系へ統一
  • 対象ウィンドウ上でドラッグしてOCR範囲を選択するUIを追加
  • gong-wpf-dragdrop を使い、複数範囲をドラッグ&ドロップで並べ替え可能に変更
  • UI文字列を WindowTranslator.Properties.Resources から直接参照
  • 未翻訳のUI文字列が既存の CustomResourceManager により英語へフォールバックすることを実行時テストで確認
  • 未使用の PriorityRectDescription リソースを全言語から削除
  • 未承認の倍率・クロップ内部ガード、認識結果の二重保持、不要な公開補助API、無関係差分を削除

確認内容

  • dotnet test WindowTranslator.Tests/WindowTranslator.Tests.csproj --no-build --no-restore --runtime win-x64
    • 106件すべて成功
  • OCRプラグイン単体ビルド
    • Tesseract OCR: 成功(エラー0件)
    • OneOCR: 成功(エラー0件)
    • ChatGPT API: 成功(エラー0件)
    • Gemini: 成功(エラー0件)
  • スケール・回転・切り出し位置を組み合わせた座標変換を回帰テストで確認
  • 小数座標の切り出しサイズと復元オフセットが実際の整数ピクセル範囲に一致することを回帰テストで確認
  • 矩形選択UIの小数DIPを保持して相対座標へ変換することを回帰テストで確認
  • 画像外にはみ出す範囲が画像内へ切り詰められることを回帰テストで確認
  • 低優先度側の認識結果の重なりが50%未満なら保持し、50%以上なら破棄する境界を回帰テストで確認
  • 設定範囲は重なるが認識結果は重ならない場合を回帰テストで確認
  • 非日本語環境で未翻訳UI文字列が英語へフォールバックすることを回帰テストで確認
  • 指定範囲が空、重複、画像外、1ピクセル未満の場合の挙動をテストで確認

Copilot AI and others added 5 commits October 12, 2025 17:53
Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>
Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>
Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>
Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>
Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>
Copilot AI changed the title [WIP] Add functionality for prioritizing specific rectangles in OCR 特定の矩形を優先的にテキスト認識する機能の実装 (Implement Priority Rectangle OCR Feature) Oct 12, 2025
Copilot AI requested a review from Freeesia October 12, 2025 18:06
@Freeesia

Copy link
Copy Markdown
Owner

@copilot
フィルター処理ではなく、各OCRモジュール内に実装して。
矩形が指定されているときは、全体での認識は行わずに指定された矩形のみ認識して。

- Remove PriorityRectFilter approach
- Add PriorityRectUtility helper class
- Update WindowsMediaOcr, TesseractOcr, and OneOcr to handle priority rects internally
- When priority rects are specified, skip full-screen OCR and only recognize specified rectangles
- Each OCR module now has RecognizePriorityRectsAsync, RecognizeFullScreenAsync, and RecognizeRegionAsync methods

Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>

Copilot AI commented Oct 12, 2025

Copy link
Copy Markdown
Contributor Author

@copilot
フィルター処理ではなく、各OCRモジュール内に実装して。
矩形が指定されているときは、全体での認識は行わずに指定された矩形のみ認識�...

フィルター処理からOCRモジュール内実装に変更しました。

変更内容:

  • PriorityRectFilterを削除
  • WindowsMediaOcr、TesseractOcr、OneOcrの各モジュール内で優先矩形を処理
  • 優先矩形が指定されている場合は全体認識をスキップし、指定された矩形のみを認識

コミット: c7e...

Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>
@Freeesia

Copy link
Copy Markdown
Owner

@copilot
スケールを戻すタイミングがおかしいので、修正して。
スケール、回転、クロップのタイミングを適切に処理して。

- Crop from original bitmap first, then scale the cropped region
- This ensures coordinates are properly transformed from scaled crop space to original bitmap space
- Fixed for WindowsMediaOcr, TesseractOcr, and OneOcr
- Removed double-scaling issue where ToTextRect was applied incorrectly

Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>

Copilot AI commented Oct 26, 2025

Copy link
Copy Markdown
Contributor Author

@copilot
スケールを戻すタイミングがおかしいので、修正して。
スケール、回転、クロップのタイミングを適切に処理して。

スケール、回転、クロップのタイミングを修正しました。

修正内容:

  • 元の画像から矩形を切り出し → スケーリング → OCR の順序に変更
  • スケール済み座標を適切に元の画像座標系に変換
  • WindowsMediaOcr、TesseractOcr、OneOcr全てで修正

コミット: (最新コミット)

Freeesia and others added 6 commits January 3, 2026 15:25
…ture

# Conflicts:
#	WindowTranslator.Abstractions/Properties/Resources.resx
…carnival

# Conflicts:
#	Plugins/WindowTranslator.Plugin.OneOcrPlugin/OneOcr.cs
#	Plugins/WindowTranslator.Plugin.TesseractOCRPlugin/TesseractOcr.cs
#	WindowTranslator.Abstractions/BitmapUtility.cs
#	WindowTranslator.Abstractions/Modules/IOcrModule.cs
#	WindowTranslator.Abstractions/Properties/Resources.de.resx
#	WindowTranslator.Abstractions/Properties/Resources.en.resx
#	WindowTranslator.Abstractions/Properties/Resources.ko.resx
#	WindowTranslator.Abstractions/Properties/Resources.resx
#	WindowTranslator.Abstractions/Properties/Resources.vi.resx
#	WindowTranslator.Abstractions/Properties/Resources.zh-CN.resx
#	WindowTranslator.Abstractions/Properties/Resources.zh-TW.resx
#	WindowTranslator.Abstractions/WindowTranslator.Abstractions.csproj
#	WindowTranslator/Modules/Ocr/WindowsMediaOcr.cs
- 全画面OCRと優先矩形OCRを併用し、重なった結果は優先矩形を優先する共通処理
  PriorityRectRecognizer を追加して3つのOCRモジュールから利用するように統一
- 設定画面の優先矩形専用エディタ(追加/削除/上下移動/キーワード編集)を追加
- 矩形選択ウィンドウを対象ウィンドウのクライアント領域に重ねて表示するように変更
- 優先矩形の文字列リソースを全21言語へ展開し、未使用のキーを削除
- 座標計算のテストを追加し、機能に不要な仕様書ファイルを削除

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
- 全体の認識結果を破棄する判定を、優先矩形の「領域」ではなく
  優先矩形で実際に認識できた「文字」との重なりに変更。
  優先矩形で何も認識できなかった場合に領域内のテキストが消えないようにする
- 画像サイズを基準にした閾値が切り出し画像では小さくなり、
  優先矩形内の文字が誤って除外される問題を修正。
  認識処理に元の全体画像を渡し、全体画像を基準に閾値を計算するように変更
- 矩形選択ウィンドウの位置をキャプチャ画像と同じ範囲に合わせ、
  タイトルバーのあるウィンドウで選択位置がずれる問題を修正
- 1ピクセル未満に潰れた優先矩形で切り出しに失敗して翻訳が停止する問題を修正
- 優先矩形の認識処理のテストを追加

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Freeesia and others added 5 commits August 6, 2026 01:38
- 全体の認識では優先矩形の中と外の文字がひとつのブロックに結合されることがあり、
  個々の文字を基準に判定すると重なり割合が閾値を下回って破棄されず、
  優先矩形の結果と重複して表示されてしまうため、破棄の判定を矩形の領域基準に戻した。
  文字を認識できなかった矩形は優先領域として扱わないことで、
  その領域の全体の認識結果が消えないようにしている
- 設定画面が対象ウィンドウに重なっていても選択範囲が見えるように、
  矩形選択時に対象ウィンドウを前面に出すように変更
- 新規ファイルにUTF-8 BOMを付与(.editorconfigの設定に合わせる)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
優先矩形の境界をまたぐ文字は切り出し画像で途中で切れて認識できず、
全体の認識結果も優先矩形と重なるため破棄されて翻訳が出なくなる。
判定ロジックでは解決できないため、選択時の案内文で回避を促す。

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
WindowsMediaOcr・OneOcr・TesseractOcrには優先矩形(PriorityRectRecognizer)
が統合されていたが、LLMOcr(ChatGPT API)とGoogleAIOcr(Gemini)には統合
されておらず、これらのプラグインを使用している場合は優先矩形の設定が完全
に無視されていた。

「指定した矩形外もオーバーレイ表示されている。全く動作していない」という
報告を受けて、以下の実機検証を実施:

- PriorityRectRecognizerのマージ・重複除去ロジックを既存ユニットテストと
  実OCR APIで再検証(問題なし)
- 座標変換ロジック(RectangleSelectionWindowの相対座標変換、DPI
  Awareness)を実際にウィンドウをキャプチャして検証(誤差はごくわずかで
  問題なし)
- 実際にテキストを入力したウィンドウをキャプチャしてOCRを実行するE2E
  検証を実施し、優先矩形の内外でテキストが仕様通り扱われることを確認

これらの検証により、コアロジックと座標変換はIssue #286の仕様(全体OCRを
維持しつつ、被った場合のみ優先矩形を優先する)通りに正しく動作している
ことを確認した。一方で、IOcrModule実装を横断的に確認したところ、LLMOcr
とGoogleAIOcrには優先矩形の統合自体が漏れていることが判明した。これらの
プラグインを使用している場合、優先矩形を設定しても全体OCRの結果しか得ら
れず「全く動作していない」ように見える実装漏れがあったため、既存のOneOcr
・TesseractOcrと同じパターンでPriorityRectRecognizerを統合した。

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
指定した矩形のみをテキスト認識する機能
Comment thread WindowTranslator/Controls/PriorityRectResources.cs Outdated
Comment thread WindowTranslator/Controls/PriorityRectsEditor.xaml Outdated
Co-authored-by: Freeesia <9002657+Freeesia@users.noreply.github.com>
Copilot AI requested a review from Freeesia August 11, 2026 08:11
@Freeesia Freeesia changed the title 特定の矩形を優先的にテキスト認識する機能の実装 (Implement Priority Rectangle OCR Feature) 指定した矩形のみをテキスト認識する機能 Aug 11, 2026
@Freeesia
Freeesia marked this pull request as ready for review August 11, 2026 10:39
Comment thread WindowTranslator.Abstractions/PriorityRectRecognizer.cs Outdated
Comment thread WindowTranslator.Abstractions/Modules/IOcrModule.cs Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

指定した矩形のみをテキスト認識する機能の検討

2 participants