目的是从虚拟摄像机获取数据(来自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()
。