見出し画像

UMATrackerのデータから、Rを使ってオブジェクトの移動距離を計算する方法

UMATrackerは、オブジェクト追跡のためのツールで、ビデオのフレームごとに物体の座標データを記録します。本記事では、UMATrackerで得られたデータから、各オブジェクトがどれだけ移動したかを計算する方法について、Rを使って解説します。

本記事は、UMATrackerのデータを使って移動距離を計算したい方向けで、Rの初心者でもわかるように各ステップを詳しく説明していきます。


必要なライブラリのインストール

まず、データ処理や操作を簡単にするために、tidyverseパッケージをインストールします。tidyverseはデータフレームを操作するための非常に便利なツールセットです。

# tidyverseパッケージがインストールされていない場合はインストール
install.packages("tidyverse")

# パッケージを読み込む
library(tidyverse)

データの読み込み

次に、UMATrackerから出力されたデータを読み込みます。この例では、ファイル名を変数として指定し、柔軟に扱えるようにしています。

# UMATrackerからデータを読み込む
file_name <- "your_file_name_here.csv"

original_data <- read.csv(file_name)

read.csv()を使ってデータを読み込み、file_nameという変数でファイル名を管理することで、異なるファイルを簡単に扱うことができます。

データのコピーを作成

オリジナルのデータをそのまま使うのではなく、作業用にコピーを作成します。これにより、元のデータを安全に保持したまま加工できます。

# オリジナルデータのコピーを作成
data <- data.frame(original_data)

オブジェクトの数を計算

UMATrackerでは、最初の列にフレームのデータ(position)が、各オブジェクトの座標データが「x0, y0, x1, y1,...」のように記録されています。このデータから、追跡されているオブジェクトの総数を簡単に計算する関数を作成します。

# オブジェクトの数を計算する関数
get_number_of_objects_simple <- function(df) {
  num_columns <- ncol(df) - 1  # 'position'列を除く
  num_objects <- num_columns / 2  # 各オブジェクトにはxとyの2つの列があるため、2で割る
  return(num_objects)
}

# 関数を使ってオブジェクトの数を取得
num_objects <- get_number_of_objects_simple(data)
print(num_objects)

このコードでは、データフレームの列数を取得し、position列を除いた数を2で割ることで、オブジェクトの総数を求めています。

移動距離を計算する関数

次に、各オブジェクトの移動距離を計算する関数を作成します。この関数では、オブジェクトの座標データを使って、フレーム間の移動距離を計算し、それを合計します。

# オブジェクトごとの移動距離を計算する関数
calculate_distance <- function(df, object_num) {
  x_col <- paste0("x", object_num)
  y_col <- paste0("y", object_num)
  
  # 現在のオブジェクトに対応するx, y列のみを選択
  object_data <- df %>%
    select(!!sym(x_col), !!sym(y_col)) %>%
    mutate(dx = lead(!!sym(x_col)) - !!sym(x_col),
           dy = lead(!!sym(y_col)) - !!sym(y_col),
           distance = sqrt(dx^2 + dy^2))
  
  # 距離を合計する
  total_distance <- sum(object_data$distance, na.rm = TRUE)
  return(total_distance)
}

paste0("x", object_num)で、オブジェクトのx座標とy座標の列名を動的に作成しています。
mutate()を使って、次のフレームの座標との差を計算し、それらから距離を算出しています。

各オブジェクトの距離を計算

全てのオブジェクトについて、移動距離を計算するためにループを使います。計算結果はリストに保存されます。

# 各オブジェクトの距離を格納するリストを初期化
total_distances <- list()

# 各オブジェクトについて距離を計算
for (i in 0:(num_objects - 1)) {
  total_distance <- calculate_distance(data, i)
  total_distances[[paste0("Object_", i)]] <- total_distance
}

移動距離の計算式

オブジェクトの移動距離の計算において、各オブジェクトのフレーム間の距離を計算する数式を追加します。具体的には、2つのフレーム間でのオブジェクトの座標差をもとに、ユークリッド距離(直線距離)を計算しています。
2つのフレーム間の座標 $${(x_{i}, y_{i})}$$と$${(x_{i+1}, y_{i+1}​)}$$ について、距離 dは次の式で表されます。

$$
d = \sqrt{(x_{i+1} - x_i)^2 + (y_{i+1} - y_i)^2}
$$

結果をデータフレームに変換

# 距離の結果をデータフレームに変換
total_distances_df <- data.frame(
  Object = names(total_distances),
  Total_Distance = unlist(total_distances),
  row.names = NULL  # 行名を追加しないようにする
)

# 結果を表示
print(total_distances_df)

これで、各オブジェクトの移動距離が計算され、データフレーム形式で表示されます。

このようにして、UMATrackerから取得したデータを使って、各オブジェクトの移動距離を簡単に計算することができます。Rの基本的なデータ操作や関数の使い方も学べる内容になっていますので、ぜひ参考にしてみてください!


この記事が気に入ったらサポートをしてみませんか?