Contents
- PDHにつないだUSBカメラ画像(静止画)の表示
- 1.概要
- 2. 導入手順
- 3. 使用した機材
- 4.fswebcamのRaspberry Pi4へのインストールと動作確認
- 4-1. USBカメラの認識確認
- 4-2. fswebcamのインストール
- 4-3. 動作確認
- 5. Node-REDでの撮影と表示
- 5-1. 必要ノードの追加:usbcameraノード、base64ノード
- 5-2. dashboardのTemplateノードを使用し表示
- 5-3.動作確認
- 5-4. 画像認識への展開
- Appendix-1. usbcameraノードを使わずに、execノードで撮影する方法
- A-1.概要
- A-2. Node-REDのフロー
- Appendix-2. 静止画の表示をサーバ側にも配信する方法
- A2-1.概要
- A2-2. Node-REDの記述
- 1) エッジ側のフロー
- 2) サーバ側のフロー
PDHにつないだUSBカメラ画像(静止画)の表示
1.概要
PDHにつないだUSBカメラ画像(動画)の表示では、mjpg-streamerを使ったRaspberry Pi4での“動画”の表示のさせ方を説明しました。
ここでは、fswebcamを使ったRaspberry Pi4での“静止画”の表示のさせ方を説明します。動画ができるのであれば、静止画は不要と感じられるかもしれませんが、静止画は動画に比べてデータ量が少ないというメリットがあります。現場のPDHで撮ったデータをサーバに送って目視確認するというようなことができるところが、静止画のメリットです。
fswebcamは、2023年6月以降にリリースされた“Software Version PDH-v140”には標準でインストールされています。
2. 導入手順
導入手順を以下にまとめます。
1)fswebcamのRaspberry Pi4へのインストールと動作確認
2)Node-REDでの撮影と表示
a) 必要ノードの追加:usbcameraノード、base64ノード
b) dashboardのTemplateノードを使用し表示
3. 使用した機材
今回導入の動作確認を行った機材を以下に示す。
1)Raspberry Pi 4 : OS Raspbian GNU/Linux 11 (bullseye)
2)USBカメラ:ELECOM製 200万画素Webカメラ UCAM-C520FBBK
4.fswebcamのRaspberry Pi4へのインストールと動作確認
4-1. USBカメラの認識確認
USBカメラを、Raspberry Pi4のUSBに挿し、以下のコマンドを端末で入力し、認識されているかを確認します。
lsusb
以下の様に、ELECOM 2MP Webcamとして認識されています。
4-2. fswebcamのインストール
以下のコマンドで、fswebcamをインストールします。
sudo apt install fswebcam -y
4-3. 動作確認
インストールが終わったら、動作確認を行います。以下のコマンドを入力して、出来上がったjpegファイルを、確認します。
fswebcam /home/pi/Pictures/image01.jpg
画像の下に出ている“□ □・・・ □ □”の表示を消します。
fswebcam --no-banner /home/pi/Pictures/image02.jpg
以上で、動作確認は終了です。次に、Node-REDから撮影を行うようにします。
5. Node-REDでの撮影と表示
5-1. 必要ノードの追加:usbcameraノード、base64ノード
Node-REDを起動します。フローエディタのパレット管理を開いて、
1) node-red-contrib-usbcamera
2) node-red-node-base64
をパレットに追加します。
5-2. dashboardのTemplateノードを使用し表示
injectノードとuscameraノードとbase64ノードとダッシュボードのtemplateノードを一列に並べます。そしてそれぞれを繋ぎます。
injectノードは、5秒毎にinjectするように設定します。
usbcameraノードは、File Modeを“buffer”に設定します。解像度は必要に合わせて変更してください。
base64ノードは設定は必要ありません。
ダッシュボードのtemplateノードには、以下の様にHTMLコードを記述します。
<div>
<img src=”data:image/png;base64,{{msg.payload}}”>
</div>
※ ここのコードをコピーする際には、ダブルクォーテーションの文字化けに注意して下さい。
上手く表示されない場合には、””をキーボードから打ち直してください。
5-3.動作確認
5秒おきに、撮影を行っています。以下の様に、手をかざすと手が写り込むことが確認できた。
5-4. 画像認識への展開
静止画像が動画に比べてファイルサイズが小さくハンドリングしやすいことは概要でもお話ししました。このメリットを使ってサーバに送ることで、サーバ側で画像認識をやらせることもできます。サーバへの送信に関しては、以下にある「Appendix-2. 静止画の表示をサーバ側にも配信する方法」を参照ください。
また、画像認識に関しては、「顔検出」を参照ください。
Appendix-1. usbcameraノードを使わずに、execノードで撮影する方法
A-1.概要
本文の概要のところにも記載しましたが、2023年6月以降に配布されている評価キット“Software Version PDH-v140”には、fswebcamが標準でインストールされています。また、USBカメラを接続すると、ダッシュボードにfswebcamで撮影した画像が以下の様に表示されます。
このPDH-v140では、usbcameraノードを使わずに、execノードでfswabcamを起動して、ファイルに保存されたデータを読み込んで表示するという手順を踏んでいます。そこの部分の説明を行います。
A-2. Node-REDのフロー
Node-REDのフローは、以下の様になっています(タブ“Setting(Don’t touch)”を参照)。本編の説明でのフローのusbcameの部分が、execノードとdelayノードとread fileノードに置き換わっています。
execノードの中身は、“fswebcam -r 320×240 –jpeg 80 ~/Pictures/usbcam.jpg”となっており、fswebcamを直接起動しています。
今までの説明になかったオプションとしては、-r と –jpegです。-rは、解像度を指定するオプションで、ここでは、320×240を指定しています。usbcameraノードでは、プルダウンメニューで選べました。–jpeg <factor>は、jpeg出力を指定しています。factorは、画質で、-1~95までが選べます。数字が大きくなると画質は向上しますが、ファイルサイズが大きくなります。ここでは、80を選んでいます。
delayノードで、ファイルが完全保存されるのを1秒待っています。
file readノードは、fswebcamが保存したファイルを読み込んでいます。
execノードで指定したファイル名 “/home/pi/Pictures/usbcam.jpg”を読み込んで、バイナリデータとして出力します。
以降のbase64ノードと、ダッシュボードのtemplateノードは、本文で説明したのと同じです。
Appendix-2. 静止画の表示をサーバ側にも配信する方法
A2-1.概要
本文の概要のところにも記載しましたが、静止画は、サイズが小さいのがメリットです。そこで、エッジ側で撮影した写真をサーバに転送し、サーバ側で表示する方法を説明します。
A2-2. Node-REDの記述
何も難しいことは無く、mqttのブローカーをサーバのNode-REDに配置し、そのブローカに向けてエッジ側からPublishingするだけです。
サーバ側でSubscribeすれば、表示できます。Node-REDへのブローカーの導入に関しては、こちら(Node-REDへのAedes Brokerの導入)を参照ください。
1) エッジ側のフロー
エッジ側のフローは以下の様に、usbcameraノードの出力をmqtt out ノードで受けます。
mqtt outノードのプロパティを見てみます。“サーバ”に、mqttのブローカーを配置したサーバのIPアドレスとポート番号を記載します。トピックにPublishingするトピック名を記載して下さい。
2) サーバ側のフロー
サーバ側のフローは以下の様になります。mqtt in ノードで受けます。その後、base64ノードとダッシュボードのtemplateノードで表示します。
base64ノードとtemplateノードの記述は、本編と同じです。
mqtt inノードのプロパティを見てみます。“サーバ”には、localhostと記載し、ポート番号は、ブローカーノードと合わせます。トピックは、Publishingされているトピック名と同じ名前を記載します。
A2-3. 動作確認
エッジ側とサーバ側で表示している画像が同じであることを確認しました。