Raspberry Piでカメラを使ってみる

今回はラズパイで画像キャプチャや、動体検知を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で無効にするときたいどおりの動作となった。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください