こんにちは!
製品開発部映像AIグループの張朝程です。
最近、ジオスコープやミルモットHDをご利用中のお客様からクラウド録画データの静止画をパラパラ漫画にしたい、というお問い合わせが増えてきました。
そこで、PythonとOpenCVを使えば、静止画を一括で取得し簡単にパラパラ漫画を生成できるので、この課題をクリアできます。
今回、PythonプログラムをWindowsのexeファイルに変換するツールPyInstallerを使い、Python環境がないWindows PCでも動くPythonとOpenCVを組み合わせたアプリを作成してみました。
0. 開発環境
- OS: Windows10
- Python: 3.8.2
- OpenCV: 4.5.2
- PyInstaller: 4.3
1. 環境構築
WindowsのコマンドプロンプトでPythonの実行環境があることを前提に、以下の手順で環境構築を行います。
1.1 Pythonとpip
Pythonのバージョンによっては、PyInstallerとの互換性がない可能性があります。Python 3.8.2ならPyInstallerを利用できます。
OpenCVとPyInstallerは、pipでインストールします。pipがなくインストールする場合は以下のコマンドを実行しましょう。
1 2 3 4 |
C:\Users\hoge> curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py C:\Users\hoge> python get-pip.py C:\Users\hoge> pip --version pip 21.1.2 |
1.2 PyInstallerとOpenCV
pipコマンドでインストールします。
1 2 |
C:\Users\hoge> pip install pyinstaller C:\Users\hoge> pip install opencv-python |
PyInstallerをインストールしたかどうか確認します。
1 2 |
C:\Users\hoge> pyinstaller --version 4.3 |
OpenCVをインストールしたかどうか確認します。
1 2 3 4 5 6 |
C:\Users\hoge> python Python 3.8.2 on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '4.5.2' |
2. Pythonスクリプトの作成
まず、Documentsフォルダの直下にworkspace_pythonという作業ディレクトリを作成します。
そして、workspace_pythonの直下に、main.pyファイルと、静止画ファイルを格納するimgというディレクトリを作成し、静止画ファイルをimg\にコピーしておきます。
2.1 ディレクトリ構造
1 2 3 4 5 6 7 |
C:\Users\hoge\Documents\workspace_python\ |- img\ | - 20210621160001.jpg | - 20210621160002.jpg | - 20210621160003.jpg | - ...(省略)... |- main.py |
2.2 Pythonスクリプト main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import cv2 from glob import glob # FPS、1秒間の動画で見せる静止画の枚数 FRAME_RATE = 10.0 def timelaps(img_paths): """ タイムラプス動画を作成 Parameters ---------- img_paths : [string] 画像データの相対パス配列 """ # 一枚目の画像サイズを取得 height, width = cv2.imread(img_paths[0]).shape[:2] fourcc = cv2.VideoWriter_fourcc('m','p','4','v') video = cv2.VideoWriter('timelaps.mp4', fourcc, FRAME_RATE, (width, height)) print("動画変換中...") for i in range(len(img_paths)): img = cv2.imread(img_paths[i]) # imreadの戻り値に対してNoneじゃないかどうかチェック if not img is None: img = cv2.resize(img, (width, height)) video.write(img) video.release() print("変換完了") if __name__ == '__main__': # imgフォルダ内のファイル一覧取得 imgs = glob('img/*.jpg') # 念のため、jpegも取得する imgs.extend(glob('img/*.jpeg')) # 画像名称を昇順にソートする img_paths = sorted(imgs) # 取得画像の枚数を確認する print("Frame枚数{0}".format(len(img_paths))) # タイムラプス動画を作成開始 timelaps(img_paths) |
2.3 main.pyで使われたOpenCV
- cv2.imread( img_paths[0] )
取得した一枚目の画像ファイルを読み込みます。 - cv2.imread( img_paths[0] ).shape[:2]
一枚目の画像のwidthとheightを取得し、変数heightと変数widthに代入します。 - cv.VideoWriter_fourcc(‘m’, ‘p’ , ‘4’ , ‘v’)
mp4動画を出力してください!というデータフォーマットを定義します。 - cv2.VideoWriter(‘timelaps.mp4’, fourcc, FRAME_RATE, (width, height))
引数1: 動画パス名
引数2: cv.VideoWriter_fourcc(‘m’, ‘p’ , ‘4’ , ‘v’)の戻り値。
引数3: FPS ( Frame Per Second ) 、つまり1秒間の動画で見せる静止画の枚数を意味します。
引数4: 動画サイズ。 - cv.VideoWriter.write(image)とcv.VideoWriter.release()
forループで、すべての画像を.write(image)で書き込んでから、.release()でmp4ファイルを出力します。
3. Pythonアプリをexe化して動画作成します
以下のコマンドで、先ほど作ったPythonスクリプトを簡単にexeファイルに変換できます。–onefileオプションを付けると、関連するファイルを1つにまとめてexeファイルを生成します。
1 |
C:\Users\hoge\Documents\workspace_python> pyinstaller main.py --onefile |
もしPyInstallerは環境変数に通っていない場合、以下のコマンドでも実行できます。
1 |
C:\Users\hoge\Documents\workspace_python> python -m PyInstaller main.py --onefile |
うまくいくと、ディレクトリ構造は以下のように変わります。
1 2 3 4 5 6 7 8 9 10 11 |
C:\Users\hoge\Documents\worksapce_python\ |- __pycache__\ |- build\ |- dist\ | - main.exe |- img\ | - 20210621160001.jpg | - 20210621160002.jpg | - 20210621160003.jpg | - ...(省略)... |- main.spec |
~\dist\の直下に、main.exeを生成できましたね。
今回のPythonスクリプトは、静止画を格納するimgフォルダはexeファイルと同階層に配置する仕様です。
そのため、exeファイルをdistフォルダから取り出し、imgフォルダと同じ階層に移動します。
1 2 3 4 |
C:\Users\hoge\Documents\workspace_python\ |- (省略) |- img\ |- main.exe |
以上のディレクトリ構造を確認した上で、マウスでmain.exeファイルをダブルクリックすると、Windowsのterminalを表示し、Pythonスクリプト内のprint()内容を表示します。
1 2 3 |
Frame枚数XX 動画変換中... 変換完了 |
“変換完了”が表示されたら、windowsのterminalが自動的に消えます。コマンドプロンプトで確認すると、timelaps.mp4ファイルがworksapce_pythonフォルダ内に作成されました!
1 2 3 4 5 6 7 8 9 |
C:\Users\hoge\Document\worksapce_python> dir /b __pycache__ build dist img main.exe main.py main.spec timelaps.mp4 |
4.実演
エコモット本社前で撮影された静止画80枚をパラパラ漫画にしました!
( 動画サイズ: 320 * 180 )