Node.js
画像処理
動画
node-red
bosch

BOSCH製IPカメラを利用した人数カウント(Bluemix設定編)

More than 1 year has passed since last update.

BOSCH製IPカメラから人数カウントデータを受け取る

前回の投稿で行ったカメラ側の設定が完了したので、今回はBluemix側の設定を行います。

この内容は多分以下の3本立てになると思います。今回は以下の2番に該当します。

  1. BOSCH製IPカメラでの人数カウントを行う設定
  2. BOSCH製IPカメラから人数カウントデータを受け取る
  3. 人数カウントデータをEagle Eye Networksに保存する

環境、事前確認

前回の投稿の本項目をご参照下さい。

Bluemix側の準備

Bluemix側ではいつもどおり?node.jsとNode-REDを使って実装します。
今回も簡易的にフローをインポートしていきたいと思います。
そのためには事前に「環境、事前確認」の内容を参考に、環境を整えておいてください。

フローのインポート

以下の内容をコピーして、Node-REDにインポートを行って下さい。

[{"id":"3ae66bd6.8003f4","type":"http in","z":"2016f88.2cc7808","name":"18F_Enter","url":"/pcount1","method":"get","swaggerDoc":"","x":140,"y":500,"wires":[["b04e92c8.443a4","54062a58.889494"]]},{"id":"b04e92c8.443a4","type":"debug","z":"2016f88.2cc7808","name":"","active":false,"console":"false","complete":"true","x":330,"y":440,"wires":[]},{"id":"53ffe83f.913468","type":"http response","z":"2016f88.2cc7808","name":"","x":850,"y":500,"wires":[]},{"id":"54062a58.889494","type":"function","z":"2016f88.2cc7808","name":"Set Num&Ent","func":"msg.payload = 1;\nmsg.entrance = \"Enter\";\nmsg.camName = \"BOSCH_DINION_IP_ultra_8000\";\n\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":500,"wires":[["1bc18353.2d640d"]]},{"id":"56fae4a1.22598c","type":"cloudant out","z":"2016f88.2cc7808","name":"","cloudant":"","database":"count","service":"count-cloudantNoSQLDB","payonly":true,"operation":"insert","x":850,"y":560,"wires":[]},{"id":"1bc18353.2d640d","type":"function","z":"2016f88.2cc7808","name":"Set time and count","func":"var dtObj = new Date();\n\nvar datetime = [dtObj.getFullYear() + '-',\n    ( '0' + (dtObj.getMonth() + 1)).slice(-2) + '-',\n    ( '0' + dtObj.getDate() ).slice(-2) + '-',\n    ( '0' + dtObj.getHours()).slice( -2 ) + '.',\n    ( '0' + dtObj.getMinutes()).slice( -2 ) + '.',\n    ( '0' + dtObj.getSeconds()).slice( -2 ) + '.000000'\n    ].join(\"\");\n\nmsg.st = [dtObj.getFullYear() + '-',\n    ( '0' + (dtObj.getMonth() + 1)).slice(-2) + '-',\n    ( '0' + dtObj.getDate() ).slice(-2) + ' ',\n    ( '0' + dtObj.getHours()).slice( -2 ) + ':',\n    ( '0' + dtObj.getMinutes()).slice( -2 ) + ':',\n    ( '0' + dtObj.getSeconds()).slice( -2 ) + '.000'\n    ].join(\"\");\n\nmsg.payload = {\n    timestamp: datetime,\n    count: msg.payload,\n    entrance: msg.entrance,\n    camera: msg.camName\n};\nreturn msg;","outputs":1,"noerr":0,"x":630,"y":500,"wires":[["f8becca5.0c2df","56fae4a1.22598c","53ffe83f.913468","f0eced9f.99cd5"]]},{"id":"f8becca5.0c2df","type":"debug","z":"2016f88.2cc7808","name":"","active":false,"console":"false","complete":"false","x":870,"y":440,"wires":[]},{"id":"ae82aa3d.a64cd8","type":"http in","z":"2016f88.2cc7808","name":"18F_Exit","url":"/pcount2","method":"get","swaggerDoc":"","x":140,"y":560,"wires":[["b04e92c8.443a4","5b7874a0.51f5ec"]]},{"id":"5b7874a0.51f5ec","type":"function","z":"2016f88.2cc7808","name":"Set Num&Ent","func":"msg.payload = 1;\nmsg.entrance = \"Exit\";\nmsg.camName = \"BOSCH_DINION_IP_ultra_8000\";\n\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":560,"wires":[["1bc18353.2d640d"]]}]

インポートが完了すると、以下のようなフローが表示されます。
Flow.png

試してみよう!

カメラ側の設定が完了すれば、あとはテストを行うだけです。
各デバッグノードをオンにして、実際にカメラの前を横切ってみましょう。
LineOver.png

上のスナップショットは便宜的に緑色の線を入れておりますが、ここではこの部分にライン超えの線があると仮定しています。

横切った際にカメラが認識し、Bluemixに情報を転送し、Bluemix側で受け取れれば、以下のようなメッセージが「debug」タブにJSONオブジェクトとして表示されます。

{ timestamp: "2017-07-25-02.43.50.000000", 
count: 1, 
entrance: "Exit", 
camera: "BOSCH_DINION_IP_ultra_8000" }

この情報はちゃんと設定されていれば、Cloudantにも記録されます。Cloudantに記録する際には事前に指定したデータベースを作成しておいて下さい。

Eagle Eyeと連携してみよう

次回、「人数カウントデータをEagle Eye Networksに保存する」では、今回の途中で紹介したCloudantへの保存ではなく、Eagle Eyeに動画データと共にメタデータを保存する方法をご紹介します。
お楽しみに!

ライセンス、著作権等

本スクリプト、ノード構成、エクスポート内容についてはMIT Licenseを適用します。
Eagle Eye Networksの商標およびロゴについてはEagle Eye Networks, Inc.に帰属します。
IBMおよびIBM Bluemix、Node-Redの商標およびロゴについてはInternational Business Machines Corporationに帰属します。
node.jsの商標およびロゴについてはNode.js contributorsに帰属します。
BOSCH及びBOSCHロゴは、、 Robert Bosch GbmHおよびその関連会社(以下、「ボッシュ」)の著作権として、著作権に関する各種国際条約、各国の著作権法およびその他の各種法律(以下、「法律等」)によって保護されています。