【Xi IoTで映えるデモがしたい 第20回】Function (python) で画像処理を行ってみる
LEGOをスマートファクトリー化する道のり
- 画像取得
- MQTT送信(Publish)
- Xi IoT Data Pipelineで MQTT受信(Subscribe)
- Xi IoT Data Pipelineで画像処理して送信(Publish) ←今回はココ
- 管理画面を作って確認(Subscribe/Publish)
- RasPi+BrickPiで結果受信(Subscribe)してモーター制御
- 結果に応じてモーター制御
RasPi+BrickPiから送られてくる画像から、赤と青を判別するpythonプログラムを作ってみたいと思います
色検出ステップ
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)
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])
この後は、色判定に基づいて輪郭を抽出してボールかどうか判定をした後に、「赤」「青」「判定なし」を返していきます
(輪郭判定がまだちゃんと理解できていない。。。)
でもなんとかコピペで判定まではできますた
これでどうやら色判定はできました!
mqtt-test - b'{"SherlockTimestamp":1576687996517,"state":blue,"image":/9j/4QFWR~}'
少しずつpythonにも慣れてきました
よし、次は Node-Red を使って IoT の見える化を検討しようと思います