Webbots 显示处理后的 numpy 图像(OpenCV Python)

Posted

技术标签:

【中文标题】Webbots 显示处理后的 numpy 图像(OpenCV Python)【英文标题】:Webots displaying processed numpy image (OpenCV Python) 【发布时间】:2019-10-08 12:05:52 【问题描述】:

我正在尝试在 Webots 中使用 Pioneer 3AT 模拟线路跟随器。这是我的应用程序涉及群体机器人的第一步。我已经放置了相机。但是,我无法在模拟显示中(实时)显示使用 OpenCV 处理的图像。目前,我打算只设置车道阈值并使用 https://www.cyberbotics.com/doc/reference/display 中提到的显示节点进行显示。

但是,我无法启动并运行它。问题是如何在 webbots 显示器中显示处理后的 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 小时的努力,没有运气。

注意 [Java]:如果像素格式参数设置为ARGB,Display.imageNew函数可以直接显示Camera.getImage函数返回的图像。

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

【问题讨论】:

【参考方案1】:

我想出了一个“官方方法”来启动和运行它。但是,我不喜欢这个解决方案,因为它没有直接集成到模拟器中(并且在使用这种方法时模拟变得太慢)。目前,我接受这个答案。但是,我会接受任何其他巧妙地集成到 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

【讨论】:

【参考方案2】:

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

projects/samples/devices/display:展示如何使用显示设备的各种示例 (https://cyberbotics.com/doc/guide/samples-devices#display-wbt)。 projects/samples/howto/vision:使用 opencv 并将结果显示在显示设备中 (https://cyberbotics.com/doc/guide/samples-howto#vision-wbt)。

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

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

【讨论】:

能否请您发布一个最小的工作解决方案?我以前经历过。但是,当我尝试访问显示内存时出现 SWIG 错误。看起来 C/C++ 版本使用了memcpy,无法直接在 Python 中复制(无需深入研究 Webots 源代码)。 我在答案中添加了一个示例(未测试)。 我遇到了类似的错误(我以前经常遇到)pastebin.com/erT8uLrT @PrasadRaghavendra 这是一个经过测试的解决方案:imageRef = display.imageNew(frame.tolist(), Display.RGB)。 @DavidMansolino 请更新代码 嗨@DarkoLukić 感谢您提供经过测试的解决方案。我假设frame = camera.getImage() 对吗?

以上是关于Webbots 显示处理后的 numpy 图像(OpenCV Python)的主要内容,如果未能解决你的问题,请参考以下文章

Python-OpenCV中图像合并显示

使用numpy蒙版数组和imshow绘制分段彩色图像

如何有效地处理类似于 Matlab 的 blkproc (blockproc) 函数的块中的 numpy 数组

Python遥感图像处理应用篇:python如何使用numpy读取遥感图像光谱值

裁剪后的Android图像视图仅显示小图像

怎样用matlab进行图像滤波处理