2022年7月3日日曜日

Raspberry OS Liteでluvcviewを使ってUSBカメラの画像を表示


背景

画角を確認したいもののAndroid端末がUVCカメラと認識してくれないUSBカメラがあり、それを確認できる手軽な装置ができたら嬉しい場面があったのでRaspberry Piで確認装置を作ってみました。
取り組んだ内容をまとめます。

使ったもの

  • Raspberry Pi 3B+
  • HDMIモニタ
  • USBカメラ
  • SDカード、電源、USBキーボードなど、Raspberry Piの起動や操作に必要な装置

luvcviewをインストール

aptでインストールできます。
sudo apt install luvcview

使い方

USBカメラをRaspberry Piに繋げてluvcviewを実行すると動きます。
luvcview

segmentation faultが出て動かない場合は解像度を小さくすると動くことがあります。
luvcview -s 320x280

設定可能な解像度はUSBカメラを接続した状態で-Lを付けてluvcviewを実行すると出力されます。
luvcview -L
下記のような情報がずらりと表示されます。
全て貼り付けると長くなるので、一部を共有します。
luvcview 0.2.6

SDL information:
Video driver: fbcon
Hardware surfaces are available (600k video memory)
Device information:
Device path: /dev/video0
{ pixelformat = 'MJPG', description = 'Motion-JPEG' }
{ discrete: width = 1920, height = 1080 }
Time interval between frame: 1/30,
{ discrete: width = 1440, height = 1080 }
Time interval between frame: 1/30,
{ discrete: width = 1280, height = 720 }
Time interval between frame: 1/30,

# 中略

{ discrete: width = 320, height = 240 }
Time interval between frame: 1/30,
{ discrete: width = 176, height = 144 }
Time interval between frame: 1/30,
{ discrete: width = 2560, height = 1440 }
Time interval between frame: 1/30,

利用しているモニタは標準の640x480では画面に入り切らないためにsegmentation faultが発生するようなので、320x280の解像度を指定して実行します。


動きました。


「q」と入力するとluvcviewが終了してターミナルに戻ります。
終了前にUSBカメラを抜くと「q」コマンドを受け付けなくなり終了できなくなるので注意が必要です。

USBカメラ動作確認装置作成

下記の動作を繰り返せば目的を達成できます。
  1. USBカメラが接続される -> luvcviewを起動
  2. USBカメラが取り外される -> luvcviewを動作停止

上記の動作を行うスクリプトがこちらです。
#!/bin/sh

TARGET_DEVICE=/dev/video0
TARGET_SIZE=320x280

while [ 1 ]
do
UVCVIEW_PROCESS=$(pidof luvcview)
if [ -e $TARGET_DEVICE ]; then
if [ "$UVCVIEW_PROCESS" = "" ]; then
luvcview -s $TARGET_SIZE -d $TARGET_DEVICE &
fi
else
if [ "$UVCVIEW_PROCESS" != "" ]; then
kill $UVCVIEW_PROCESS
fi
echo waiting connection of $TARGET_DEVICE `date`
fi
sleep 1
done

USBカメラを取り外すとluvcviewを終了して接続待ちのログを出力します。


カメラを接続するとluvcviewを実行します。


紹介したコードはgithubにも上げています。
https://github.com/asukiaaa/pi-camera-display/blob/main/camera-display.sh

下記のコマンドでコードのダウンロードと実行ができます。
リポジトリのファイルは~/gitprojectsというディレクトリの中に配置しています。
sudo apt install -y git luvcview
mkdir -p ~/gitprojects
cd ~/gitprojects
git clone https://github.com/asukiaaa/pi-camera-display.git
cd pi-camera-display
./pi-camera-display.sh

/etc/rc.localの「exit 0」の前で呼び出せば起動時に実行されます。
/home/pi/gitprojects/pi-camera-display/camera-display.sh &

exit 0

電源を入れてUSBカメラを接続したら映像を表示する装置ができました。

余談: Raspberry PiOS Liteのモニタ出力切り替え方法が不明

luvcviewの処理をsudo kill -9で強制停止するとモニタの出力がターミナルに戻らないままになります。
デスクトップ版ならxserverを利用しているためarandrやxrandrなどで切り替えできそうですが、lite版はそれを使わずモニタの表示を処理しているようです。
自分が調べた範囲ではどう処理すればluvcviewのようにターミナルの出力と切り替えられるのか分かりませんでした。
(lite版はframe bufferなるものでモニタの情報を扱っているらしいですが、それでluvcviewの出力からターミナルに戻せるか不明です。)

ご存知の方がいらっしゃれば、コメントなどで共有していただけると嬉しいです。

参考:
Raspberry Pi - HDMI Configuration
How-To: Rasberry Pi Fullscreen Digital Wall Clock

余談: fimを使えば静止画を出力可能

fimというプログラムを使うとlite版のモニタに静止画を出力できます。
fim some.jpg

luvcviewと似た挙動をするプログラムとして情報を残します。

参考
fim - fbi improved
How to Display Images on Raspbian Command Line with fim

終わり

luvcviewを利用してUSBカメラを接続すれば画像を表示する装置を作れました。
luvcviewに切り替わったモニタ出力をluvcview強制終了後にターミナルに戻す方法をご存知でしたら、コメントなどで共有していただけると嬉しいです。

参考

Raspberry Piを使ってHDMIカメラを作ってみた
RaspberryPiへのUSBカメラと純正カメラモジュールの接続
ラズパイでUSBカメラを使うときに知っておきたいこと

0 件のコメント :