Python OpenCV:从ROS返回cvBridge图像

时间:2018-07-11 17:24:56

标签: python opencv ros

我最近才刚刚启动OpenCv,因此对任何愚蠢的问题表示歉意。

所以我的最终目标是将视频从ZED摄像机流传输到VR头戴式耳机,而且由于相关插件无法在我的Linux机器上正常工作,因此我在Unity或UnReal方面没有任何运气。我需要能够将双摄像头与ZED设备隔离开来,但是现在只有ROS允许我访问任一摄像头的单独主题。

因此,我使用ZED包装器将图像数据发布到ROS节点上,并找到了与here中的ROS消息进行交互的代码。

该代码可以完美运行,并且能够显示在监视器上捕获的图像流。但是我的问题是我如何基本上将这些图像保存到缓冲区/队列中?

我将示例修改为代码,以尝试返回由cvBridge转换的图像,但是我没有任何运气使返回的图像显示在屏幕上。可能是因为图像首先被初始化为None,所以cv2imshow()无法显示空白图片。但是,如何检查其余图像是否正确返回?这是我的代码:

import cv2
import rospy

from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
from Queue import Queue


class ImageConverter(object):

    def __init__(self, object):

        self.topic=object
        self.bridge= CvBridge()
        self.image_queue = Queue(maxsize=100)
        self.image_sub = rospy.Subscriber(self.topic, Image, self.callback, queue_size=100)
        self.image=None

    def callback(self, data):

        try:
            cv_image=self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print(e)
        else:
                self.image = cv_image
                self.image_queue.put(cv_image)

def get_image(self):

        try:
                image = self.image_queue.get(block=False)
        except:
                image = self.image

        cv2.imshow("Image window", image)
        cv2.waitKey(3)

def subscribe(position):

    ic= ImageConverter(position)
    ic.get_image()
    rospy.init_node('image_converter', anonymous=True)

    try:
        rospy.spin()
    except KeyboardInterrupt:
        print ("goodbye")
    cv2.destroyAllWindows()

我经历了如此艰难的时期,试图弄清楚如何做到这一点,因此,非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您的回叫功能具有以下代码:

try:
        cv_image=self.bridge.imgmsg_to_cv2(data, "bgr8")
except CvBridgeError as e:
        print(e)
else:
            self.image = cv_image
            self.image_queue.put(cv_image)

我认为您的else语句是错字,可能无法执行。