今回はラズパイで画像キャプチャや、動体検知をPythonを使ってやってみる。
最後にPicamera2のインストールもしてみる。
像をキャプチャしてみる
import cv2
import sys
camera = cv2.VideoCapture(0)
ret, frame = camera.read()
if not ret:
print("read error")
sys.exit()
cv2.imwrite('capture.jpg', frame)
camera.release()
上のコードを適当な名前をつけて、保存し実行する。(ここではct.pyというファイル名で保存した)
python ct.py
上のコマンドを実行して、うまくいくとカレントディレクトリにcapture.jpgというファイル名で、カメラでキャプチャした画像が保存される。
動体検知してみる
import cv2
cap = cv2.VideoCapture(-1)
avg = None
i = 0
while(True):
i += 1
ret, frame = cap.read()
if not ret:
print("capture failed...")
break
#グレースケール化
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#cv2.imwrite('g' + str(i) + '.jpg', gray)
if avg is None:
# 最初のフレームを保存
avg = gray.copy().astype("float")
continue
# 最新画像、平均画像(in/out)、最新画像の重み(数値がでかいほうが過去を忘れやすいはず)
cv2.accumulateWeighted(gray, avg, 0.5)
frame_delta = cv2.absdiff(gray, cv2.convertScaleAbs(avg))
#cv2.imwrite('d' + str(i) + '.jpg', frame_delta)
#画像を2値化
# 対象画像、閾値、最大値、タイプ。戻り値は閾値、変換後画像
bin_img = cv2.threshold(frame_delta, 3, 255, cv2.THRESH_BINARY)[1]
# 輪郭抽出
contours = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
diff_num = 0
# 差分箇所描画
for target in contours:
x, y, w, h = cv2.boundingRect(target)
# 差分範囲が小さい場合は無視する
if w * h < 10:
continue
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
diff_num += 1
if diff_num > 0:
cv2.imwrite('b' + str(i) + '.jpg', bin_img)
cv2.imwrite('r' + str(i) + '.jpg', frame)
cap.release()
このプログラムを実行すると、動体検知した場合2値化した画像(bxx.jpg)と、キャプチャした画像に動きを検知した部分を描画した画像が保存される。
Picamera2を使ってみる
Picamera2インストール前の準備
sudo apt install -y python3-libcamera python3-kms++
sudo apt install -y python3-prctl libatlas-base-dev ffmpeg python3-pip
sudo apt install -y python3-pyqt5 python3-opengl # only if you want GUI features
pip3 install numpy --upgrade
公式では上のコマンドが掲載されていたが、ffmpegいがいインストール済みだった。
採用環境がCUIなので、pyqt5、openglは試していない。
Picamera2のインストール
sudo pip3 install picamera2
とここまでやってみたが、Picamera2はすでにインストールされていた
from picamera2 import Picamera2, Preview
import time
picam2 = Picamera2()
camera_config = picam2.create_preview_configuration()
picam2.configure(camera_config)
picam2.start_preview(Preview.NULL)
picam2.start()
time.sleep(2)
picam2.capture_file("test.jpg")
これを実行すると、エラーが出てしまった。
内容は、Legacy Cameraを有効にしているのがだめだった。raspi-configで無効にするときたいどおりの動作となった。