概要

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

realsense_rosのrs_camera.launchで/imuが発行できなかった
realsense_rosのrs_camera.launchで/imuが発行できなかった
概要 直近、realsense_rosのrs_camera.launchを立ち上げた際、unite_imu_methodパラメータを設定しても/imuトピックが立ち上がらない事象が起きていたため、調査した内容の備忘録となります。内容は...
Read More
rosserialでLost sync with device, restarting...と出て接続が切れる時のチェックリスト
rosserialでLost sync with device, restarting...と出て接続が切れる時のチェックリスト
概要 rosserialを用いてArduinoでROSトピックをSubscribeしようとした時に、Lost sync with device, restarting... と表示されて接続が切れてしまう時に確認すべき事項をまとめまし...
Read More
rosserialを使ってArduinoで/cmd_velトピックを受信してロボット台車を動かす
rosserialを使ってArduinoで/cmd_velトピックを受信してロボット台車を動かす
概要 ROSを使って実機でロボット台車を動作させたい時に、Arduinoでシリアル通信経由でROSトピックを受信して、ロボット台車を動作させる方法を説明します。 /cmd_velは、平行移動の速度と回転速度が定義されたgeometry...
Read More