本プロジェクトは, 指定された画像ディレクトリ内の画像から卓球ボールと思われる対象を検出し, ユーザーのクリック操作により各画像上の検出点(中心座標)を記録するプログラムと, 記録結果を画像上に描画して確認する可視化プログラムの2つのモジュールで構成されています.
main.py は画像の読み込み, クリック操作による検出, 順序検証および検出結果のCSV形式での保存を行います.visual.py は, 保存されたCSVファイル (ping-pong-detection.csv) の検出結果を読み込み, 画像上に検出点とラベルを描画して表示します..env ファイルを作成し, 以下のように画像ディレクトリのパスを指定します.IMAGE_DIR=パス/to/your/image_directory
requirements.txt を作成し, 必要なライブラリをインストールしてください.opencv-python numpy python-dotenv
pip install -r requirements.txt
project/
│ main.py
│ visual.py
│ .env
│ requirements.txt
│ ping-pong-detection.csv (検出結果のCSVファイル; 実行時に自動生成)
│
└── IMAGE_DIR/
├── image1.png
├── image2.jpg
└── ... (対象となる画像ファイル)
main.py)main.py を実行します.1 を, 背面ビューの場合は 2 を指定します.python main.py 1
.env ファイルで指定された IMAGE_DIR 内の画像ファイルを取得し, ファイル名に含まれる角度情報(例: _<angle>_angle)に基づいてソートします.f キー: 現在の画像での検出を終了し, 結果を内部リストに保存します.ping-pong-detection.csv に保存します.visual.py)visual.py を実行します.python visual.py
.env ファイルで指定された IMAGE_DIR 内の画像と, ping-pong-detection.csv に記録された検出結果を読み込みます.n キー: 次の画像を表示します.p キー: 前の画像を表示します.ping-pong-detection.csv) で保存されます.validate_relative_position(center, pos_number, centers): 前回までの検出結果との相対位置関係に基づき, 新たに検出された点の妥当性をチェックします.region_growing(image, seed_point, threshold, max_distance): クリックされたシード点からの類似色領域を8近傍に展開する領域拡張法を実装します.detect_ping_pong_ball(image, click_point, max_distance): 領域拡張法を用いて対象領域の重心と面積を算出します.on_mouse_click(event, x, y, flags, param): マウスクリックイベントを処理し, 検出点の追加または取り消しを行います.save_results および save_all_results: 画像ごとの検出結果および全画像の結果を CSVファイルに保存します.sort_key(filename): ファイル名中の _<angle>_angle パターンから角度情報を抽出し, 画像をソートするためのキーを返します.ping-pong-detection.csv に記録された検出結果を読み込み, 対応する画像上に検出ポイントとラベルを描画して可視化します.read_csv_data(csv_file): CSVファイルから各画像の検出結果を辞書形式で読み込みます.draw_points(image, points): 指定された検出点とラベルを画像上に描画します.sort_key(filename): 画像ファイル名から角度情報を抽出してソートに利用します..env ファイルにおいて, IMAGE_DIR が正しく設定されていない場合はエラーとなります._<angle>_angle)が含まれている必要があります.