【RaspberryPi】HDMIカメラ化する

最初に公開してから、若干追記を行いました。

最近、知り合いとコロナ禍の配信界隈で大人気BlackmagicさんのATEM miniの話になって、HDMIで接続するカメラ高いよね~という話で盛り上がりました。

通常の使用を考えると3つぐらいの入力はなんとなく想像できるのですが、どんなものを映像ソースとしてしようしているのかなと興味はあります。(PC画面、手元、全景ぐらいかなと思うのですが)YouTuberの方々がよく使用されているデジタル一眼レフHDMI接続し、それを入力ソースとしてしようすることも考えられるのですが、そこまで気合をいれるというのも価格的には厳しいので、Raspberry Piをカメラ化できると嬉しいよねという話になりました。古いiPhoneがあるなら、それを使ったほうが画質はいいのかも?というのはやめておきますw

今年に入ってRaspberry Pi High Quality Camera RPI-HQ-CAMERAが公式から発表されたこともあるので、これを使用すればかなりの画質の向上も望めます。

www.seeedstudio.com

CSI接続のカメラをHDMI化するモジュールもでているそうなのですが、そのままHDMIの画面をスイッチャーに入力すればもう少し安くできるよねという話になったので、その検証をとなります。

既に、そのときに話をしていたSeeedの中の方が行っていますが、現状機材のない自分はとりあえずできるところまでやってみることにしました。以下のエントリーとほぼ同じですので以下を先に見てから、余談程度にみてもらえるといいかなと思います。

lab.seeed.co.jp

参考エントリーと異なる点としては

  • ATEM miniはないのでHDMIキャプチャデバイスで代用(到着まち)
  • RaspberryPiHQカメラがないのでRaspberryPiカメラV1.3で代用(到着まち)
  • RaspberryPi Zero用の変換フレキシブルケーブルがないのでRaspberryPi3Bで代用(到着まち)

これぐらいの制限付きで行っています。手元にものが揃えばRaspberryPi Zeroでも大きく変更なく実現できるかと思います。他にもRaspberry Pi2が手元に余っていれば、HQカメラモジュールをつけると有効利用できるのでは?と思います。

作業手順

手順は以下の通りになるかなと思います。

  1. Raspberry Pi OSのインストール(X環境が必要になると思いますが、基本的にはほぼデフォルトの状態でOKのはず)
  2. CSIカメラモジュールでの録画(コマンドのテスト)
  3. カメラアプリケーションの起動時の自動起動
  4. ファイルシステムのリードオンリー化

1. Raspberry Pi OSのインストールに関して

通常のインストールで問題ないと思います。 ネットワーク設定とカメラ接続・カメラインターフェース有効化(raspi-config)は行っておきましょう。

カメラインターフェースのCLIでの設定

raspi-configコマンドを実行して

$ sudo raspi-config

f:id:ueponx:20200810141140p:plain

カーソルを移動して、【5. Interfacing Options】でEnterキー押下。

f:id:ueponx:20200810141304p:plain

【P1 Camera】でEnterキーを押下。

f:id:ueponx:20200810141517p:plain

【Would you like the camera interface to be enabled?】と尋ねられるので【<はい>】(yes)でEnterキーを押下します。

f:id:ueponx:20200810141400p:plain

f:id:ueponx:20200810141804p:plain

あとはメニューに戻り終了時に再起動を求められるので、再起動すればCameraモジュールを使用する事ができるようになります。

f:id:ueponx:20200810141910p:plain

カメラインターフェースのGUIでの設定

GUIの場合にはX上の設定から行うことができます。

メニューのRaspberryPiの左上のアイコンをクリックして、プルダウンメニューから【設定】→【RaspberryPiの設定】をクリックします。

f:id:ueponx:20200810142133p:plain

設定のダイアログが表示されるので、【インターフェース】タブをクリックして、

f:id:ueponx:20200810140203p:plain

一番上にあるカメラのラジオボタンの設定を【有効】に変更して【OK】ボタンをクリックします。

f:id:ueponx:20200810142533p:plain

設定後に再起動を行えばカメラモジュールの使用ができるようになります。

カメラモジュールの接続確認

インターフェースを有効後に再起動ができたら、以下のコマンドを実行して認識状況を確認します。

$ vcgencmd get_camera

実行後の結果のdetectedの値が1になっていれば認識が行われています。(接続されていない場合はこの値は0になっています)

f:id:ueponx:20200810142949p:plain

これでOKです。

追記:GUI環境のオートログインの設定も必要になります。設定しない場合には、起動後にログイン画面が表示されっぱなしになります。raspi-configコマンドなどで同様に設定を行ってください。

2. CSIカメラモジュールでの全画面表示(コマンドのテスト)

あとはXの画面上にカメラ映像が表示されれば良い状態になります。ただし全画面設定にしないとカメラっぽくならないのでその部分は注意かなと思います。

結論としてはRaspberryPiで標準に存在するraspividコマンドを使用すればよいようです。自分は勘違いしていて、全画面表示を行ってもメニューは残ってしまうのかなと思ってしまい、Pythonでpicameraモジュールを使用して実装していました。OpenCVなどを使用するならそのやり方もなくはないので念の為そちらも紹介します。

