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

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

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

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

保存

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

3438閲覧

OpencvでWebカメラから動画を0.1秒刻みで保存したい。

anakinsky

総合スコア6

OpenCV

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

保存

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

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2020/01/15 07:05

前提・実現したいこと

OpencvでWebカメラから通常の映像と、背景差分処理をした映像を保存するプログラムを作りましたが、動画を保存している間隔が0.06秒、次は0.08秒、次は0.07秒後だったりと、不規則でした。
そこで、Webカメラの映像を均一に0.1秒ごとに保存するプログラムにしたいのですが、方法がわかりません。
ご教授をお願いします。

環境

Raspberry PI4で
Thonny Python IDEを用いて実行しています。
.python 3.7.3
.opencv version 3.2.0

該当のソースコード

python3

1# coding: utf-8 2import cv2 3from datetime import datetime 4import time 5from decimal import Decimal,ROUND_HALF_UP 6import decimal 7 8 9cap = cv2.VideoCapture(0) 10 11# 動画ファイル保存用の設定 12 13 # カメラのFPSを取得 14fps = int(cap.get(cv2.CAP_PROP_FPS)) 15 16 # カメラの横幅を取得 17w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 18 19# カメラの縦幅を取得 20h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 21 22# 動画保存時のfourcc設定(avi用) 23fourcc = cv2.VideoWriter_fourcc(*"DIVX") 24 25# 動画の仕様(ファイル名、fourcc, FPS, サイズ) 26video = cv2.VideoWriter('video2.avi', fourcc, fps, (w, h), False) 27video1 = cv2.VideoWriter('video3.avi', fourcc, fps, (w, h)) 28 29#背景差分の設定 30bgs = cv2.createBackgroundSubtractorKNN() 31 32#仕事関数 33def task(): 34 while(cap.isOpened()): 35 ret, frame = cap.read() 36 37 #画像をWebカメラから読み込んだ時間 38 t1=time.perf_counter() 39 40 #時刻を画像に貼り付け 41 date = datetime.now().strftime("%H:%M.%S.%f") 42 cv2.putText(frame, date, (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255,255), 3, cv2.LINE_AA) 43 44 #背景差分化 45 mask = bgs.apply(frame) 46 47 #cv2.imshow('mask',mask) 48 #cv2.imshow('frame',frame) 49 50 #動画保存 51 video.write(mask) 52 video1.write(frame) 53 54 #画像を保存し終えた時間 55 t2=time.perf_counter() 56 57 #画像保存にかかった時間を求める 58 elapsed_time = t2-t1 59 60 #待つ時間を求める 61 wait_time=0.1-elapsed_time 62 63 #0.001の位で四捨五入する 64 t3=Decimal(wait_time).quantize(Decimal(".001"),rounding=ROUND_HALF_UP) 65 66 #待つ 67 time.sleep(t3) 68 69 #Q押したら終了 70 key = cv2.waitKey(1) & 0xFF 71 if key == ord('q'): 72 break 73 74task() 75 76#後処理 77cap.release() 78cv2.destroyAllWindows() 79

試したこと

画像を保存し終えた時間(t2)から、画像をWebカメラから読み込んだ時間(t1)を引き、画像保存にかかった時間(elapsed_time)を求め、0.1から画像保存にかかった時間を引きその時間(t3)をsleepで待つことで、0.1秒おきに保存できないかと考えました。
が、t3に値は入っているのですが、t3秒sleepが動作しませんでした。

t1=time.perf_counter() ~画像保存~ t2=time.perf_counter() elapsed_time = t2-t1 wait_time=0.1-elapsed_time t3=Decimal(wait_time).quantize(Decimal(".001"),rounding=ROUND_HALF_UP) time.sleep(t3)

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

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

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

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

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

guest

回答1

0

ベストアンサー

結論から申し上げますと、0.1秒ぴったりで取得することは困難です。
また、可能な機種に限られますが、Webカメラ側の設定を変更する必要があります。

動画では、1秒間あたり何枚の静止画が含まれるかというパラメータとしてフレームレートというものがあります。
Webカメラであっても同様で、このフレームレート分の時間単位でしか、画像を取得することはできません。
一般的には、約30fps(1秒間あたり30枚)のものが多いようです。

フレームレートは厳密に数字通りに静止画が入っているわけではなく、あくまで目安に過ぎません。

投稿2020/01/15 08:20

kazto

総合スコア7196

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問