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

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

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

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

Python

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

Q&A

解決済

1回答

2859閲覧

Pyhton OpneCV 動画処理が進まない

shirakoponzu000

総合スコア9

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/08/17 15:31

実現したいこと

Python OpneCVで、動画(mp4)から5分間隔の300フレームの範囲で、もっとも輝度値が低い画像を抽出することを目指してます。

基本的な動作確認ができたのですが、本番のファイル(3.6GB、フレーム数429629、59.94fps)で実行すると、2つ目の画像抽出からよくわからない表示がでて、3つ目の画像抽出からエラーが発生します。

原因や対処方法がわかりましたら、教えていただけると幸いです。

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

カーネルを開始中にエラーが発生しました [h264 @ 00000237aca8e7a0] reference picture missing during reorder [h264 @ 00000237aca8e7a0] Missing reference picture, default is 2147483647

※上のh264の二行が繰り返しずっと表示されます。

該当のソースコード

Python

1import cv2 2import sys 3import numpy as np 4 5#設定 6filepath="164927.mp4" #動画ファイル名 7timestep=17982 #静止画抽出のフレーム間隔 ※59.94fpsの場合 5分=17982 8checknum=300 #フレームチェック数 ※59.94fpsの場合 5秒≒300 9 10#ビデオの読み込み 11cap=cv2.VideoCapture(filepath) 12#読み込めているかチェック 13if cap.isOpened()==False: 14 sys.exit() 15 16count = cap.get(cv2.CAP_PROP_FRAME_COUNT) 17fps = cap.get(cv2.CAP_PROP_FPS) 18 19print("count:{}, fps:{}".format(count,fps)) 20 21for num in range(1, int(count), int(timestep)): 22 23 meana=255 24 25 for numa in range(0,checknum,1): 26 numb=num+numa 27 28 #numbを現状のフレームに設定 29 cap.set(cv2.CAP_PROP_POS_FRAMES, numb) 30 31 ret,img=cap.read() 32 grayimg=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 33 34 # 一次元配列化 35 grayimg = np.array(grayimg).flatten() 36 mean = grayimg.mean() 37 38 meanb=mean 39 40 if meanb<=meana: 41 meana=meanb 42 numc=numb 43 44 45 #numcを現状のフレームに設定 46 cap.set(cv2.CAP_PROP_POS_FRAMES, numc) 47 ret,imgout=cap.read() 48 print("{:0=8}".format(numc)+".jpg") 49 cv2.imwrite("picture{:0=8}".format(numc)+".jpg", imgout) 50 51cap.release()

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

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

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

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

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

meg_

2020/08/17 16:26

print()の出力結果はどうなっていますか?
shirakoponzu000

2020/08/18 00:06

実行すると以下の出力がでてから、エラーで止まります。 count:429629.0, fps:59.94005994005994 00000196.jpg [h264 @ 000001c3e96064e0] reference picture missing during reorder [h264 @ 000001c3e96064e0] Missing reference picture, default is 2147483647 ※h264がくりかえし
t_obara

2020/08/18 02:01

動画のデコーダが出力しているのではないでしょうかね。何を入れていますか?もしかすると、そのファイルフォーマットに問題があるのではないでしょうか。
shirakoponzu000

2020/08/18 02:25

何を入れているか、どう調べるのかわからないので教えていただけるとありがたいのですが、動画ファイルとしては Panasonicのデジタルビデオカメラで撮影しm2tsファイルを作成、m2tsだと解析できそうにないので、mp4を変換としています。 mp4への変換は下記サイトを参考にAvidemuxを使用しました。 https://cidresweet.com/mts_mp401
t_obara

2020/08/18 15:32

OSはなんですか?Windowsならプロパティを見ればわかるかもしれません。 https://stackoverflow.com/questions/27870545/decode-h264-video-using-libavcodec-c メッセージからすると、このあたりを見ると、対象のフレームデータが壊れているか、足りない様に思います。 ただ、どう解決すれば良いのかはわかりません。最初から順に`cap.set(cv2.CAP_PROP_POS_FRAMES, numb)`を省いたらどうでしょうか。
shirakoponzu000

2020/08/19 15:09

mp4の変換方法を他の方法に変えて、簡易的に試したら進みました。 アドバイスの通り動画ファイルの問題の可能が大きい模様です。 データ量が多くて最後まで確認できていないのですが、動画の最後まで確認などできたら報告させていただきます。
guest

回答1

0

自己解決

動画のmp4ファイルに問題がありました。
mt2sからmp4ファイルへ変換し、拡張子がmp4となっていることを確認しましたが、
適切に変換されなかったようです。

作成したコードでmt2sをそのまま実行したところ、同じエラーが発生しました。
一方で、別の方法でmp4変換をしたmp4ファイルを対象に実行したら、問題なくプログラムは進みました。

色々とコメントありがとうございました。

投稿2020/08/25 15:04

shirakoponzu000

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問