opencvで出力される動画が倍速になることがある

python

1コード1 2# -*- coding: utf-8 -*-3""" 4Created on Tue Mar 28 18:05:27 2023 5 6@author: kawashima 7"""8 9# -*- coding: utf-8 -*-10""" 11Created on Mon Mar 27 19:18:37 2023 12 13@author: kawashima 14"""15import os 16os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0"17import cv2 18import time 19import serial 20import csv 21 22# Arduinoのポート名23ser = serial.Serial('COM3', 9600)24 25# データを保存するためのリスト26data = []27 28# 録画時間(秒)29record_time = 36030# カメラの設定31cap1 = cv2.VideoCapture(0)32cap2 = cv2.VideoCapture(1)33cap1.set(cv2.CAP_PROP_FPS, 30)34cap2.set(cv2.CAP_PROP_FPS, 30)35 36# 動画保存の設定37fourcc = cv2.VideoWriter_fourcc(*'XVID')38out1 = cv2.VideoWriter('output1.avi', fourcc, 30.0, (640, 480))39out2 = cv2.VideoWriter('output2.avi', fourcc, 30.0, (640, 480))40 41# 録画フラグの初期化42recording = False43 44# 録画開始時間の初期化45start_time = None46 47while True:48 # フレームの取得49 ret1, frame1 = cap1.read()50 ret2, frame2 = cap2.read()51 52 # キー入力の取得53 key = cv2.waitKey(1)54 55 # sキーが押された場合の処理56 if key == ord('s'):57 recording = True58 start_time = time.time()59 print("Recording started")60 # プログラム開始時刻を保存61 # 録画中の場合の処理62 if recording:63 # 動画にフレームを追加64 out1.write(frame1)65 out2.write(frame2)66 # Arduinoからデータを受信67 line = ser.readline().decode().strip()68 print(line)69 # 受信したデータをカンマで分割70 x, y, z, timestamp = line.split(',')71 72 # プログラム開始時刻からの経過時間を計算73 elapsed_time = time.time() - start_time 74 75 # データを保存76 data.append([elapsed_time, x, y, z])77 78 # 指定した録画時間が経過した場合の処理79 if elapsed_time > record_time:80 recording = False81 print("Recording stopped")82 break83 84 # 画面表示85 cv2.imshow('camera1', frame1)86 cv2.imshow('camera2', frame2)87 88 # qキーが押された場合の処理89 if key == ord('q'):90 break91# データをCSVファイルに出力92with open('acceleration_data.csv', mode='w', newline='') as f:93 writer = csv.writer(f)94 writer.writerow(['Time (s)', 'Acceleration X', 'Acceleration Y', 'Acceleration Z'])95 writer.writerows(data)96 97ser.close()98 99# 終了処理100cap1.release()101cap2.release()102out1.release()103out2.release()104cv2.destroyAllWindows()

python

1コード22import cv2 3 4# 動画ファイルのパス5video_path = 'output2.avi'6 7# 動画ファイルを開く8cap = cv2.VideoCapture(video_path)9 10# 動画のフレーム数を取得11frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))12 13# 動画のFPSを取得14fps = cap.get(cv2.CAP_PROP_FPS)15 16# 動画の長さ(秒)を計算17video_length_sec = frame_count / fps 18 19# 結果を表示20print(f'動画のフレーム数: {frame_count}')21print(f'動画のFPS: {fps}')22print(f'動画の長さ: {video_length_sec:.2f}秒')23 24# メモリを開放して終了25cap.release()26cv2.destroyAllWindows()

コードの説明

コード1
arduinoから送られてきたセンサーの値と時間のセットを拾いながら録画をするものです。
コード2
動画のフレーム数、fps、長さ、を調べるものです

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

1.録画した動画が、倍速になってしまいます。

2.プロパティで見た動画の長さは、record_timeよりも20秒ほど短いです。ですが、センサーから計算した値はほぼrecord_timeと同じでした。

試したこと

一様プログラム2を使って調べてみましたが、プロパティと同じです。

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

やがては動画をフレームに分割し、一枚一枚の画像に分割したものを解析し、センサーのデータと時間を用いて照らし合わせる予定です。

コメントを投稿

0 コメント