jetson nanoで長時間の動画撮影をすると、sdカードの容量が足らなくなったり、パソコンへの移動が大変になったりします。(そもそもうちのSDカードが、1ファイルあたり4GBまでしか受け付けてくれない。)
なので、タイムラプスを撮るためのコードを紹介します。
要素は
- 写真を一秒ごとに撮影する
- 撮影した画像を動画に変換する
です。
それぞれの作業は、以下のサイトを参考にしました。
・写真を撮る
・写真からタイムラプス動画を作る
・フォルダ内の画像ファイルを削除する
コード
コードに日本語が入っているとエラーを起こすそうなので、コメントは英語で書いてます。
import cv2
import glob
import os
import shutil
import time# Parameter
rec_TimeStep = 1 #sec
recording_time = 2*60*60 #hour * 60min * 60sec
frame_size = 0 #FHD=0, 4K=1
frame_rate = 60 #FPS(10~100)
width = 1920
height = 1080GST_STR = ‘nvarguscamerasrc \
! video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=(fraction)30/1 \
! nvvidconv ! video/x-raw, width=(int)1920, height=(int)1080, format=(string)BGRx \
! videoconvert \
! appsink’dir_path = ‘images1’
base_path = ‘images1/pic’
ext = ‘jpg’def main():
cap = cv2.VideoCapture(GST_STR, cv2.CAP_GSTREAMER)
key2 = 0
wait = rec_TimeStep * 1000 # ms
os.makedirs(dir_path, exist_ok=True)n = 0
while True:
ret, frame = cap.read()
# Capture
cv2.imwrite(‘{}_{}.{}’.format(base_path, n, ext), frame)
n += 1# Finish
key = cv2.waitKey(int(wait))
print(key2)
if key2*rec_TimeStep == recording_time: # sec
cap.release()
cv2.destroyAllWindows()
break
key2 = (key2 + 1)def timelaps(images):
fourcc = cv2.VideoWriter_fourcc(‘m’,’p’,’4′,’v’)
video = cv2.VideoWriter(‘timelaps.mp4’, fourcc, frame_rate, (width, height))for i in range(len(images)):
img = cv2.imread(images[i])
img = cv2.resize(img,(width,height))
video.write(img)
video.release()def remove_glob(pathname, recursive=True):
for p in glob.glob(pathname, recursive=recursive):
#print(type(p))
if os.path.isfile(p):
os.remove(p)if __name__ == “__main__”:
remove_glob(base_path + ‘_*.jpg’)main()
print(“converting…”)
start = time.time()
# reverse=True
images = sorted(glob.glob(base_path + ‘_*.jpg’),reverse=False)
timelaps(images)
elapsed_time = time.time() – start
print(elapsed_time)
セットアップ済み+タイムラプス動画の撮影コード入りSDカード販売中