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

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

詳細はこちら
OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3465閲覧

動画からフレームデータを取得しながら、蓄積したデータに対して同時に処理したい

yohehe

総合スコア48

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/11/15 08:33

編集2019/11/15 08:34

python,jupyter labを用いてカメラデータの処理の勉強をしています。
カメラから取得したフレーム情報をリストに格納していき、処理を行いたいのですが、
フレームを格納したリストに画像などの処理を行っている時間動画の表示やデータの蓄積が止まってしまいます。
画像表示や蓄積を止めずに同時に蓄積したフレームデータを処理する方法はありますでしょうか。

何かアドバイスをいただけますと幸いです。よろしくお願いします。

以下 使用しているプログラムです。

python

1import numpy as np 2import cv2 3import matplotlib.pyplot as plt 4import time 5#カメラを設定 6cap = cv2.VideoCapture(0) 7frame_width = int(cap.get(3)) 8frame_height = int(cap.get(4)) 9 10#mp4で保存するため、以下を設定 11out = cv2.VideoWriter('test_.mp4',cv2.VideoWriter_fourcc('M','P','4','V'), 30, (frame_width,frame_height)) 12 13 14count=0 15frames_list=[] 16#--------------------------------- 17while(True): 18 ret, frame = cap.read() 19 if ret == True: 20 21 # Write the frame into the file 'output.avi' 22 #out.write(frame) 23 24 # Display the resulting frame 25 cv2.imshow('frame',frame) 26 27 #----------------------------------------------------------------- 28 #50フレーム格納すると処理を行うプログラムを実行する。 29 frames_list.append(frame) 30 count = count + 1 31 if count == 50: 32 33 print("150フレーム分取得,predict開始") 34 time_sta=time.time() #時間を計測する 35 frames_extracted=np.array(frames_list) 36 37 #------------------------------------------ 38 #ここで取得したframe_listに対して並列処理を行いたいです。 39 #------------------------------------------ 40 41 42 #処理が終了したため、frames_listを空にする 43 frames_list=[] 44 print("listを空にしました",len(frames_list)) 45 #countを0に戻す 46 count=0 47 48 # Press Q on keyboard to stop recording 49 if cv2.waitKey(1) & 0xFF == ord('q'): 50 break 51 52 # Break the loop 53 else: 54 break 55 56# When everything done, release the video capture and video write objects 57cap.release() 58out.release() 59 60# Closes all the frames 61cv2.destroyAllWindows() 62

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

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

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

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

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

guest

回答1

0

ベストアンサー

threadを使うのが良いと思います。
今あるカメラからのデータ取得をメインスレッドにして、データを裁く部分を子スレッドにするイメージです。

ただ、処理速度が「データ蓄積>データ処理」だと思いますので、

  • タイマーか何かを使って一定時間ごとに抜き取りでデータ処理する
  • 子スレッドが片付いたら次のデータを裁く

のようなことをしないとメモリがどんどん膨れ上がると思いますのでご注意ください。

投稿2019/11/15 23:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yohehe

2019/11/18 06:59

返信ありがとうございます。threadという手法を調べて試してみています。 確かに今のままだとデータ量が蓄積されるスピードが早すぎるため、処理が追いつかなくなってしまいます。 ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問