ROS图像格式和opencv图像格式的转换cv2_to_imgmsg和imgmsg_to_cv2

一图看懂

比比一些叙述
我们在使用ROS作控制任务时,一般是是需要甬道视觉控制的。或者说单独用ROS部署一些视觉模块。
这个个时候我们一般会以来opencv工具来实现一个功能,或者基础图像处理功能,比如提取图像尺寸,灰度转换之类的。

ROS个的数据格式和opencv的个是不同,ROS在传输图像时需要使用专门的数据个时进行传输,比如订阅摄像头采集的数据,传过来就是ROS格式的数据,这个时候并不适合Opencv直接处理。因此我们需要使用imgmsg_to_cv2将图像从ROS信息格式转换成cv格式。当ROS处理好之后,我们还需要继续传输该处理好的图像数据时,还需要再用cv2_to_imgmsg 将数据转成ROS信息格式。
ROS图像格式和opencv图像格式的转换cv2_to_imgmsg和imgmsg_to_cv2_第1张图片

一个例子

使用古月居的例子

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import cv2
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image

class image_converter:
    def __init__(self):    
        # 创建cv_bridge,声明图像的发布者和订阅者
        self.image_pub = rospy.Publisher("cv_bridge_image", Image, queue_size=1)
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.callback)
        #图像刚从摄像机订阅过来,图像格式是ROS的信息格式。这是还无法使用opencv处理
    def callback(self,data):
        # 使用cv_bridge的imgmsg_to_cv2将ROS的图像数据转换成OpenCV的图像格式
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print e

        # 在opencv的显示窗口中绘制一个圆,作为标记
        (rows,cols,channels) = cv_image.shape
        if cols > 60 and rows > 60 :
            cv2.circle(cv_image, (60, 60), 30, (0,0,255), -1)
        # 显示Opencv格式的图像
        cv2.imshow("Image window", cv_image)
        cv2.waitKey(3)

        # 这个时候想将通过opencv处理好的图像再使用ROS节点发送发出去
        #因此,需要再使用cv2_to_imgmsg将opencv格式额数据转换成ros image格式的数据发布
        try:
            self.image_pub.publish(self.bridge.cv2_to_imgmsg(cv_image, "bgr8"))
        except CvBridgeError as e:
            print e

if __name__ == '__main__':
    try:
        # 初始化ros节点
        rospy.init_node("cv_bridge_test")
        rospy.loginfo("Starting cv_bridge_test node")
        image_converter()
        rospy.spin()
    except KeyboardInterrupt:
        print "Shutting down cv_bridge_test node."
        cv2.destroyAllWindows()

你可能感兴趣的:(机械手在医学领域的引用,CV,图像处理)