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

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

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

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

Python 3.x

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

4210閲覧

webカメラ2台の映像を同期して保存したいが早送りになる

aqufiz

総合スコア70

OpenCV

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

Python 3.x

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

1クリップ

投稿2021/07/02 03:04

編集2021/07/02 03:07

PythonとOpenCVを使用して2台のwebカメラの映像をほぼ同期した状態で保存したいと考えています.
そのために,以下のプログラムを作成したのですが,作成された動画が早送りになってしまいうまくいきません.

Python

1import cv2 2from datetime import date, datetime 3import time 4import os 5 6save_path = "./data/"+str(date.today())+"/two_capture/"+str(datetime.now().hour)+"-"+str(datetime.now().minute) 7 8def main(): 9 10 fps = 30 11 os.makedirs(save_path,exist_ok=True) 12 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 13 14 15 #cap1 = cv2.VideoCapture(0, cv2.CAP_DSHOW) 16 cap1 = cv2.VideoCapture(1) 17 cap1.set(3,1280) 18 cap1.set(4,720) 19 #cap1.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) 20 width1 = int(cap1.get(cv2.CAP_PROP_FRAME_WIDTH)) 21 height1 = int(cap1.get(cv2.CAP_PROP_FRAME_HEIGHT)) 22 writer1 = cv2.VideoWriter(save_path+'/capture1.mp4', fourcc ,fps, (width1, height1)) 23 24 #cap2 = cv2.VideoCapture(1, cv2.CAP_DSHOW) 25 cap2 = cv2.VideoCapture(2) 26 cap2.set(3,1280) 27 cap2.set(4,720) 28 #cap2.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) 29 width2 = int(cap2.get(cv2.CAP_PROP_FRAME_WIDTH)) 30 height2 = int(cap2.get(cv2.CAP_PROP_FRAME_HEIGHT)) 31 writer2 = cv2.VideoWriter(save_path+'/capture2.mp4', fourcc ,fps, (width2, height2)) 32 33 while True: 34 a = time.time() 35 ret1, frame1 = cap1.read() 36 ret2, frame2 = cap2.read() 37 38 cv2.imshow('frame1',frame1) 39 cv2.imshow('frame2',frame2) 40 41 b = 1/(time.time()-a) 42 print("frame1:"+str(b)) 43 44 45 writer1.write(frame1) 46 writer2.write(frame2) 47 48 if time.time()-t0 > 30: 49 break 50 51 52 cap1.release() 53 cap2.release() 54 writer1.release() 55 writer2.release() 56 cv2.destroyAllWindows() 57 58 59if __name__ == "__main__": 60 main()

fpsは次のような値が出力されています.
fpsがフレームごとにかなり異なっているのと,30fpsを超えているのがおかしいと思うので,
こちらも原因を教えていただきたいです.

frame1:47.79452351379377 frame1:43.89229690557666 frame1:50.365090420038904 frame1:17.900279538228453 frame1:18.680455531356753 frame1:18.08872059825595 frame1:18.79875938973449 frame1:17.27081591896399 frame1:19.356598949632186 frame1:16.990962305807052 frame1:19.031626328351166 frame1:20.539673367449378 frame1:18.401962031703132 frame1:18.698860495390267 frame1:18.304627322280364 frame1:18.229208951396647 frame1:17.588245160857458 frame1:17.923380325024677 frame1:19.165112336703967

追記
別の方法として,subprocessでカメラの動画保存プログラムを2つ動かすという方法を試しましたが,
こちらではfpsが100を超えて表示されるにも関わらず,30fpsで早送りになっていました.
しかし,まずfps100になることがおかしいと思うので,こちらも同じ原因だと思います.

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

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

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

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

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

guest

回答1

0

ベストアンサー

カメラに対しても fps を指定してあげなければいけません。また、正確な fps を取得する方法も参考記事にあります。
Python, OpenCVで動画再生時のFPS(フレームレート)を測定・表示 | note.nkmk.me

投稿2021/07/02 04:52

A_kirisaki

総合スコア2853

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問