【Python/OpenCV】カラートラッキング(色追跡)で移動物体検知

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_minhsv_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()関数を呼び出します。

カラートラッキングの活用例

カラートラッキングはシンプルなアルゴリズムであり、多くの分野で活用されています。

  1. ロボット制御:
    • カラートラッキングを利用して、ロボットが特定の色の物体を追跡することができます。例えば、オレンジ色のボールを追いかけるロボットなどが挙げられます。
  2. スポーツ解析:
    • スポーツの試合で選手の動きを追跡するためにカラートラッキングが使用されます。特定の色のユニフォームを着た選手を追跡し、動きや位置を解析することができます。
  3. 医療分野:
    • 手術中に特定の色でマーキングされた部位を追跡することで、医師が正確に手術を行うのを支援します。また、内視鏡手術などでカラートラッキングを利用して、特定の組織や器官を識別することもあります。
  4. 自動運転車:
    • 自動運転車では、信号機や道路標識の色を検出して認識するためにカラートラッキングが使用されます。これにより、車が適切な行動を取ることができます。

関連ページ

【Python版OpenCV超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
Python基礎
「Python基礎」の記事一覧です。

コメント