RaspberryPiでタイムラプス撮影を試みるため、Pythonのcv2を用いました。
本記事では、1分ごとにカメラで撮影する際、撮影した画像が変化しない問題が発生したため、その解決策を紹介します。
問題
先述の通り、RaspberryPiで1分ごとに撮影した画像が変化しません。
1枚目
![](https://enjoy-pglife.com/wp-content/uploads/Articles/2022/01/copy.jpg)
その後、場所を変えて、1分後、再度撮影された画像です。
2枚目
![](https://enjoy-pglife.com/wp-content/uploads/Articles/2022/01/copy_2.jpg)
このように1枚目と2枚目の写真は変わりません。左下の時刻を見ると同じ写真ではないことがいえます。
ソースコード
この記事は、過去の記事の続きです。コードの詳しい説明はこちらの記事をご覧ください。
# -*- coding: utf-8 -*-
import os
import cv2
import datetime
from time import sleep
cap = None
count=0
camera_port = 0 # USBカメラのデバイスは0 (/dev/video0)
cap = cv2.VideoCapture(camera_port)
while(True):
ret, im = cap.read()
tm=datetime.datetime.today().strftime("%Y/%m/%d %X")
if ret==True:
cv2.putText(im,tm,(20,450),cv2.FONT_HERSHEY_PLAIN,2,(255,255,0))
file_name ="snapshot.jpg"
print (file_name)
cv2.imwrite(file_name, im)
print("File written")
sleep(60)
cap.release()
cv2.destroyAllWindows()
因みに、このソースコードは他のサイトでも同様なソースコードになります。
解決方法
以下のように変更することで、無事解決しました。
# -*- coding: utf-8 -*-
import os
import cv2
import datetime
from time import sleep
cap = None
count=0
camera_port = 0 # USBカメラのデバイスは0 (/dev/video0)
#cap = cv2.VideoCapture(camera_port)
while(True):
cap = cv2.VideoCapture(camera_port)
ret, im = cap.read()
tm=datetime.datetime.today().strftime("%Y/%m/%d %X")
if ret==True:
cv2.putText(im,tm,(20,450),cv2.FONT_HERSHEY_PLAIN,2,(255,255,0))
file_name ="snapshot.jpg"
print (file_name)
cv2.imwrite(file_name, im)
print("File written")
sleep(60)
cap.release()
#cap.release()
cv2.destroyAllWindows()
#cv2.destroyAllWindows()
前のソースコードとの違いは、10行目のcap = cv2.VideoCapture(camera_port)
と23,25行目のcap.release()cv2.destroyAllWindows()
を繰り返し処理の中の最初と最後にcap = cv2.VideoCapture(camera_port)
とcap.release()
cv2.destroyAllWindows()
を移動しただけになります。
そもそもcv2.VideoCapture(camera_port)は、動画ファイルの読み込み、カメラ映像の読み込み処理をするコードになります。
なお、今回はカメラ映像の読み込み処理になります。
問題が発生したとき、繰り返し処理の外側にcv2.VideoCapture(camera_port)にあり、前の画像がそのまま読み込まれていたと考えられます。
cap.release()は、映像を閉じるコードです。
しかし、以前は前のソースコードでも正常に動いていたため、本当の原因は分かりません。
分かり次第、紹介します。