ラズパイゼロで
ダイレクト TCP ストリーミングでの配信と
opencv で MacBookAir で再生
とりあえずラズパイゼロWをセット
sudo apt-get update sudo apt-get upgrade
のあと
sudo raspi-config
で
最初のメニューの5番目の項目、Interfacing Optionsを開くと1番上にカメラの項目があるのでこれを有効化
再起動になるので
再度SSHで接続する
ラズパイゼロだと非力なので画像処理などは難しそうだけど
とりあえず
v4l2-ctl –list-devices
使用するカメラのデバイスファイルを調べる
結果は
bcm2835-codec-decode (platform:bcm2835-codec): /dev/video10 /dev/video11 /dev/video12 /dev/video18 /dev/video31 /dev/media2 bcm2835-isp (platform:bcm2835-isp): /dev/video13 /dev/video14 /dev/video15 /dev/video16 /dev/video20 /dev/video21 /dev/video22 /dev/video23 /dev/media0 /dev/media1 mmal service 16.1 (platform:bcm2835_v4l2-0): /dev/video0
次に
v4l2-ctl -d /dev/video0 --list-formats
で
サポートしている動画のフォーマットを表示
結果は
ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'YU12' (Planar YUV 4:two:0) [1]: 'YUYV' (YUYV 4:two:2) [2]: 'RGB3' (24-bit RGB 8-8-8) [3]: 'JPEG' (JFIF JPEG, compressed) [4]: 'H264' (H.264, compressed) [5]: 'MJPG' (Motion-JPEG, compressed) [6]: 'YVYU' (YVYU 4:two:2) [7]: 'VYUY' (VYUY 4:two:2) [8]: 'UYVY' (UYVY 4:two:2) [9]: 'NV12' (Y/UV 4:two:0) [10]: 'BGR3' (24-bit BGR 8-8-8) [11]: 'YV12' (Planar YVU 4:two:0) [12]: 'NV21' (Y/VU 4:two:0) [13]: 'RX24' (32-bit XBGR 8-8-8-8)
ラズパイで動画を撮影する方法として、FFmpegを使用してリアルタイムでハードウェアエンコードする方法がよく紹介されていますが、特にRaspberry Pi Zeroだとフレームレートがあまり出ないのでドラレコには不向き
しかしハードウェアエンコードなんてしなくても、H.264をサポートしているカメラモジュールを使用すれば、専用の動画撮影コマンドraspividを実行することで簡単にH.264動画を撮影することが可能
安価なUSB接続のWebカメラだとH.264をサポートしていなかったりしますが、私が確認した限りではラズパイ向けのカメラモジュールはどれもH.264をサポートしているので、基本的にraspividで録画することをおすすめ
raspividで動画を撮影するには
もっともシンプルに書くなら、-oで出力ファイル名のみを指定してこのように記述
なお指定した名前のファイルが既に存在する場合は実行に失敗するので注意
raspivid -o test.h264
このように何も指定せずに実行すると5秒の動画ファイルが生成される
とりあえず動画撮影はできたので
UDP配信をしてみる
これにはUDPストリーミング配信先のIPアドレスが必要
MacbookAir でまずは実験するので
LanScanでネットワークのIPアドレスを表示
192.168.1.137がアドレスなのが判明したので
RaspberryPiをWebカメラとして使用する
を参考に
raspivid -a 12 -t 0 -w 1920 -h 1080 -hf -ih -fps 30 -o udp://192.168.1.137:5000
を実行しても
mmal: Failed to write buffer data (2470 from 5350)- aborting mmal: Failed to write buffer data (2739 from 8877)- aborting
となってしまう
raspivid -a 12 -t 0 -w 1920 -h 1080 -vf -ih -fps 30 -l -o tcp://0.0.0.0:5000
で
ダイレクト TCP ストリーミング
はできた
リモートの環境のPythonからOpenCVを使い、手元のWebカメラの映像を読みたい
を参考に
vim camera.py
で
import cv2 cap = cv2.VideoCapture("tcp://192.168.1.215:5000") # 配信のURLを指定 while True: k = cv2.waitKey(1) if k == 27: # ESC key break ret, frame = cap.read() if not ret: continue cv2.imshow('Raw Frame', frame) cap.release() cv2.destroyAllWindows()
で保存
これで実行するとmac でラズパイゼロの動画が表示できる
後はここから mac側で画像認識とかできるかテストしていく