raspividコマンドを使用

以下のコマンドで実行すると全画面表示+時間無制限の表示ができます。通常は録画を行うことがほとんどなのですが、オプションをつけることでカメラのような動きをさせることができます。

$ /usr/bin/raspivid -f -t 0

pythonからpicameraモジュールを使用

以下のようなpythonのコードでも同様のことが行なえます。start_preview()は録画を行わずに表示だけを行います。このプログラムはCtrl+Cで終了します。(pythonはVersion3系を使用しています)

import picamera

camera = picamera.PiCamera()
try:
    camera.start_preview()
except KeyboardInterrupt:
    pass
finally:
    camera.stop_preview()
    camera.close()

どちらも同じ動きをしますが、pythonを使用する方が負荷が高くなります。(CPU負荷はRaspberryPi 3B使用時の値です)

  • raspividコマンドの場合 … CPU負荷2%以下
  • pythonpicameraモジュールを使用した場合 … CPU負荷20%前後

RaspberryPi Zeroでの使用を考えるならば、raspividコマンドを使用する方がいいでしょう。OpenCVなどで編集や文字入れをするのであれば、後者でもいいかもしれませんが、コマ落ちする可能性は多分にあると思います。

HDMIからの出力

f:id:ueponx:20200810160115p:plain

やっぱり標準カメラの画質は良くない。HQカメラモジュールの到着を期待したいところですね。今回はHDMIの出力をAverMediaのキャプチャデバイスを使用して静止画をとっています。


3. カメラアプリケーションの起動時の自動起動

電源投入時にアプリケーションを自動的に実行することになりますが、これは以下のエントリーが非常に詳しいので参考にしています。

qiita.com

今回はX上のプログラムの自動起動なので

autostart を使用する方法を使います。

$ mkdir -p ~/.config/lxsession/LXDE-pi
$ cp /etc/xdg/lxsession/LXDE-pi/autostart ~/.config/lxsession/LXDE-pi/
$ echo '/usr/bin/raspivid -f -t 0' >> ~/.config/lxsession/LXDE-pi/autostart

これでOKです。再起動を行うと自動的にHDMIポートからカメラの映像が出力されます。VNCなどではdisplay設定ができていないの表示されません。リアルなデバイスを使用して確認することをオススメします。


4. ファイルシステムのReadOnly化

あとはRaspberryPiの電源を、物理的に落とせる用にするためにファイルシステムをReadOnlyにします。本当であれば、ログなどの処理を止めたりするのがいいのかなと思いますが、私は結構めんどくさがりなので、ファイルシステムをOverlay設定にすることで、対処しようと思います。Overlay設定は厳密にいうとReadOnly化ではなくファイルの追記をtmpfsに書き込み、再起動をすると揮発するというものになります。

本格的に使用するのであればこちらを参考に設定することをお願いします。

github.com

億劫な人向けの設定

Overlay化は以下の手順で行います。

メニューのRaspberryPiの左上のアイコンをクリックして、プルダウンメニューから【設定】→【RaspberryPiの設定】をクリックします。

f:id:ueponx:20200810140157p:plain

RaspberryPiの設定ダイアログが表示されたら【パフォーマンス】タブをクリックします。

f:id:ueponx:20200810140203p:plain

表示が変わったら、Overlay File System項目の【Configure…】ボタンをクリックします。

f:id:ueponx:20200810140209p:plain

設定ダイアログが表示されます。

f:id:ueponx:20200810140214p:plain

Overlayの値を【Enabled】、Boot Partisionの値を【Read-only】に変更して、【OK】ボタンをクリックします。

f:id:ueponx:20200810152634p:plain

すると再起動を求められるので【はい】をクリックします。(別作業中であれば【いいえ】をクリックして改めて再起動してください)

f:id:ueponx:20200810140224p:plain

この設定で/bootはRead-onlyに変更して、/はOverlayに変更できています。

試しに/内にファイルを書き込み再起動を行うと、ファイルは消えます。

/bootファイルシステムへファイルの書き込み(Read-onlyなので失敗します)

f:id:ueponx:20200810153639p:plain

/ファイルシステムへファイルの書き込み

f:id:ueponx:20200810140230p:plain

再起動後の確認(書き込んだファイルがなくなっています)

f:id:ueponx:20200810140235p:plain

これで起動すれば自動的にカメラモジュールの映像がHDMI側に出力されます。電源リモート接続してshutdownコマンドで行わなくても大丈夫かなと思います。

終わりに

とりあえず、RaspberryPiのカメラモジュールを使ってHDMIカメラを作ることができたかなと思います。RaspberryPi Zeroなどにすればかなりお安くHDMIカメラデバイスが作れるのでいいかなと思います。HQカメラが届いたら、Cマウントのレンズや広角レンズをつかうことで、どれぐらい画質がよくなるのかを試してみたいと思います。

追記:このエントリーを書いた後にRaspberry Pi Zeroとカメラモジュールを接続するフレキシブルケーブルが届いたので、同じ設定を行いましたが問題なく動作しました。

f:id:ueponx:20200810214750j:plain

【参考】

lab.seeed.co.jp

qiita.com

/* -----codeの行番号----- */