cv2 画像が変わらない件について

RaspberryPiでタイムラプス撮影を試みるため、Pythonのcv2を用いました。

本記事では、1分ごとにカメラで撮影する際、撮影した画像が変化しない問題が発生したため、その解決策を紹介します。

問題

先述の通り、RaspberryPiで1分ごとに撮影した画像が変化しません。

1枚目

その後、場所を変えて、1分後、再度撮影された画像です。

2枚目

このように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()は、映像を閉じるコードです。

しかし、以前は前のソースコードでも正常に動いていたため、本当の原因は分かりません。

分かり次第、紹介します。