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



目的是从虚拟摄像机获取数据(来自Gazebo模拟中的摄像机,每秒更新一次(并使用Detectron2(需要来自cv2的数据。视频捕获(来识别模拟中的其他对象。虚拟摄像机当然不会出现在lspci所以我不能简单地使用 cv2。视频捕获(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,我假设是因为帽子中没有捕获任何东西。我

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))打开一个空白窗口,给了我,

[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

从我在凉亭教程页面上找到的内容:

在 Rviz 中,添加"相机"显示,然后在"图像主题"下将其设置为/rrbot/camera1/image_raw

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

的名称
<cameraName>rrbot/camera1</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>

因此,您可以创建订阅者并为该主题中的每个图像使用cv2.VideoCapture()

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

最新更新