cv2の cap.read()がどうしても動かないので、libcameraコマンドを実行するように変更。
そぞらさん(https://sozorablog.com/camera_shooting/#toc2)
から、「V3を使用するには、公式のライブラリであるPicamera2を使用する必要があります。」との回答あり。
色々と考えたが、libcameraコマンドを呼ぶ方法とした。
参考サイト これはRPZ-IR-Sencer のサイト。ここにサンプルコーデイングがあるので、引用&加工。
https://www.indoorcorgielec.com/resources/raspberry-pi/pir-camera/
ますはひまじんがジムで不在の9:30ー11:30の間にだれがが侵入した場合、動画をとるように作成。
画像もパラメータ変更でとれます。
cronで9;30に実行して、2Hで終了させるpython 作成。
参考サイトのpythonを加工して以下で、camara_jinkan.pyで保存して確認。
これは動画でも画像でもとれるようになっています。
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import os
import time
import datetime
import subprocess
GPIO_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN,GPIO.IN)
# 時間計測開始
t_start = time.perf_counter()
# オプション
# HQカメラの場合
# 写真の最大サイズは4056x3040
# 動画(H.264)の最大サイズは1920x1080, 最大画角は1440x1080
image_size = (1440, 1080) # 撮影サイズの横幅, 高さ
mode = 'movie' # 写真なら'photo', 動画なら'movie'
# pi5 = False # Raspberry Pi 5の場合True, それ以外はFalse (動画撮影の手順が異なる)
save_dir = '/home/pi' # 写真や動画を保存するディレクトリ
# interval = 60 # 1度撮影した後、再開するまでのインターバル時間[秒]
movie_duration = 10 # 動画の撮影時間[秒]
while True:
# 現在時刻取得
t_end = time.perf_counter()
# 経過時間計算
elaps = t_end - t_start
# 2H超えたらブレーク
if elaps > 7200:
break
print(elaps)
if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
print("man search")
dt = datetime.datetime.now()
if mode == 'photo':
save_file = os.path.join(save_dir, dt.strftime('%y_%m%d_%H%M_%S.jpg'))
subprocess.run([
'libcamera-still', '-n', '-o',
os.path.join(save_file), '-t', '1', '--width',
str(image_size[0]), '--height',
str(image_size[1])
])
time.sleep( 10 )
break
elif mode == 'movie':
save_file = os.path.join(save_dir, dt.strftime('%y_%m%d_%H%M_%S.mkv'))
h264_file = os.path.join(save_dir, 'tmp.h264')
pts_file = os.path.join(save_dir, 'tmp.txt')
subprocess.run([
'libcamera-vid', '-n', '-o', h264_file, '--save-pts', pts_file, '-t',
str(movie_duration * 1000), '--width',
str(image_size[0]), '--height',
str(image_size[1])
])
subprocess.run(['mkvmerge', '-o', save_file, '--timecodes', '0:' + pts_file, h264_file])
os.remove(h264_file)
os.remove(pts_file)
time.sleep( 10 )
break
else:
print("man no search")
time.sleep( 1 )
GPIO.cleanup()
これで OK。
クーロンの登録
sudo crontab -e
ひまじんの不在タイミングに合わせて実行。
30 9 * * * /usr/bin/python3 /home/pi/camera_jinkan.py