質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

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

Python

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

Q&A

解決済

3回答

1961閲覧

動画ファイルをフレームごとの画像として保存したい

shktech

総合スコア2

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/06/18 08:54

前提・実現したいこと

プログラミング大初心者です。
PythonでOPEN CVを使って動画ファイルからフレームを切り出して保存するプログラムをインターネット上にあるものを参考に実行しています。
その際に以下のエラーが発生しました。
また、このプログラムの意味がほとんどわかっていないので解説いただけると幸いです。

発生している問題・エラーメッセージ

File "<ipython-input-16-7e09426af7b6>", line 7 def save_all_frames(video_path, der_path, new, ext='jpg') ^ SyntaxError: invalid syntax

該当のソースコード

import cv2 import os video_path = 'C0597.mp4' dir_path = 'framecap' def save_all_frames(video_path, der_path, basename, ext='jpg') cap = cv2.VideoCapture(video_path) if not cap.isOpened(): return os.makedirs(dir_path, exist_ok=True) base_path = os.path.join(dir_path, basename) digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))) n = 0 while True: ret, frame = cap.read() if ret: cv2.imwrite('{}_{}.{}'.format(base_path, str(n).zfill(digit), ext), frame) n += 1 else: return save_all_frames('data/temp/sample_video.mp4', 'data/temp/result', 'sample_video_img') save_all_frames('data/temp/sample_video.mp4', 'data/temp/result_png', 'sample_video_img', 'png')

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答3

0

ベストアンサー

動画のファイル名が合ってて、コードを実行した時のカレントディレクトリに動画ファイルがあるなら、これで動くと思います
ファイル名や置き場所が違うなら、そこは自分で直してください

修正前のを「#」付けて残してあるので、それと見比べてください

python

1import cv2 2import os 3 4video_path = 'C0597.mp4' 5dir_path = 'framecap' 6 7#def save_all_frames(video_path, der_path, basename, ext='jpg') 8def save_all_frames(video_path, dir_path, basename, ext='jpg'): 9 #cap = cv2.VideoCapture(video_path) 10 cap = cv2.VideoCapture(video_path) 11 12 if not cap.isOpened(): 13 return 14 15 os.makedirs(dir_path, exist_ok=True) 16 base_path = os.path.join(dir_path, basename) 17 18 digit = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))) 19 20 n = 0 21 22 while True: 23 ret, frame = cap.read() 24 if ret: 25 cv2.imwrite('{}_{}.{}'.format(base_path, str(n).zfill(digit), ext), frame) 26 n += 1 27 else: 28 return 29 30#save_all_frames('data/temp/sample_video.mp4', 'data/temp/result', 'sample_video_img') 31 32#save_all_frames('data/temp/sample_video.mp4', 'data/temp/result_png', 'sample_video_img', 'png') 33save_all_frames(video_path, dir_path, 'sample_video_img', 'png')

投稿2021/06/22 10:55

jbpb0

総合スコア7651

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

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

shktech

2021/06/23 05:41

ご回答ありがとうございました。 この通りにやると実行することができました。 本当に助かりました。 #save_all_frames('data/temp/sample_video.mp4', 'data/temp/result', 'sample_video_img') この部分が必要なくて、video_path,dir_pathをちゃんと指定してあげることで解決できたという認識で間違いないのでしょうか?
jbpb0

2021/06/23 06:05 編集

違います 他にもあります ・def save_all_frames(... の最後の「:」が抜けてる (ppaulさんの回答と同じ) ・def save_all_frames(... の引数名の間違い:der_path → dir_path ・cap = cv2.VideoCapture(... のインデントの間違い:次の if not... に合わせる ・一つ目の save_all_frames('data/... が要らない (質問者さんが上のコメントに書いてること) の四つが間違い 「#」付いてるのと、よーーーく見比べてください
shktech

2021/06/24 03:28

1.2.4番目の間違いは理解しました。 3番目の間違いについては、インデントが違うことで違うブロックだと認識してしまうからそろえる必要があるということでしょうか?
jbpb0

2021/06/24 05:55

> インデントが違うことで違うブロックだと認識してしまうからそろえる必要がある cap = cv2.VideoCapture(... のインデントを元に戻して実行したら分かりますけど、エラーになります
shktech

2021/06/24 09:31

インデントを0にして実行してみると確かにエラーが出ました。 本当に、本当に助かりました。 ありがとうございました。
guest

0

SyntaxError: invalid syntax

は文法エラーです。
^が、Pythonの構文解析がエラーに気づいた場所を示しています。
最初は分かりにくいと思いますので、答えを書いてしまうと、行末に:が抜けているのが原因です。

  • このプログラムの意味がほとんどわかっていないので解説いただけると幸いです。

そういうのは、自分で解読するものです。

投稿2021/06/18 09:32

ppaul

総合スコア24666

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

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

shktech

2021/06/18 11:51

ご回答ありがとうございます。 直してチャレンジしたいと思います。 自分で解読する力も頑張って身に着けていきます。
guest

0

冒頭の
video_path = 'C0597.mp4'
dir_path = 'framecap'

は必要なく、

save_all_frames('data/temp/sample_video.mp4', 'data/temp/result', 'sample_video_img')

のところで、動画ファイルのパス、分割ファイルの保存先パス、分割ファイル名(連番数字をつける前の名前)をそれぞれ指定して、def関数に渡すようになっているのではないかと思います。

投稿2021/06/18 09:29

編集2021/06/18 09:32
Uka

総合スコア28

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

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

shktech

2021/06/18 11:52

ご回答ありがとうございます。 save_all_frames('data/temp/sample_video.mp4', 'data/temp/result', 'sample_video_img') ここの意味が解っていなかったのでものすごく助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問