#はじめに
前回の記事「https://qiita.com/fugunoko/items/299cfde96126007c6274」
では、tf-pose-estimation(https://github.com/ildoonet/tf-pose-estimation)
を使って、動画から姿勢推定と2D座標の出力を行いました。
今回は、出力した2D座標を用いて、動画(gif)上に節毎の軌道を描くようにします(結果は冒頭のgifのようになります。)
#目次
- データ準備
- 軌道gif作成
- ご参考サイト
#データ準備
前回の記事「https://qiita.com/fugunoko/items/299cfde96126007c6274」
を参考に、2D座標データリスト、frame毎の画像を出力しておきます。
#軌道gif作成
これらのデータを用いて、frame毎の画像に2D座標データリストから各節の点を上書きプロットします。nframe目には、nframe,(n-1)frame...の節をプロットしています。これらの画像を集めてgifとすることで、軌道が分かるようなgifが作成されるようにしています。
jupyter notebook環境で実行しました。
import pandas as pd
import numpy as np
import os
import codecs
import cv2
import glob
from PIL import Image
#2D座標リスト
df= pd.read_csv('cmu_dance_2ddata.csv')
#各節の軌道の色設定(0~18節)
colors = [[255,0,0],[0,255,0],[0,0,255],[255,255,0],[255,0,255]
,[0,255,255],[0,255,0],[0,0,255],[255,255,0],[255,0,255]
,[0,255,255],[0,255,0],[0,0,255],[255,255,0],[255,0,255]
,[0,255,255],[0,255,0],[0,0,255]]
#合計frameとframe間隔設定
frame = 135
term = 5
sizex = 1280
sizey = 720
for m in range(0,frame+term,term):
#各frameの画像読み込み
img = cv2.imread('brabra/cmu_dance_' + str(m) + '_data.jpg')
#サイズ変換
img = cv2.resize(img,(sizex,sizey))
#そのframeまでの節を画像に上書き描画
for i in range(0,m+5,5):
dfa = df[(df['flame']==i)]
try:
max(dfa['human'])
except:
continue
for j in range(1,max(dfa['human'])+1):
dfb = dfa[(dfa['human']==j)]
for k in range(0,19):
dfc = dfb[(dfb['point'] == k)]
try:
cv2.circle(img, (int(dfc['x']), int(dfc['y'])), 3, colors[k], -1)
except:
continue
#各frameで画像保存
cv2.imwrite('brabra/cmu_dance_' + str(m) + '_data_curve.jpg', img)
#gif化
files = []
for i in range(0,frame+term,term):
filepath = 'brabra/cmu_dance_' + str(i) + '_data_curve.jpg'
files.append(filepath)
images = list(map(lambda file: Image.open(file), files))
images[0].save('C:brabra/cmu_dance_curve' + str(term) + '.gif',
save_all=True, append_images=images[1:], interval=330, loop=0)
実行すれば冒頭のgifのような軌道が描画されたものが作成されます。
動作の軌道から得られるものは多いと思うのでどんどん使っていきたいです。
#ご参考サイト