Jetson nanoでタイムラプス動画の撮影

シェアする

jetson nanoで長時間の動画撮影をすると、sdカードの容量が足らなくなったり、パソコンへの移動が大変になったりします。(そもそもうちのSDカードが、1ファイルあたり4GBまでしか受け付けてくれない。)

なので、タイムラプスを撮るためのコードを紹介します。

要素は

  • 写真を一秒ごとに撮影する
  • 撮影した画像を動画に変換する

です。

それぞれの作業は、以下のサイトを参考にしました。

・写真を撮る

qiita.com

・写真からタイムラプス動画を作る

life100create.com

・フォルダ内の画像ファイルを削除する

note.nkmk.me

コード

コードに日本語が入っているとエラーを起こすそうなので、コメントは英語で書いてます。

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 = 1080

GST_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カード販売中