🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1740閲覧

動画を均等に36枚の静止画として保存したいです!

haruyuzu

総合スコア6

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/21 14:49

編集2019/11/21 14:52

動画を36分割の画像データに変換したいのですがどうすれば良いのかわかりません。
動画再生後スペースボタンを押したら36枚のフレーム画像を抽出し保存できるプログラムはできたのですが、ですが求めているのは、動
画全体を均等に36枚の静止画として保存できるプログラムです。できる方ご指導願います!

python

1import cv2 2import sys 3import time 4import numpy as np 5import sys 6import imutils 7import os, shutil 8import glob 9 10x = 0 11y = 35 12 13ext = ".jpg" 14window_name = 'frame' 15# 表示ウィンドウ????作成 16cap = cv2.VideoCapture('001.MOV') 17 18if not cap.isOpened(): 19 print("Error! Can't open video file.") 20 sys.exit() 21mode = False 22 23while True: 24 retval, frame = cap.read() 25 frame = imutils.resize(frame, width=640) 26 frame = frame.transpose((1, 0, 2)) 27 if frame is None: 28 break 29 30 if x > y: 31 break 32 33 cv2.imshow(window_name, frame) # 1 フレーム表示 34 key = cv2.waitKey(25) 35 if key == 32: #スペースボタン 36 True 37 mode = True 38 39 elif key == 27: 40 break 41# ESC キーを押したとき終了 break 42 if mode: 43 fname = str(x).zfill(3)+ext 44 cv2.imwrite(fname, frame) 45 x += 1 46 time.sleep(0.06) 47 48cv2.destroyAllWindows() 49# すべて????表示ウィンドウ????破棄 50cap.release() 51# ビデオファイル(キャプチャ機器)を閉じる

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2019/11/22 01:40

> 動画全体を均等に36枚の静止画として保存 の意味がわからないです. 動画を静止画として保存するとはどういうことですか? 例えば動画が全72フレームだとしたら,36枚の静止画とはどのような絵になるのですか?
haruyuzu

2019/11/22 02:37

fana さん 例えば3秒の動画を0.083秒ごとの36枚の静止画にしたいということです。 5秒の動画であれば0.13秒ごとの36枚の静止画にするということです。
fana

2019/11/22 02:47

訊き方がまずかったですかね? 動画が全72フレームだとしたら各静止画は動画の2フレームを元にして「どうにかして」生成されるという話だと思うのですが,この「どうにかして」の部分は実際には何をやるのでしょうか? という質問です. 例えば,1フレーム目が真っ青な絵で2フレーム目が真っ赤な絵である動画を入力した際,生成される36枚の静止画うちの1枚目というのはどんな絵になるのでしょう? 紫色になるのでしょうか? それとも「幅が動画のフレーム画像の2倍の大きさで,左側が青,右側が赤」みたいな繋いだ絵になるとかでしょうか? その他?
fana

2019/11/22 02:48

それとも単に,{2フレーム目, 4フレーム目, ..., 70フレーム目, 72フレーム目}という36枚を抜き出すだけ,という話ですか?
haruyuzu

2019/11/22 03:14

説明不足で大変申し訳ございません! 最終的に動画から抜き出した36枚の静止画を6x6のシーケンス画像にしたいのです。 72フレームの動画であれば{2フレーム目, 4フレーム目, ..., 70フレーム目, 72フレーム目}という36枚を抜き出せばいいのですが、2秒から3秒の動画が100個以上あるため、一つ一つの動画でフレーム指定しての抜き出しはかなり手間がかかってしまいます。 なので、フレーム指定ではなく、各動画全て36枚の静止画に等分割できるようなプログラムを作成できないか考えております。
guest

回答1

0

ベストアンサー

簡単には,対象の動画の総フレーム数を36で割るなどして,
何フレーム毎に保存すればよいかを求めればよいのではないでしょうか.
72フレームの動画を例にすればN=2です.2フレームに1回保存すればよいです.

Nフレーム毎に保存すればよいとわかれば,Nフレームの中でどれか1枚を保存すること:やり方はいろいろ考えられますが

  • N-1フレームを読み飛ばして,Nフレーム目を保存する
  • 1フレーム目を保存して次のN-1フレームを読み飛ばす
  • Nフレームのうちの真ん中らへんのフレームを保存
  • その他の方法?

を36回繰り返せばよいでしょう.

動画のフレーム数は OpenCVのVideoCaptureクラスなら getメソッドでcv.CAP_PROP_FRAME_COUNTを指定することで取得できたと思います.

投稿2019/11/22 03:25

fana

総合スコア11985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2019/11/22 03:28

動画のフレーム数が36で割り切れない場合,Nの値は整数ではなくなりますが,やること自体は一緒です. (例えば,N=3.56なら「3.56枚に1枚」のペースで保存していければよい)
haruyuzu

2019/11/22 03:39

fana さん ありがとうございます! 試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問