概要

PythonでROS開発をする際、sensor_msgs/Image型のトピックを受信して色々な処理をかけたいときには、OpenCVの配列に変換した上で処理を行うと便利です。CvBridgeというsensor_msgs/ImageとOpenCVの配列を相互変換できる便利なライブラリがあるので、使い方を解説します。

CvBridgeの公式ページはこちらです。

環境

本記事で用いた環境は下記です。

  • Ubuntu 18.04
  • ROS melodic

使い方

CvBridgeの使い方はとても簡単で、sensor_msgs/Image型のトピックをサブスクライブして、imgmsg_to_cv2という関数を用いるだけで変換することができます。

import numpy as np
import rospy
from cv_bridge import CvBridge
from sensor_msgs.msg import Image

def camera_callback(msg):
    try:
        bridge = CvBridge()
        cv_array = bridge.imgmsg_to_cv2(msg)
        rospy.loginfo(cv_array)
 
    except Exception, err:
        rospy.logerr(err)

if __name__ == '__main__':
    rospy.init_node('special_node', log_level=rospy.DEBUG)
    rospy.Subscriber('/camera/depth/image_raw', Image, camera_callback)

上記の例では /camera/depth/image_raw というトピックをSubuscribeして、そのコールバックでcamera_callbackという関数を呼び出しています。CvBridgeをインスタンス化して imgmsg_to_cv2いう関数でOpenCVの配列に変換することができます。

コールバックの引数をそのまま関数に入れれば良いのでとても簡単に変換することができます。

OpenCVのエンコーディング指定

imgmsg_to_cv2 でOpenCVの配列に変換する際、エンコーディングを指定することができます。

bridge.imgmsg_to_cv2(msg, "bgr8")  # カラー
bridge.imgmsg_to_cv2(msg, "mono8")  # グレースケール

送られてくる画像の種類によっては変換時にエラーが出てしまうので注意が必要です。

指定可能なエンコーディングのリストは下記になりますのでご参考ください。

 

Ros

Related Posts

L293Dモータシールドを用いて4つのDCモータを1つの基盤で制御
L293Dモータシールドを用いて4つのDCモータを1つの基盤で制御
概要 DCモータを制御する際にモータコントローラを使用すると思いますが、複数のモータを制御する際は配線が複雑になってしまいがちです。   RoboStation https://rb-station.com/blogs/arti...
Read More
Arduinoのrosserialで「Unable to sync with device」というエラーが出た場合の対処
Arduinoのrosserialで「Unable to sync with device」というエラーが出た場合の対処
概要 ArduinoでROSのトピックを受信して動作をさせたいときに、使うのがrosserialです。 rosserial_arduino このrosserial_arduinoを用いてArduinoと繋げてROSトピックを投げ...
Read More
Arduinoのコードでキュー(Queue)を使う
Arduinoのコードでキュー(Queue)を使う
概要 Arduinoのコードを書く際に、処理をキューイングして順番に処理をしていきたい時がありました。Arduinoにはarrayはありますが、FIFO(後述)型のキューはデフォルトでは無いため、外部ライブラリをインクルードする必要が...
Read More