Webots отображает обработанное изображение NumPy (OpenCV Python) - PullRequest
2 голосов
/ 08 октября 2019

Я пытаюсь смоделировать линейного последователя с помощью Pioneer 3AT в Webots. Это первый шаг к моему приложению с использованием робототехники роя. Я разместил камеру. Однако я не могу отобразить изображение, обработанное с помощью OpenCV, на дисплее симуляции (в реальном времени). На данный момент я планирую просто ограничить полосу и отобразить ее с помощью узла отображения, как указано в https://www.cyberbotics.com/doc/reference/display.

Однако я не могу его запустить и запустить. Вопрос в том, как мне отобразить массив обработанных изображений на экране веб-роботов?

Код, который у меня сейчас есть:

camera = Camera("camera")
camera.enable(TIME_STEP);
display = Display("display")

while (robot.step(timestep) != -1):
    cameraData = camera.getImage();
    image = np.frombuffer(cameraData, np.uint8).reshape((camera.getHeight(), camera.getWidth(), 4))

Теперь какотобразить image в display? Я пытался imageNew, imagePaste и т. д. Однако я получаю множество ошибок C / C ++ через SWIG и не могу найти ни одного соответствующего примера. ,(Симулятор Webots поставляется только с одним примером, который использует display city.wbt и использует статическое изображение. Я не уверен, что это можно использовать. Но суммарный код этого примера, который находится на C, такой, как показано ниже.)

// speedometer
WbDeviceTag display;
int display_width = 0;
int display_height = 0;
WbImageRef speedometer_image = NULL;

// initialize display (speedometer)
if (enable_display) {
    display = wb_robot_get_device("display");
    speedometer_image = wb_display_image_load(display, "speedometer.png");
}

// display background
wb_display_image_paste(display, speedometer_image, 0, 0, false);

PS: я потратил на это более 4 часов и не могу найти никакого решения для этого. Похоже, на Qt есть похожий вопрос (я не использую Qt). Но этот вопрос остался без ответа: Создание изображения с 'imshow' из opencv в веб-ботах . Любая помощь будет принята с благодарностью, так как я планирую открыть исходный код всего своего проекта.

РЕДАКТИРОВАТЬ 1: Я попробовал следующее в соответствии с следующим примечанием дляJava . Но я получаю пустой экран. Не повезло после 10 часов усилий.

Примечание [Java]: функция Display.imageNew может отображать изображение, возвращаемое функцией Camera.getImage напрямую, если аргумент формата пикселяустановлен на ARGB.

display.imageNew(cameraData, display.ARGB, camera.getHeight(), camera.getWidth())

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Я нашел "официальный способ", чтобы все заработало. Однако мне не нравится это решение, поскольку оно не интегрировано непосредственно в симулятор (и симуляции становятся слишком медленными при использовании с этим методом). Сейчас я принимаю этот ответ. Тем не менее, я приму любой другой ответ, который аккуратно интегрируется в Webots.

cv2.startWindowThread()
cv2.namedWindow("preview")

while (robot.step(timestep) != -1):
    cv2.imshow("preview", image)
    cv2.waitKey(TIME_STEP)

Источник: https://cyberbotics.com/forum?message=7950

1 голос
/ 09 октября 2019

Вы найдете больше примеров устройств отображения в Webots, которые могут вам помочь (они есть в C / C ++, но вы должны иметь возможность применять аналогичные механизмы для Python):

В Python вы можете выводить на дисплей изображение OpenCV с чем-то похожим на:

    imageRef = display.imageNew(np.array2string(imageArray), Display.RGBA, display.getWidth(), display.getHeight())
    display.imagePaste(imageRef, 0, 0)
...