Создание объекта cv2.VideoCapture () непосредственно из данных изображения массива numpy - PullRequest
0 голосов
/ 26 мая 2020

Цель состоит в том, чтобы получить данные с виртуальной камеры (с камеры в моделировании 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, предполагаю потому что в шапке ничего не захватывается. I

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 с opencv- python 4.2.0.34

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Из того, что я нашел на странице учебников по беседке :

В Rviz добавьте дисплей «Камера» и в разделе «Image Topi c» установите его на /rrbot/camera1/image_raw.

В вашем случае это, вероятно, будет не / rrbot / camera1 / name, а тот, который вы устанавливаете в файле .gazebo

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

Таким образом, вы можете создать подписчика и используйте cv2.VideoCapture() для каждого изображения из этого топа c.

0 голосов
/ 26 мая 2020

Мое решение состояло в том, чтобы переписать флаг Detectron2 --input в демонстрации, чтобы постоянно запускать обратный вызов ROS2 с demo.run_on_image(cv_data). Поэтому вместо того, чтобы заставлять его обрабатывать видео, он просто быстро обрабатывает каждое новое изображение по одному. Это обходной путь, поэтому cv2.VideoCapture() не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...