Webots 显示处理过的 numpy 图像 (OpenCV Python)

Webots displaying processed numpy image (OpenCV Python)

我正在尝试在 Webots 中使用 Pioneer 3AT 模拟巡线器。这是我涉及群体机器人的应用程序的第一步。我已经放置了相机。但是,我无法在模拟显示中(实时)显示使用 OpenCV 处理的图像。目前,我计划使用 https://www.cyberbotics.com/doc/reference/display.

中提到的显示节点对车道进行阈值显示。

但是,我不能把它弄起来 运行。问题是 如何在 webots 显示中显示处理后的 numpy 图像数组?

我目前拥有的代码:

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))

现在,如何在 display 中显示 image 我尝试了 imageNewimagePaste 等。但是,我通过 SWIG 收到了大量 C/C++ 错误,而且我也找不到任何相关示例。 (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);

P.S.: 我已经为此花费了 4 个多小时,但我找不到任何解决方案。 Qt 上似乎有类似的问题(我没有使用 Qt)。但是,这个问题没有答案:Ploting an image with 'imshow' of opencv in webots任何帮助将不胜感激,因为我正计划开源我的整个项目。

编辑 1: 我根据 following note for Java 尝试了以下操作。但是,我得到一个空白的显示屏。经过 10 个小时的努力,没有运气。

Note [Java]: The Display.imageNew function can display the image returned by the Camera.getImage function directly if the pixel format argument is set to ARGB.

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

我想出了一个 "official way" 来解决这个问题 运行。但是,我不喜欢这个解决方案,因为它没有直接集成到模拟器中(并且使用这种方法时模拟变得太慢了)。现在,我接受这个答案。但是,我会接受巧妙地集成到 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

您会在 Webots 中找到更多可能对您有所帮助的显示设备示例(它们在 C/C++ 中,但您应该能够为 Python 应用类似的机制):

在 python 中,您应该能够将 OpenCV 图像显示到显示器中,类似于:

    imageRef = display.imageNew(camera.getImage().tolist(), Display.RGB)
    display.imagePaste(imageRef, 0, 0)