Python 如何在ROS中订阅和发布图像

Python 如何在ROS中订阅和发布图像,python,opencv,ros,Python,Opencv,Ros,我正在尝试订阅“/camera/image\u color”主题,该主题是来自我相机的数据。然后,我想在opencv中对这些图像进行巫毒,并以特定的频率发布它们。这样我就可以用另一个节点订阅它们了 我已经尝试了下面的代码,以及其中的许多变体。此时,代码什么也不做。没有将图像发布到“/imagetimer”主题。我得到一个“定时图像”输出,然后什么也没发生 #/usr/bin/env python #-*-编码:utf-8-*- 进口罗西 从传感器_msgs.msg导入图像 从cv_桥导入CvBr

我正在尝试订阅“/camera/image\u color”主题,该主题是来自我相机的数据。然后,我想在opencv中对这些图像进行巫毒,并以特定的频率发布它们。这样我就可以用另一个节点订阅它们了

我已经尝试了下面的代码,以及其中的许多变体。此时,代码什么也不做。没有将图像发布到“/imagetimer”主题。我得到一个“定时图像”输出,然后什么也没发生

#/usr/bin/env python
#-*-编码:utf-8-*-
进口罗西
从传感器_msgs.msg导入图像
从cv_桥导入CvBridge
进口cv2
导入操作系统
将numpy作为np导入
类节点(对象):
定义初始化(自):
#Params
self.image=None
self.br=CvBridge()
#节点循环速率(以Hz为单位)。
self.loop_rate=rospy.rate(1)
#出版者
self.pub=rospy.Publisher('imagetimer',Image,queue_size=10)
#订户
订阅服务器(“/camera/image\u color”,图像,self.callback)
def回调(self,msg):
self.image=self.br.imgmsg_to_cv2(msg)
def启动(自):
rospy.loginfo(“定时图像”)
rospy.spin()
br=CvBridge()
而不是rospy.is_shutdown():
rospy.loginfo('发布图像')
#br=CvBridge()
self.pub.publish(br.cv2_to_imgmsg(self.image))
睡眠率
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
rospy.init_节点(“imagetimer111”,anonymous=True)
my_node=Nodo()
我的_节点。开始()

在我的例子中,我发现图像主题包含压缩图像。请核实你是否是这样

我使用以下代码读取.bag文件。如果您发现您的ROS主题中有压缩图像,您可以使用此代码的一部分来执行转换

        bag = rosbag.Bag(os.path.join(path_to_bags, bag_list[index]))
        for topic, msg, t in bag.read_messages(topics=['/conti115/image_raw/compressed']):
            try:
                img = bridge.compressed_imgmsg_to_cv2(msg)
            except CvBridgeError, e:
                print e
            txt = str(datetime.datetime.fromtimestamp(t.to_sec()))
            cv2.rectangle(img, (0, 0), (500, 40), (0,0,0), -1)
            cv2.putText(img, txt, (0, 30), 1, 2, (255, 255, 255), 2)
            cv2.imshow("win",img)


            wtr.write(img)
            if cv2.waitKey(5)==27:
                cv2.destroyAllWindows()
                break
        bag.close()

运行
rospy.spin()
后,代码不会前进。在rospy中,只要有
rospy.subscriber()
行,它就会为回调派生另一个线程。一个
rospy.spin()
基本上保持了节点的活动状态,因此回调和响应会继续进行。 这里使用while循环来保持节点的活动状态,因此不需要
rospy.spin()
。 此版本应适用于:

import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import os
import numpy as np

class Nodo(object):
    def __init__(self):
        # Params
        self.image = None
        self.br = CvBridge()
        # Node cycle rate (in Hz).
        self.loop_rate = rospy.Rate(1)

        # Publishers
        self.pub = rospy.Publisher('imagetimer', Image,queue_size=10)

        # Subscribers
        rospy.Subscriber("/camera/image_color",Image,self.callback)

    def callback(self, msg):
        rospy.loginfo('Image received...')
        self.image = self.br.imgmsg_to_cv2(msg)


    def start(self):
        rospy.loginfo("Timing images")
        #rospy.spin()
        while not rospy.is_shutdown():
            rospy.loginfo('publishing image')
            #br = CvBridge()
            if self.image is not None:
                self.pub.publish(br.cv2_to_imgmsg(self.image))
            self.loop_rate.sleep()

if __name__ == '__main__':
    rospy.init_node("imagetimer111", anonymous=True)
    my_node = Nodo()
    my_node.start()

这个问题遗漏了你的问题-什么是不起作用的?抱歉,这是一个糟糕的疏忽,我补充道。如果它解决了你的问题,请“接受”答案。