目的
OpenPose(Python)で画像中の姿勢検出した際の備忘録です
準備
下記を参考にさせて頂きました。
OpenPoseライブラリをインストールします。
【TensorFlow版】MacBookで行うOpenPose (osx Mojave対応)
スポーツがうまくなりたい・・・そうだ、姿勢推定してうまい人との差を取れれば・・・!! ~初級編:colaboratory、openposeで簡単動画の姿勢推定~
Pythonで連番画像から動画を作成する
コード
iPhone SEの動画サイズ(720*1280 30fps)に合わせています。
下記を参考にさせて頂きました。
スポーツがうまくなりたい・・・そうだ、姿勢推定してうまい人との差を取れれば・・・!! ~初級編:colaboratory、openposeで簡単動画の姿勢推定~
# (720*1280 30fps の IMG_sample.MOVをoutput.mp4に変換)
import argparse
import logging
import time
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from tf_pose import common
from tf_pose.estimator import TfPoseEstimator
from tf_pose.networks import get_graph_path, model_wh
img_outdir = './img'
os.makedirs(img_outdir, exist_ok=True)
# 動画作成
os.system('ffmpeg -i IMG_sample.MOV sample.mp4')
width = 720
height = 1280
fps = 30.0
fourcc = cv2.VideoWriter_fourcc('m','p','4', 'v')
video = cv2.VideoWriter('tmp_video.mp4', fourcc, fps, (width, height))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='tf-pose-estimation Video')
outimg_files = []
count = 0
w = 544
h = 960
e = TfPoseEstimator(get_graph_path('mobilenet_thin'), target_size=(w, h))
# 入力動画
cap = cv2.VideoCapture('sample.mp4')
# 動画用の音声切出し
os.system('ffmpeg -i "sample.mp4" -map 0:1 -vn -ac 2 -acodec pcm_s24le -f wav "audio.wav"')
# 動画用の画像作成
while True:
ret, image = cap.read()
if ret == True:
# 1フレームずつ処理
count += 1
if count % 100 == 0:
print('Image No.:{0}'.format(count))
humans = e.inference(image, resize_to_default=(w > 0 and h > 0), upsample_size=4)
image = TfPoseEstimator.draw_humans(image, humans, imgcopy=False)
# 画像出力
outimg_file = '{}/{:05d}.jpg'.format(img_outdir, count)
cv2.imwrite(outimg_file, image)
image = cv2.resize(image, (width,height))
video.write(image)
else:
break
video.release()
os.system('ffmpeg -i tmp_video.mp4 -i audio.wav -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4')
テスト
姿勢が検出できればOK

openposeで姿勢検出(+自主練) pic.twitter.com/JYEc7eVJ28
— st (@st17890027) July 28, 2019
プロの姿勢は美しい。
CodingError対策
Video(.mp4)が正しく保存されない場合は、
VideoWriter_fourccの設定パラメータ(fps,size)
range
resize設定パラメータ、を見直して元データと合っているか確認
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
video = cv2.VideoWriter('video.mp4', fourcc, 30.0, (720, 1280))
for i in range(1000, 1900):
img = cv2.imread('{0:05d}.jpg'.format(i))
img = cv2.resize(img, (720,1280))
video.write(img)
--
ffmpegで元動画ファイル(.MOV)を.mp4に変換する
ffmpeg -i "input.MOV" input.mp4
--
ffmpegで元動画ファイルから音声データを抽出する
ffmpeg -i "input.mp4" -map 0:1 -vn -ac 2 -acodec pcm_s24le -f wav "audio.wav"
--
ffmpegで動画ファイルと音声データを結合する
ffmpeg -i tmp_video.mp4 -i audio.wav -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
参考
【TensorFlow版】MacBookで行うOpenPose (osx Mojave対応)
スポーツがうまくなりたい・・・そうだ、姿勢推定してうまい人との差を取れれば・・・!! ~初級編:colaboratory、openposeで簡単動画の姿勢推定~
Pythonで連番画像から動画を作成する
OpenCVで遊んでみた♬
[ffmpeg] 動画からMP3/WAVファイルを作る、WAVファイルの音声を動画の音声にする
ffmpegを使って映像と音声を結合する