質問: 最近、画像解析でOpenCV等を勉強しています。 現在、動画に映っているボールを追跡するプログラムを作ってみたいのですが、[opencv ボール 検出],[opencv ボール 追跡]と検索しても、なかなか良いサンプルソースコードがありません。 カラーボールを追跡するソースコードなどは結構見つかるのですが、色ではなく形等で検出できるソースコードのサンプルは無いでしょうか? 参考のURLを教えていただけるとありがたいです。
回答: 動画からのトラッキング以前に、まず静止画からボールを検出する必要がありますが色が使えないとなると形状から検出するしか有りません。 その場合はエッジ検出した後にその中から円を探す事になりますが(どちらもOpenCVに関数があります)、通常のカメラから得た画像の場合、背景や光源などの影響を受けるため環境に応じてパラメータの調整が必要になると思われます。調整なしでどのような環境にも対応させるのは難しいでしょう。 他の手としてはカメラが固定ならば背景差分と言う方法もありますが、カメラにボール以外の多数の動体が映るような場合はこれも中々難しいです。 最も実用性が高いのはkinect等の深度画像から球体を検出する方法です。画像処理方法自体はエッジ検出と殆ど変わりませんが、平面画像の輝度などの差ではなく、深度の差からエッジ検出するため割りと正確に球体を切り出すことが出来ます。 球体が検出出来れば後は連続画像からトラッキングするだけですが、1つ注意点を挙げておくと通常のカメラでも深度カメラでも30fps程度のフレームレートではボール投げたような場合は追跡するのが中々大変です。 例えば割と遅めの時速36kmのボールでも1秒て10m進みますが、この時カメラで捉えた連続画像では少なくとも33cmは移動している事になります。この程度の球速でもこれだけ離れるので球が複数あったり、小さかったり、速く動いたりする場合は色々と試行錯誤が必要です。