概要

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

Arduino Mega 2560 Rev3のピン配置
Arduino Mega 2560 Rev3のピン配置
Arduino Mega 2560 Rev3のピン配置です。公式ページ: https://content.arduino.cc/assets/Pinout-Mega2560rev3_latest.pdf 下部分の拡大 備考 上部...
Read More
Arduino Uno Rev3のピン配置
Arduino Uno Rev3のピン配置
Arduino Uno Rev3のピン配置です。 公式ページ: https://content.arduino.cc/assets/Pinout-UNOrev3_latest.pdf 備考 PWM出力が可能なピン:「~」が先頭につ...
Read More
TB6600を使ってステッピングモータをArduinoで動作させる
TB6600を使ってステッピングモータをArduinoで動作させる
概要 TB6600はステッピングモータを制御することができる、ステッピングモータコントローラです。TB6600を用いることで、ステッピングモータの回転速度や回転の粒度、方向などをマイコンから制御できるようになります。本記事ではTB66...
Read More