概要
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") # グレースケール
送られてくる画像の種類によっては変換時にエラーが出てしまうので注意が必要です。
指定可能なエンコーディングのリストは下記になりますのでご参考ください。