fukumasa2のアイコン画像
fukumasa2 2024年09月20日作成 (2024年10月31日更新)
製作品 製作品 閲覧数 62
fukumasa2 2024年09月20日作成 (2024年10月31日更新) 製作品 製作品 閲覧数 62

チャ輪眼

概要

自転車に取り付けるドライブレコーダー

イメージ図
チャ輪眼イメージ

使用部品

Raspberry pi4
Pi camera
バッテリー

詳細

自転車に取り付けたPi cameraで得た情報からOpenCVで人や車、電柱などの障害物を検知すると、Pi cameraが事故の瞬間を録画し、ドライブレコーダーの役割を果たす

ソースコード

録画プログラム

import cv2 import time from picamera2 import Picamera2 # 顔検出のためのCascadeClassifierの読み込み face_detector = cv2.CascadeClassifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml") cv2.startWindowThread() # Picamera2の初期化 picam2 = Picamera2() picam2.configure(picam2.create_preview_configuration(main={"format": 'XRGB8888', "size": (640, 480)})) picam2.start() # 録画設定 recording = False recording_start_time = None output_video = None fourcc = cv2.VideoWriter_fourcc(*'XVID') # ビデオコーデックの設定 video_filename = 'recorded_video.mp4' # 録画ファイル名 while True: # カメラからフレームを取得 im = picam2.capture_array() # グレースケールに変換して顔検出 grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(grey, 1.1, 5) # 顔が検出された場合 if len(faces) > 0 and not recording: # 録画開始 print("顔を検出、録画を開始します") recording = True recording_start_time = time.time() output_video = cv2.VideoWriter(video_filename, fourcc, 20.0, (640, 480)) # フレームレート20で録画 # 録画中の場合、フレームを保存 if recording: output_video.write(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)) # 正しい色空間に変換して保存 if time.time() - recording_start_time >= 10: # 10秒経過したら録画を終了 print("録画終了") recording = False output_video.release() # 顔検出結果を画面に表示 for (x, y, w, h) in faces: cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0)) cv2.imshow("Camera", im) # ESCキーでループを抜ける if cv2.waitKey(1) & 0xFF == 27: break # カメラとウィンドウを解放 # picam2.stop() # cv2.destroyAllWindows() # # # 録画されたビデオを再生 # cap = cv2.VideoCapture(video_filename) # # if cap.isOpened(): # print(f"録画されたビデオ {video_filename} を再生します") # while cap.isOpened(): # ret, frame = cap.read() # if not ret: # print("ビデオの再生が終了しました") # break # cv2.imshow('Recorded Video', frame) # # # ESCキーで再生を終了 # if cv2.waitKey(25) & 0xFF == 27: # break # else: # print(f"ビデオファイル {video_filename} を開けませんでした") cap.release() cv2.destroyAllWindows()

まとめ

OpenCVに車や電柱など様々な障害物を学習させていく予定だったが、学習させるために必要な画像が足らずうまくいかなかったため、最初から学習されている顔認証をベースに作成した。
今後、時間があるときに少しずつ学習させていきたい。
また、顔を検知した際に録画する都合、人の顔が必ず映ってしまうため実行動画はありません。

実行イメージ
キャプションを入力できます

参考文献

【ラズベリーパイ】監視カメラの作り方:https://sozorablog.com/camera_shooting/#ラズベリーパイでカメラ映像-動画-を表示する

OpenCVのカスケード分類器を自作して画像認識:https://www.pc-koubou.jp/magazine/21280#section03-01

ログインしてコメントを投稿する