概要

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

VMWare FusionでUbuntu 18.04のディスク容量を上げる方法
VMWare FusionでUbuntu 18.04のディスク容量を上げる方法
概要 VMWare FusionでUbuntu 18.04の仮想ディスクを起動する際に、ハードディスクの容量を上げる方法について解説します。 手順 1. 仮想ディスクの電源をOFFにする 2. 設定ボタンを押して設定画面を開いた後に、...
Read More
ネイティブアプリでROS通信をする際はFlutterとroslibがおすすめ
ネイティブアプリでROS通信をする際はFlutterとroslibがおすすめ
概要 ROSを起動させているロボットに対して、スマートデバイスからROSで通信を行いたい時があるときは、Flutterを用いたネイティブアプリで実装するのがおすすめです。 https://rb-station.com/blogs/ar...
Read More
roslibjsを使ってJavaScriptでROSトピックのやり取りをする
roslibjsを使ってJavaScriptでROSトピックのやり取りをする
概要 roslibjsというJavaScriptのライブラリを使うことでWebアプリケーションからROSに繋いでトピックのやりとりをする方法を解説します。 公式サイト:https://wiki.ros.org/roslibjs ...
Read More