我最近刚开始使用 OpenCv,对于任何愚蠢的问题深表歉意。
所以我的最终目标是将视频从我的 ZED 相机流式传输到 VR 耳机上,我在 Unity 或 UnReal 中没有任何运气,因为相关插件无法在我的 Linux 机器上运行。我需要能够将双摄像头与我的 ZED 设备隔离开来,但现在只有 ROS 允许我访问任一摄像头的各个主题。
所以我使用 ZED 包装器将图像数据发布到 ROS 节点上,并找到了与来自 here 的 ROS 消息交互的代码.
该代码运行良好,我能够在我的显示器上显示捕获的图像流。但我的问题是如何将这些图像基本上保存到缓冲区/队列中?
我将示例修改为代码以尝试返回由 cvBridge 转换的图像,但我没有任何运气让返回的图像显示在屏幕上。想可能是因为Image一开始被初始化为None
,所以cv2
.imshow()
无法显示空图。但是如何检查其余图像是否正确返回?这是我的代码:
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()
我在尝试弄清楚如何做到这一切时遇到了如此困难的时间,因此非常感谢任何帮助。谢谢!
最佳答案
您的回调函数具有以下代码:
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
语句有误,可能不会被执行。
关于Python OpenCV : Returning cvBridge Image from ROS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51291183/