プログラムで生活をHACKする

YRen-LaB

OpenCV Python

【python】動画から1フレームごとの画像を保存する

投稿日:


経緯

ドット絵が流行ってるっぽいので自分も作りたい。
でもただドット絵にするだけだと既にやってる人いる。
んじゃ元の動画を全てドット絵にして繋げればドットアニメーションになるじゃん

目的

動画から1フレームごとの画像を取得し保存する
ところまでこの記事にまとめる

実装

import cv2
import sys

video_path = R"C:\Users\xxxxxxxxxx\movie.avi"

# 動画ファイル読込
cap = cv2.VideoCapture(video_path)

if not cap.isOpened():
    # 正常に読み込めたのかチェックする
    # 読み込めたらTrue、失敗ならFalse
    print("動画の読み込み失敗")
    sys.exit()

# width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
# height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
# fps = cap.get(cv2.CAP_PROP_FPS)

# print("width:{}, height:{}, count:{}, fps:{}".format(width,height,count,fps))

digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))

n= 0
while True:
    # read()でフレーム画像が読み込めたかを示すbool、フレーム画像の配列ndarrayのタプル
    is_image,frame_img = cap.read()
    if is_image:
        # 画像を保存
        cv2.imwrite(R"C:\Users\xxxxxxxxxx\\" + str(n).zfill(digit) + ".jpg" , frame_img)
    else:
        # フレーム画像が読込なかったら終了
        break
    n += 1

cap.release()

解説

動画読込

# 動画ファイル読込
cap = cv2.VideoCapture(video_path)

VideoCapture()で動画ファイルを読み込む。
引数には動画のパスを指定する。
絶対パスでも相対パスでもよい

動画正常に読み込めたかチェック

if not cap.isOpened():
    # 正常に読み込めたのかチェックする
    # 読み込めたらTrue、失敗ならFalse
    print("動画の読み込み失敗")
    sys.exit()

isOpened()で正常に動画が読み込まれたかかチェックできる。
正常に読み込まれていればTrue
読み込まれていなければFalse
が戻り値として返る。

1フレームごとに画像を保存

digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))

n= 0
while True:
    # read()でフレーム画像が読み込めたかを示すbool、フレーム画像の配列ndarrayのタプル
    is_image,frame_img = cap.read()
    if is_image:
        # 画像を保存
        cv2.imwrite(R"C:\Users\xxxxxxxxxx\\" + str(n).zfill(digit) + ".jpg" , frame_img)
    else:
        # フレーム画像が読込なかったら終了
        break
    n += 1

digitには、総フレーム数から、整数→文字列にし桁数が格納される。

while以降は無限ループで以下の処理を行う。

  1. read()でフレーム画像が取得できたかを示すbool及び、フレーム画像のndarrayを取得
  2. 画像が取得できていれば画像を保存
    1. imwrite()には保存先のパスとフレーム画像のndarrayを渡す
  3. 取得できていなければループ終了

おまけ(コメントアウト部分)

# width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
# height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
# fps = cap.get(cv2.CAP_PROP_FPS)

get()の引数に以下のプロパティを渡すことで動画の各情報を取得できる

  1. cv2.CAP_PROP_FRAME_WIDTH : 動画の幅
  2. cv2.CAP_PROP_FRAME_HEIGHT : 動画の高さ
  3. cv2.CAP_PROP_FRAME_COUNT : 動画のフレーム数
  4. cv2.CAP_PROP_FPS : 動画のFPS(フレーム/秒)

まとめ

以上、動画から1フレームごとの画像を取得やり方のメモ。





単純作業にお悩みではありませんか?

何百とあるワードを検索してファイルにまとめたり 数ある商品情報から条件にあるものだけ目で探してリ...

その単純作業プログラムで解決できるかもしれません。 もしよろしければ単純作業からの解放をお手伝いさせてください。

詳しくは以下のページからDM、または見積もり相談お願い致します。

お仕事依頼 ・ 見積もり依頼

adsense




-OpenCV, Python
-,

Copyright© YRen-LaB , 2021 AllRights Reserved Powered by AFFINGER4.