【Python/OpenCV】Webカメラで振り子の運動を観測

この記事では、Python版OpenCVで色追跡を実装し、振り子の運動を観測・記録する方法をソースコード付きで解説します。

Webカメラで物体の運動を観測

前回の記事では、HSV色空間を使って色追跡(カラートラッキング)してみました。

参考記事
1 【Python/OpenCV】カラートラッキング(色追跡)で移動物体の検出
2 【Python/OpenCV】最大面積のブロブ解析

今回は、これを応用して、Python+OpenCVでWebカメラを固定して運動物体の座標を観測・記録してみました。

ソースコード(Python3+OpenCV3)

サンプルプログラムのソースコードです。

Webカメラで観測

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time

def color_tracking(img):
    # HSV色空間に変換
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 赤色のHSVの値域1
    hsv_min = np.array([0,100,0])
    hsv_max = np.array([60,255,255])
    mask1 = cv2.inRange(hsv, hsv_min, hsv_max)

    # 赤色のHSVの値域2
    hsv_min = np.array([160,100,0])
    hsv_max = np.array([255,255,255])
    mask2 = cv2.inRange(hsv, hsv_min, hsv_max)

    # 2つのマスク画像を加算
    mask = mask1 + mask2

    # 膨張・収縮処理でノイズ低減
    kernel = np.ones((6, 6), np.uint8)
    mask = cv2.dilate(mask, kernel)
    mask = cv2.erode(mask, kernel)

    return mask

def calc_max_point(mask):
    if np.count_nonzero(mask) 

記録データをグラフ化

# -*- coding: utf-8
import numpy as np
import matplotlib.pyplot as plt

def main():
    # CSVのロード
    data = np.genfromtxt("data.csv",delimiter=",", dtype='float')

    # 2次元配列を分割(経過時間t, x座標, y座標の1次元配列)
    t = data[:,0]
    x = data[:,1]
    y = data[:,2]

    # グラフにプロット
    plt.rcParams["font.family"] = "Times New Roman" # フォントの種類
    plt.plot(t, x, "r-", label="x")
    plt.plot(t, y, "b-", label="y")
    plt.xlabel("Time[sec]", fontsize=16)     # x軸ラベル
    plt.ylabel("Position[px]", fontsize=16)    # y軸ラベル
    plt.grid()         # グリッド表示
    plt.legend(loc=1, fontsize=16)       # 凡例表示
    plt.show()

if __name__ == "__main__":
    main()

実行結果

サンプルプログラムの実行結果です。

■カメラ映像

■グラフ化

グラフの横軸は経過時間[sec]、縦軸は赤色物体の位置座標(x,y)[px]です。 振り子の周期運動を観測できていることがわかります。

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング
記事の監修者
西住技研

プログラミング言語「Python」を研究、仕事、趣味でデータ分析や作業自動化などに活用してきたノウハウを情報発信しています。
筆者の詳しいプロフィールやお問合せはこちらのページまで。
YoutubeX(旧Twitter)でも情報発信中です!

西住技研をフォローする
OpenCV

コメント

  1. ふくとも より:

    赤色以外を抽出したいのですがHSVの値を変えてもうまくいきません
    どうすれば緑色などで、できますか?

    • 管理人 より:

      ※ふくとも様
      コメントありがとうございます。

      緑系のHSVは
      H:60~170[度]
      S:50~100%
      V:0~100%
      となりますので、OpenCVのスケールに合わせて
      H:30~90
      S:128~255
      V:0~255
      辺りなら抽出できるかと思います。

      参考:【画像処理】HSV色空間とカラートラッキングによる物体追跡の原理
      https://python.joho.info/image-processing/hsv-color-tracking/