OpenPose（Python）で画像中の姿勢検出

# 目的
OpenPose（Python）で画像中の姿勢検出した際の備忘録です

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

> [【TensorFlow版】MacBookで行うOpenPose （osx Mojave対応）](https://qiita.com/mdo4nt6n/items/d9523aff14dd9fb70c37)
> [スポーツがうまくなりたい・・・そうだ、姿勢推定してうまい人との差を取れれば・・・！！　～初級編：colaboratory、openposeで簡単動画の姿勢推定～](https://qiita.com/sugup/items/ebe1c0783f5c4db330d0)
> [Pythonで連番画像から動画を作成する](https://qiita.com/itoru257/items/228a91404fa77c780fd4)

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

> [スポーツがうまくなりたい・・・そうだ、姿勢推定してうまい人との差を取れれば・・・！！　～初級編：colaboratory、openposeで簡単動画の姿勢推定～](https://qiita.com/sugup/items/ebe1c0783f5c4db330d0)


```python: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:
            # １フレームずつ処理
            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

<img width="354" alt="スクリーンショット 2019-07-28 13.33.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/2f3fa763-b3fa-c79c-7530-d8987caa43b3.png">

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">openposeで姿勢検出（＋自主練） <a href="https://t.co/JYEc7eVJ28">pic.twitter.com/JYEc7eVJ28</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1155343425178259457?ref_src=twsrc%5Etfw">July 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

プロの姿勢は美しい。

![tonygogo1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/4e53e318-54db-5943-1137-72adfccfbe36.jpeg)

![tonygogo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/840e754f-5f5e-afdb-441f-6a968207038f.png)

# CodingError対策

Video(.mp4)が正しく保存されない場合は、
VideoWriter_fourccの設定パラメータ(fps,size)
range
resize設定パラメータ、を見直して元データと合っているか確認

```python
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に変換する

```sh
ffmpeg -i "input.MOV" input.mp4
```

--
ffmpegで元動画ファイルから音声データを抽出する

```sh
ffmpeg -i "input.mp4" -map 0:1 -vn -ac 2 -acodec pcm_s24le -f wav "audio.wav"
```

--
ffmpegで動画ファイルと音声データを結合する

```sh
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対応）](https://qiita.com/mdo4nt6n/items/d9523aff14dd9fb70c37)
[スポーツがうまくなりたい・・・そうだ、姿勢推定してうまい人との差を取れれば・・・！！　～初級編：colaboratory、openposeで簡単動画の姿勢推定～](https://qiita.com/sugup/items/ebe1c0783f5c4db330d0)
[Pythonで連番画像から動画を作成する](https://qiita.com/itoru257/items/228a91404fa77c780fd4)
[OpenCVで遊んでみた♬](https://qiita.com/MuAuan/items/5d968d41e993848a4332)
[[ffmpeg] 動画からMP3/WAVファイルを作る、WAVファイルの音声を動画の音声にする](https://qiita.com/suzutsuki0220/items/40667726956375090878)
[ffmpegを使って映像と音声を結合する](https://qiita.com/niusounds/items/f69a4438f52fbf81f0bd)