# 実施計画 - 画像類似度検索ツール (C++) 設定されたディレクトリ内の画像から、pHash および dHash アルゴリズムを用いて類似した画像を検索・提示する高性能な Windows アプリケーション。 ## ユーザー確認事項 > [!IMPORTANT] > **GUI フレームワークの選択**: ユーザーインターフェースには **Qt 6** を採用します。これにより、Windows だけでなく **Linux でも動作するマルチプラットフォーム対応** が可能になります。 > [!TIP] > **複数ディレクトリ対応**: 単一のディレクトリだけでなく、複数のルートディレクトリを登録し、それらを横断して類似画像を検索できるように設計します。 > [!WARNING] > **依存関係**: このプロジェクトには **OpenCV** (画像処理用) と **SQLite** (ハッシュ保存用) が必要です。プロジェクト管理には **CMake** を使用します。 ## 提案される変更点 ### コアロジック (画像ハッシュ化と処理) 高速なハッシュ生成エンジンを実装します。 #### [NEW] `ImageHasher.hpp / .cpp` - `calculateDHash(cv::Mat image)` の実装: 9x8にリサイズ、グレースケール化、隣接画素の差分を計算。 - `calculatePHash(cv::Mat image)` の実装: 32x32にリサイズ、グレースケール化、離散コサイン変換(DCT)、低周波成分(8x8)の抽出。 - 最適化: `cv::parallel_for_` または C++ スレッドを使用して、複数の画像を同時に処理します。 #### [NEW] `SimilaritySearch.hpp / .cpp` - ハミング距離計算の実装: - Windows (MSVC): `__popcnt64` を使用。 - Linux (GCC/Clang): `__builtin_popcountll` を使用。 - または C++20 の `std::popcount` を使用してクロスプラットフォーム化。 - 検索アルゴリズム: データベース内の全ハッシュと比較し、しきい値以下のものを抽出。 ### データ管理 数十万件のハッシュを効率的に保存・取得します。 #### [NEW] `DatabaseManager.hpp / .cpp` - SQLite スキーマ: `images (id INTEGER PRIMARY KEY, path TEXT, dhash BLOB, phash BLOB, timestamp INTEGER)`。 - パスにインデックスを貼り、差分スキャンを高速化。 ### ユーザーインターフェース (Qt 6) モダンでレスポシブな UI を構築します。 #### [NEW] `MainWindow.ui / .cpp` - **ディレクトリ管理リスト**: 検索対象のディレクトリを追加・削除できるリストビュー。 - スキャン/ハッシュ計算のプログレスバー。 - 検索バー (選択した画像に似た画像を検索)。 - **結果グリッド / 重複管理ビュー**: - グループ化された類似画像の表示 (類似度ベースのクラスタリング)。 - 各画像に対するサムネ表示とチェックボックス。 - **削除機能**: 選択した画像ファイルをディスクから慎重に削除(ゴミ箱へ移動または直接削除)し、データベースからもエントリを削除する機能。 - 一括選択、元のファイルを開く、プロパティ表示などのコンテキストメニュー。 ## 検証プラン ### 自動テスト - 既知のサンプル画像を用いた `calculateDHash` と `calculatePHash` のユニットテスト。 - パフォーマンス・ベンチマーク: 1,000枚のハッシュ化時間、10万件の検索時間を測定。 ### 手動確認 1. アプリを起動し、多様な画像が含まれるディレクトリを選択。 2. スキャンフェーズで全 CPU コアが有効活用されているか確認。 3. 画像を選択し、リサイズや微細な加工が施された類似画像が正しく表示されるか確認。 4. 1万枚以上の画像で UI の応答性が維持されているか確認。