編集履歴一覧に戻る
fukumasa2のアイコン画像

fukumasa2 が 2024年10月31日17時37分40秒 に編集

コメント無し

タグの変更

+

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

本文の変更

# 概要

-

人や電柱などの障害物を検知して教えてくれる

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

-

# イメージ図

+

> イメージ図

![チャ輪眼イメージ](https://camo.elchika.com/2daa6d84ee59500a1c82635c756b8c2e8e4e1569/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64663966616136612d626565392d343439332d383466392d6566363839366231633363382f38326132393431632d346164642d346164662d383137392d366432613338663463643066/)

-

#詳細 自転車に取り付けたPi cameraで得た情報からAiが障害物などを検知するとブザーを鳴らして知らせてくれる また、障害物などを検知したときPi cameraが録画を開始しドライブレコーダーの役割も果たす #必要なもの

+

# 使用部品

Raspberry pi4 Pi camera

-

Buzzer

バッテリー

+

# 詳細 自転車に取り付けたPi cameraで得た情報からOpenCVで人や車、電柱などの障害物を検知すると、Pi cameraが事故の瞬間を録画し、ドライブレコーダーの役割を果たす # ソースコード ```arduino:録画プログラム 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://camo.elchika.com/40c22593a2d200eb2138363d3c371973f56b4336/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64663966616136612d626565392d343439332d383466392d6566363839366231633363382f33333163663732652d323533352d343164392d616530382d663762373065383132303664/) # 参考文献 【ラズベリーパイ】監視カメラの作り方:https://sozorablog.com/camera_shooting/#%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E3%81%A7%E3%82%AB%E3%83%A1%E3%83%A9%E6%98%A0%E5%83%8F-%E5%8B%95%E7%94%BB-%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B OpenCVのカスケード分類器を自作して画像認識:https://www.pc-koubou.jp/magazine/21280#section03-01