Raspberry Pi Zero W + Arducam IMX219カメラを使用したMJPEGストリーミングサーバー。
- Raspberry Pi Zero Wでカメラ映像をリアルタイムストリーミング配信
- OS: Raspberry Pi OS Lite (Trixie)
- カメラ: Arducam IMX219 (8MP, Sony IMX219センサー)
- 接続: Wi-Fi経由でネットワーク接続
Arducamカメラをカメラポート(CSI)に接続
/boot/firmware/config.txtを編集:
sudo vi /boot/firmware/config.txt以下のように設定:
camera_auto_detect=0
dtoverlay=imx219
再起動:
sudo rebootrpicam-hello --list-cameras
# Arducam IMX219が表示されればOKsudo apt update
sudo apt full-upgrade
sudo apt install -y python3-picamera2 --no-install-recommends参考 「2.2. Installation and updating」
cd ~/Camera
python streaming_server.pyブラウザでhttp://raspberrypi:8000/stream.mjpgにアクセスして映像確認
raspi_camera/
├── .make/
│ └── Makefile # rsync同期用
├── .git/ # Gitリポジトリ
├── README.md # このファイル
├── streaming_server.py # MJPEGストリーミングサーバー
├── test_camera.py # カメラ動作確認スクリプト
└── ...
.make/Makefileは、PCとRaspberry Pi間のファイル同期を自動化するためのツールです。rsyncを使用して差分転送を行います。
RASPI_HOST = raspberrypi
RASPI_USER = pi
LOCAL_DIR = ..
REMOTE_DIR = ~/Camera
EXCLUDE_OPTS = --exclude '.make' --exclude '.git' --exclude '.gitignore' --exclude '.DS_Store' --exclude '__pycache__' --exclude '*.pyc'
.PHONY: download upload help
help:
@echo "使い方:"
@echo " make -C .make download - Raspberry Piからファイルをダウンロード"
@echo " make -C .make upload - Raspberry Piにファイルをアップロード"
download:
rsync -avz $(RASPI_USER)@$(RASPI_HOST):$(REMOTE_DIR)/ $(LOCAL_DIR)/
upload:
rsync -avz $(EXCLUDE_OPTS) $(LOCAL_DIR)/ $(RASPI_USER)@$(RASPI_HOST):$(REMOTE_DIR)/| 変数 | 説明 |
|---|---|
RASPI_HOST |
Raspberry Piのホスト名またはIPアドレス |
RASPI_USER |
Raspberry Pi側のユーザー名 |
LOCAL_DIR |
PC側のディレクトリ(相対パス) |
REMOTE_DIR |
Raspberry Pi側のディレクトリ |
EXCLUDE_OPTS |
アップロード時に除外するファイル/ディレクトリ |
重要: コマンド行は必ずタブ文字でインデント(スペース不可)
download:
→rsync -avz ... # ← この矢印がタブ文字- プロトコル: HTTP
- フォーマット: MJPEG (Motion JPEG)
- 解像度: 640x480 (デフォルト)
- フレームレート: 約30fps
[カメラ]
↓ 撮影
[MJPEGEncoder]
↓ JPEG圧縮
[StreamingOutput]
↓ バッファリング
[HTTPServer]
↓ multipart/x-mixed-replace
[ブラウザ/クライアント]
- 各フレームを独立したJPEG画像として送信
boundary=FRAMEで区切りながら連続送信- 接続を保持したまま永遠に送信(ストリーミング)
http://raspberrypi:8000/stream.mjpg
<img src="http://raspberrypi:8000/stream.mjpg" />import cv2
cap = cv2.VideoCapture('http://raspberrypi:8000/stream.mjpg')
while True:
ret, frame = cap.read()
if ret:
# フレーム処理
cv2.imshow('Camera', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()