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 = 360 30# カメラの設定 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 = False 43 44# 録画開始時間の初期化 45start_time = None 46 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 = True 58 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 timestamp = time.time() 79 timestamps.append(timestamp) 80 # 指定した録画時間が経過した場合の処理 81 if elapsed_time > record_time: 82 recording = False 83 print("Recording stopped") 84 break 85 86 # 画面表示 87 cv2.imshow('camera1', frame1) 88 cv2.imshow('camera2', frame2) 89 90 # qキーが押された場合の処理 91 if key == ord('q'): 92 break 93# データをCSVファイルに出力 94with open('acceleration_data.csv', mode='w', newline='') as f: 95 writer = csv.writer(f) 96 writer.writerow(['Time (s)', 'Acceleration X', 'Acceleration Y', 'Acceleration Z']) 97 writer.writerows(data) 98 99ser.close() 100 101# 終了処理 102cap1.release() 103cap2.release() 104out1.release() 105out2.release() 106cv2.destroyAllWindows()
python
1コード2 2import 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()
arduino
1void setup() { 2 Serial.begin(9600); 3} 4 5void loop() { 6 uint8_t i; 7 long x=0; 8 long y=0; 9 long z=0; 10 long t=0; 11 for (i=0;i< 100;i++){ 12 x=x+analogRead(0); 13 y=y+analogRead(1); 14 z=z+analogRead(2); 15 16 } 17 x=x/100; 18 y=y/100; 19 z=z/100; 20 t=millis(); 21 22 Serial.print(x); 23 Serial.print(","); 24 Serial.print(y); 25 Serial.print(","); 26 Serial.print(z); 27 Serial.print(","); 28 Serial.print(t); // タイムスタンプ 29 Serial.print('\n'); 30 delay(20); 31} 32
コードの説明
コード1
arduinoから送られてきたセンサーの値と時間のセットを拾いながら録画をするものです。
arduinoとwebカメラ二台をusbでつなげています。
コード2
動画のフレーム数、fps、長さ、を調べるものです
コード3
arduinoに書かれているプログラムです
発生している問題・エラーメッセージ
1.録画した動画が、倍速になることがあります。
2.arduinoから最後に出された時間とカメラの録画時間が一緒になりません。
arduinoの時間はrecord_timeとほぼ同じになりますが、撮影した動画の長さはrecord_timeよりも短くなります。record_timeを20に設定すると13秒、400に設定すると243秒程度の動画になります。
試したこと
1.一様プログラム2を使って調べてみましたが、プロパティと同じです。
2.record_timeを400にしたとき、タイムスタンプをプログラム1の77行目のように追加しました。すると398秒でした。398秒撮影して243秒の動画を7311フレームで構成しています。
400秒程度撮影して400秒程度の動画を12000フレームで構成してもらう必要があります。
補足情報(FW/ツールのバージョンなど)
やがては動画をフレームに分割し、一枚一枚の画像に分割したものを解析し、センサーのデータと時間を用いて照らし合わせる予定です。
動画での時間とarduinoからのtimestampが合わないと(実験の性質上誤差0.05秒程度で)、困ります。
追加で行った実験
python
1# -*- coding: utf-8 -*- 2""" 3Created on Mon Mar 27 19:18:37 2023 4 5@author: kawashima 6""" 7import os 8os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0" 9import cv2 10import time 11 12# 録画時間(秒) 13record_time = 360 14# カメラの設定 15cap1 = cv2.VideoCapture(0) 16cap2 = cv2.VideoCapture(1) 17cap1.set(cv2.CAP_PROP_FPS, 30) 18cap2.set(cv2.CAP_PROP_FPS, 30) 19 20# 動画保存の設定 21fourcc = cv2.VideoWriter_fourcc(*'XVID') 22out1 = cv2.VideoWriter('output1.avi', fourcc, 30.0, (640, 480)) 23out2 = cv2.VideoWriter('output2.avi', fourcc, 30.0, (640, 480)) 24 25# 録画フラグの初期化 26recording = False 27 28# 録画開始時間の初期化 29start_time = None 30 31while True: 32 # フレームの取得 33 ret1, frame1 = cap1.read() 34 ret2, frame2 = cap2.read() 35 36 # キー入力の取得 37 key = cv2.waitKey(1) 38 39 # sキーが押された場合の処理 40 if key == ord('s'): 41 recording = True 42 start_time = time.time() 43 print("Recording started") 44 45 # 録画中の場合の処理 46 if recording: 47 # 動画にフレームを追加 48 out1.write(frame1) 49 out2.write(frame2) 50 51 # 指定した録画時間が経過した場合の処理 52 if time.time() - start_time > record_time: 53 recording = False 54 print("Recording stopped") 55 break 56 57 # 画面表示 58 cv2.imshow('camera1', frame1) 59 cv2.imshow('camera2', frame2) 60 61 # qキーが押された場合の処理 62 if key == ord('q'): 63 break 64 65# 終了処理 66cap1.release() 67cap2.release() 68out1.release() 69out2.release() 70cv2.destroyAllWindows()
動画を撮るシステムだけを残して動かしてみました。
record_time を360にすると
動画のフレーム数: 10800
動画のFPS: 30.0
動画の長さ: 360.00秒
と正常でした。やはり、途中で処理を挟むと負荷がかかりすぎてダメなのでしょうか
回答1件
あなたの回答
tips
プレビュー