直接从 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()
来自该主题的每张图片。
目的是从虚拟相机中获取数据(从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()
来自该主题的每张图片。