直接从 numpy 数组图像数据创建 cv2.VideoCapture() 对象

Creating cv2.VideoCapture() object directly from numpy array image data

目的是从虚拟相机中获取数据(从Gazebo模拟中的相机,每秒更新一次)并使用Detectron2(需要数据来自cv2.VideoCapture)识别其他对象模拟。虚拟相机当然不会出现在 lspci 所以我不能简单地使用 cv2.VideoCapture(0).

所以我的代码是

bridge = CvBridge()
cv_image = bridge.imgmsg_to_cv2(data, desired_encoding='bgr8') #cv_image is numpy.ndarray, size (100,100,3)
cap = cv2.VideoCapture()
ret, frame = cap.read(image=cv_image)
print(ret, frame)

但它只打印 False None,我想是因为没有任何内容被捕获到 cap 中。我

f 我将第 2 行替换为 cap = cv2.VideoCapture(cv_image) 我收到错误,

TypeError: only size-1 arrays can be converted to Python scalars

因为我认为它需要整数(代表网络摄像头编号)或字符串(代表视频文件)。

作为参考,

cv_image = bridge.imgmsg_to_cv2(data, desired_encoding='bgr8') # cv_image is numpy.ndarray
cv2.imshow('image', cv_image)
cv2.waitKey(1)

完美显示图像。是否可以使用 imshow() 或类似于 VideoCapture() 输入的方法?

然而,cap = cv2.VideoCapture(cv2.imshow('image', cv_image))打开一个空白 window 并给我,

[ERROR:0] global /io/opencv/modules/videoio/src/cap.cpp (116) open VIDEOIO(CV_IMAGES): raised OpenCV exception:

OpenCV(4.2.0) /io/opencv/modules/videoio/src/cap_images.cpp:293: error: (-215:Assertion failed) !_filename.empty() in function 'open'

如何创建可以使用我拥有的图像数据的 cv2.VideoCapture() 对象?或者有什么可以指引我正确的方向?

Ubuntu 18.04 和 Python 3.6 with opencv-python 4.2.0.34

我的解决方案是在演示中重写 Detectron2 的 --input 标志,以不断 运行 使用 demo.run_on_image(cv_data) 的 ROS2 回调。因此,它不是让它处理视频,而是一次快速处理每张新图像。这是一种解决方法,因此不需要 cv2.VideoCapture()

根据我在 Gazebo tutorials page 上的发现:

在 Rviz 中,添加一个“'Camera'”显示,并在“'Image Topic'”下将其设置为 /rrbot/camera1/image_raw

在您的情况下,它可能不是 /rrbot/camera1/ 名称,而是您在 .gazebo 文件中设置的名称

<cameraName>rrbot/camera1</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>

因此您可以创建订阅者并使用 cv2.VideoCapture() 来自该主题的每张图片。