17
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OpenPose(Python)で画像中の姿勢検出

Last updated at Posted at 2019-08-10

目的

OpenPose(Python)で画像中の姿勢検出した際の備忘録です

準備

下記を参考にさせて頂きました。
OpenPoseライブラリをインストールします。

【TensorFlow版】MacBookで行うOpenPose (osx Mojave対応)
スポーツがうまくなりたい・・・そうだ、姿勢推定してうまい人との差を取れれば・・・!! ~初級編:colaboratory、openposeで簡単動画の姿勢推定~
Pythonで連番画像から動画を作成する

コード

iPhone SEの動画サイズ(720*1280 30fps)に合わせています。
下記を参考にさせて頂きました。

スポーツがうまくなりたい・・・そうだ、姿勢推定してうまい人との差を取れれば・・・!! ~初級編:colaboratory、openposeで簡単動画の姿勢推定~

sample.py

#  (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

スクリーンショット 2019-07-28 13.33.00.png

プロの姿勢は美しい。

tonygogo1.jpg

tonygogo.png

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を使って映像と音声を結合する

17
23
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?