konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【Xi IoTで映えるデモがしたい 第20回】Function (python) で画像処理を行ってみる

LEGOをスマートファクトリー化する道のり

  1. 画像取得
  2. MQTT送信(Publish)
  3. Xi IoT Data Pipelineで MQTT受信(Subscribe)
  4. Xi IoT Data Pipelineで画像処理して送信(Publish) ←今回はココ
  5. 管理画面を作って確認(Subscribe/Publish)
  6. RasPi+BrickPiで結果受信(Subscribe)してモーター制御
  7. 結果に応じてモーター制御

f:id:konchangakita:20191225000342p:plain
Xi IoT Functionsに作る
RasPi+BrickPiから送られてくる画像から、赤と青を判別するpythonプログラムを作ってみたいと思います

色検出ステップ

  1. opencvで画像取り込み
  2. HSVへ変換
  3. upper/lower判定
opencv画像取り込み

取り込んだ画像、opencvで読み込んでやるとBGRフォーマット(RGBではない!)になっています

# MQTTで受け取った画像のエンコード
simg = cv2.imdecode(np.frombuffer(base64.b64decode(msg), dtype=np.uint8), 1)

simg.shpe
(640, 480, 3)

simg
array([[[60 62 70]
  [60 62 70]
  [60 62 70]
  ...
  [68 68 68]
  [68 68 68]
  [68 68 68]]

  ...,
  [53 55 55]
  [53 55 55]
  [53 55 55]]], dtype=uint8)

f:id:konchangakita:20191221054945p:plain:w200
青いボールのサンプル

HSVへ変換

BGR フォーマットを HSVフォーマットへ変換して、色検出を行います
HSVはそれぞれ

  • Hue: 色相 [0〜179]
  • Saturation(Chroma): 彩度 [0〜255]
  • Value(Lightness): 明度 [0〜255]
# 取り込んだ画像をBGRからHSVは変換
cv2.cvtColor(simg, cv2.COLOR_BGR2HSV)

判定したい色(赤・青)がHSVでの範囲(upper/lower)に収まっているか、判定処理していきます

# HSVでの明るさの判定範囲を指定
lower["red"] = np.array([178,179,0])
upper["red"] = np.array([255,255,255])
lower["blue"] = np.array([92,179,30])
upper["blue"] = np.array([124,255,255])

# upper/lowerに収まっている部分抽出
cv2.inRange(hsv, lower[color], upper[color])

f:id:konchangakita:20191221055036p:plain:w200
青の領域抽出


この後は、色判定に基づいて輪郭を抽出してボールかどうか判定をした後に、「赤」「青」「判定なし」を返していきます
(輪郭判定がまだちゃんと理解できていない。。。)
でもなんとかコピペで判定まではできますた


これでどうやら色判定はできました!

mqtt-test - b'{"SherlockTimestamp":1576687996517,"state":blue,"image":/9j/4QFWR~}'

少しずつpythonにも慣れてきました

よし、次は Node-Red を使って IoT の見える化を検討しようと思います