ラズパイゼロで ダイレクト TCP ストリーミングでの配信と opencv で MacBookAir で再生

ラズパイゼロで
ダイレクト 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側で画像認識とかできるかテストしていく