Python版OpenCVでカラートラッキング(色追跡)を実装し、移動物体を検出する方法をソースコード付きで解説します。
カラートラッキング(色追跡)で移動物体検知
カラートラッキング(色追跡)は、その名の通り、特定の色のみを検出して追跡します。
カラートラッキングには、通常RGB色空間ではなく、同系統の色の範囲を数値で指定しやすいHSV色空間を用います。
HSV色空間とは、「色相(Hue)」「彩度(Saturation)」「明度(Value)」の3つの組み合わせで色を表現する手法です。
– | 説明 |
---|---|
色相(H) | 色合い。(赤っぽい、青っぽいといった色のおおまかな違いのことで、赤なら0度、黄色なら 60度といったように角度で色合いが決まります) |
彩度(S) | 色の鮮やかさ。(色相が同じ場合でも、彩度が高ければ鮮やかに見え、低ければグレーに見える。彩度がゼロの場合は無彩色[黒、グレー、白]) |
明度(V) | 色の明るさ。(高いほど明るい色になる) |
今回は、PythonとOpenCVで以下の赤色物体を検知するプログラムを作成します。
【HSV色空間の赤色】
– | 赤色の範囲 | 赤色の範囲(OpenCVの場合) |
---|---|---|
H | 0~60, 300~360[度] | 0~30, 150~179 |
S | 50~100[%] | 128~255 |
V | 00~100[%] | 0~255 |
実行例
動画解説版
サンプルコード
サンプルプログラムのソースコードです。
サンプルコードの解説
上記コードは、OpenCVを使ってビデオ内の赤色を検出するプログラムです。以下に各部分を説明をします。
1. インポート
import cv2
import numpy as np
cv2
: OpenCVライブラリをインポートします。画像処理に使用します。np
: NumPyライブラリをインポートします。数値計算に使用します。
2. 赤色検出用の関数
def red_detect(img):
# HSV色空間に変換
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 赤色のHSVの値域1
hsv_min = np.array([0, 127, 0])
hsv_max = np.array([30, 255, 255])
mask1 = cv2.inRange(hsv, hsv_min, hsv_max)
# 赤色のHSVの値域2
hsv_min = np.array([150, 127, 0])
hsv_max = np.array([179, 255, 255])
mask2 = cv2.inRange(hsv, hsv_min, hsv_max)
return mask1 + mask2
cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
: 画像をBGR色空間からHSV色空間に変換します。HSV色空間は色相(Hue)、彩度(Saturation)、明度(Value)で色を表現します。cv2.inRange(hsv, hsv_min, hsv_max)
: 指定した範囲内のピクセルを抽出し、マスク画像を作成します。hsv_min
とhsv_max
は赤色の範囲を指定しています。赤色は2つの範囲に分かれているため、2つのマスクを作成し、それらを足し合わせたものを返しています(return mask1 + mask2)。
3. メイン関数
def main():
videofile_path = "/Users/github/sample/python/opencv/video/color_tracking/red_pendulum.mp4"
# カメラのキャプチャ
cap = cv2.VideoCapture(videofile_path)
while(cap.isOpened()):
# フレームを取得
ret, frame = cap.read()
# 赤色検出
mask = red_detect(frame)
# 結果表示
cv2.imshow("Frame", frame)
cv2.imshow("Mask", mask)
# qキーが押されたら途中終了
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
cv2.VideoCapture(videofile_path)
: 指定したビデオファイルを読み込みます。cap.read()
: ビデオからフレームを1枚ずつ読み込みます。red_detect(frame)
: 読み込んだフレームから赤色を検出します。cv2.imshow("Frame", frame)
: 元のフレームを表示します。cv2.imshow("Mask", mask)
: 赤色検出結果のマスクを表示します。cv2.waitKey(25) & 0xFF == ord('q')
: 25ミリ秒待機し、q
キーが押されたらループを終了します。cap.release()
: ビデオキャプチャを解放します。cv2.destroyAllWindows()
: すべてのウィンドウを閉じます。
4. エントリーポイント
if __name__ == '__main__':
main()
- スクリプトが直接実行された場合に
main()
関数を呼び出します。
カラートラッキングの活用例
カラートラッキングはシンプルなアルゴリズムであり、多くの分野で活用されています。
- ロボット制御:
- カラートラッキングを利用して、ロボットが特定の色の物体を追跡することができます。例えば、オレンジ色のボールを追いかけるロボットなどが挙げられます。
- スポーツ解析:
- スポーツの試合で選手の動きを追跡するためにカラートラッキングが使用されます。特定の色のユニフォームを着た選手を追跡し、動きや位置を解析することができます。
- 医療分野:
- 手術中に特定の色でマーキングされた部位を追跡することで、医師が正確に手術を行うのを支援します。また、内視鏡手術などでカラートラッキングを利用して、特定の組織や器官を識別することもあります。
- 自動運転車:
- 自動運転車では、信号機や道路標識の色を検出して認識するためにカラートラッキングが使用されます。これにより、車が適切な行動を取ることができます。
関連ページ
【Python版OpenCV超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
Python基礎
「Python基礎」の記事一覧です。
コメント