概要

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のpulseInで割り込み処理ができるようにする
ArduinoのpulseInで割り込み処理ができるようにする
概要 超音波センサーHC-SR04等を用いてArduinoで距離計測を行いたいときに、Trigピンで超音波を発生させた後にEchoピンで、超音波が反射されてくるまでの時間を計測することで距離を計測できます。その際、pulseInという...
Read More
Arduino IDEのインストール方法と使い方
Arduino IDEのインストール方法と使い方
概要 Arduinoは入出力ポートを備えたマイコンボードで、ソースコードを書くことで、さまざまなハードウェアを制御することができます。 ソースコードを開発・ボードに書き込むためには開発環境であるArduino IDEのインストールが必...
Read More
WindowsでArduino Uno互換ボードに書き込む時にシリアルポートが選択できない時の対処法
WindowsでArduino Uno互換ボードに書き込む時にシリアルポートが選択できない時の対処法
概要 Arduino Uno R3の互換ボードを用いる時、WindowsでArduino IDEを開き、シリアルポートを繋げようとした際にグレーアウトされてしまって選択することができない場合があるので、解決方法について解説をします。 ...
Read More