[MagPi 89期] 基于OpenCV的机器人小车视觉教程

作者: 启莘风 | 来源:发表于2020-03-20 11:45 被阅读0次

    文章信息

    本文翻译自The MagPi 89期(2020年01月刊)- Tutorial

    原文标题: Add navigation to your low-cost robot

    原文作者: Danny Staple — YouTube Orionrobots频道博主、orionrobots.co.uk创始者、Learn Robotics Programming作者

    翻译: 启莘风

    点击文章末端“阅读原文”可获取全文(若无法跳转可用浏览器打开)。

    欢迎各大论坛网站转载分享。

    转载请注明原文作者及中文译文出处,并以原文超链接或二维码形式注明中文译文出处:启莘风。

    (为便于阅读,文章配图顺序及代码呈现的位置有所调整。)

    The MagPi杂志简介与译者注

    MagPi是面向创客的终极杂志,它包含以Raspberry Pi为主题的创新项目、评论、教程、操作方法以及新闻和活动。

    2012年,MagPi作为树莓派社区的杂志,由爱好者发行。现在由Raspberry Pi官方认可并发行,每月一刊。现已成为市场上最畅销的计算机杂志之一。对于任何对技术有浓厚兴趣的人来说,这都是不错的选择。

    网络上不乏众多爱好者对多期MagPi杂志进行了汉化,但因为各种原因,大多都已暂停或停止了更新。本公众号启莘风将从2020年1月刊(第89期)开始,对每期杂志的文章进行汉化翻译,旨在为国内的创客和树莓派开发者们提供实用的中文学习资源,分享国内外的树莓派应用案例。希望此举能够激发更多的创新灵感,期待得到各位的支持。

    关注公众号并在后台回复:机器人,即可获取本文Python源代码。


    序言

    “制作一个有视觉的机器人!用OpenCV迈出机器人小车视觉的第一步!”

    本教程展示了如何搭建机器视觉的测试环境。它演示了使用OpenCV调节图像,消除噪声并简化它们。然后,读者将看到如何提取数据或检查图像的内容,并以此来使机器人转弯。

    准备工作:

    1. 带相机的Lunchbox机器人(参见magpi.cc/88)

    2. 一片中性颜色、合适的测试场地

    3. 好的采光

    4. 二选一:颜色鲜艳的玩具盒(方块) 或 颜色鲜艳的300克/平方米的卡纸

    01. 测试过程

    为了测试机器人的表现,开发者建立了机器人测试过程,其目标在于搭建一个测试环境,以用于测试机器人特定的特征。

    找到一片中性颜色的地板作为测试场地,比如不带花纹的白色或灰色场地。使用一些像是红色、蓝色、绿色或黄色等表面色(flat colours)建立障碍墙。玩具盒或彩色卡纸是可行的。使用白色或中性色背景墙,以减少噪声。摄像头在光亮的、持续照明的环境下,会拍出效果更好的图像。在好的采光环境下,色彩更清晰,这也使得图像处理更容易。好的选择是日光或明亮的白色室内照明,避免有色或斑驳的照明。

    图0 测试环境

    图0中右侧的机器人小车使用摄像头以在测试场地实现导航;左侧玩具盒的颜色将会用于机器人小车的转弯方向的选择。

    02. 安装

    此步骤可能需要一些时间。在继续操作之前,将电源供电的USB适配器接入机器人的树莓派。

    在安装软件包之前,在Linux环境的命令行中使用以下命令,以确保Raspbian系统是最新的:

    sudo apt update -allow-releaseinfo-change
    

    要在树莓派上运行Python库,需要安装一些系统软件包:

    sudo apt install libcairo-gobject2 libwebp6 libilmbase23 libgdk-pixbuf2.0-0 libjasper1 libpango-1.0-0 libavcodec58 libavutil56 libcairo2 libswscale5 libatk1.0-0 libgtk-3-0 libtiff5 libpangocairo-1.0-0 libavformat58 libopenexr23 libgfortran5 libatlas3-base
    

    最后,安装OpenCV,NumPy和picamera所需的Python软件包:

    sudo pip3 install opencv-python-headless numpy imutils picamera[array]
    

    03. 设置摄像头

    在find_contours.py文件中的 setup_camera功能使得摄像头就绪。

    程序1 find_contours.py(Python 3环境)(关注公众号并在后台回复:**机器人**,即可获取Python源代码)

    为了缩短处理时间并简化图像,第11行将相机分辨率设置为128×128。我们的机器人的摄像头是上下颠倒的,因此第12行旋转角度设置为180度。使用相机功能可以节省树莓派上的处理过程。

    第14行创建了 capture_buffer缓存空间,用于存储来自相机的图像数据。第15和16行以两秒钟的预热时间启动相机。

    将机器人放在彩色墙壁前,运行以下命令:

    export LD_PRELOAD=/usr/lib/arm-linuxgnueabihf/libatomic.so.1
    python3 find_contours.py
    

    此代码将相机拍摄的图像发送到文件original.png。

    04. 色彩理论基础知识

    计算机将颜色存储为RGB或BGR,用于红色,绿色和蓝色像素。

    在find_contours.py的第21行中,我们将图像从BGR转换为HSV色彩系统,这适用于此图像处理。

    图1显示了HSV的工作方式。饱和度衡量颜色的鲜艳度,从较低的值(白色或灰色)到完整的值(鲜艳的颜色)。色调表示颜色:红色、橙色、蓝色、绿色、黄色等。

    图1 HSV(色调、饱和度、明度)色彩空间

    将图像转换为HSV(“色调”,“饱和度”和“明度”)后,机器人可以选择颜色强度(S:饱和度),然后找到其色调(H),而几乎忽略了颜色亮度(V:明度)。

    05. 图像处理流程

    代码通过一系列转换来处理来自摄像机的图像,以查找墙壁的颜色。每个转换都是一小步。例如,找到符合条件的所有像素或绘制区域轮廓。

    后续阶段使用经过早期阶段转换后的输出。输出与其他输入连接在一起,形成图像拼接。

    类似于图2的图显示了数据从一个阶段流向另一个阶段的位置,从而使人们更容易了解正在发生的事情。图中使用了来自实际输出的图像、用于阶段的框以及用于表示数据流的线。

    图2 图像处理流程

    06. 图像阈值处理或数据漂白

    图像阈值处理用来测试是否每个像素的值都在范围内。为此,在find_contours.py的第22行中,使用了 cv2.inRange。它将用于生成一个新的二进制图像。如果像素的值在下限和上限之间,则存储 True值。

    find_contours.py范围允许所有色调值,同时过滤超过140的饱和度值,仅用于鲜艳的颜色且其明度值大于30。

    输出文件mask.png显示了输出,实际的彩色墙壁在图像中输出为白色(示例请参见图3)。

    图3 经过漂白或阈值处理的示例图像(图像非黑即白)

    如果匹配的区域太多,则可以上调第22行下界的S和V值;如果匹配的区域太小,则可以下调。

    07. 找到轮廓

    OpenCV可以检查黑白二值图像并查找不同区域的轮廓。

    在find_contours.py中,第28和29行命令获得轮廓列表。每个轮廓都是描述轮廓的点列表。

    在第30行,轮廓按面积进行分类。通过在此列表中找到第一个轮廓(最大的轮廓),代码可能找到了最重要的彩色区域。

    在第48行,将轮廓绘制到调试图像with_contours.png。运行代码并下载图像,以查看轮廓外观(示例请参见图4)。

    图4 从阈值图像中找到轮廓并将其绘制在原始图像的示例(图中红线为轮廓)

    08. 找到颜色

    为了使该代码按颜色选择,需要获取从轮廓的中间开始的色调。它从原始图片中获取此颜色。

    机器人使用OpenCV中的矩 moments命令,来找到轮廓的中间。

    通过将X坐标的总和( m10)除以它们的计数( m00),代码获得平均值X,即它们的中心。该代码还获得Y坐标的平均值和中心( m01除以 m00)。轮廓的中间位置通过X和Y坐标中心的组合来得到。

    find_contours.py的第36行上的代码从轮廓中间的 hsv输出中提取颜色。

    09. 在机器人上使用图像拼接

    从find_contours.py导入了 get_saturated_colours函数,使得该代码可以对已经测试过的代码中的图像拼接进行再次使用。

    程序2 camera_nav.py(Python 3环境)(关注公众号并在后台回复:**机器人**,即可获取Python源代码)

    需要连续的图像流以使用图像拼接来驱动机器人。camera_nav.py的第8行创建了此流,第9行提取数据。第8行将主循环设置为 for循环,每次循环都会运行一个新图像。

    主循环通过拼接放置图像,并使用输出确定机器人是向右,向左还是向前移动。相机的图像速率可设定时间。

    get_saturated_colours返回的颜色是以HSV形式表达的。

    10. 色彩的匹配

    camera_nav.py代码使用 get_saturated_colours中的色调组件。

    OpenCV将色相值存储为除以2的度数以适合8个比特(最大255)。图5显示了一个色轮,以度数和OpenCV值分别表示了色调值。

    图5 色调色轮

    camera_nav.py中的代码与第12行的黄色范围和第15行的蓝色范围匹配,打印匹配的颜色并使机器人转向。

    通过设置一系列不同颜色的墙,机器人现在可以按颜色浏览。期望针对不同的测试区域更改这些范围。

    在运行机器人之前,请确保机器人具有电池电源并且处于测试过程中。

    11. 提高机器人的视觉

    find_contours.py代码是计算机视觉的简单演示。同时也很容易混淆它。在轮廓下找到图像并平均颜色会使图像更加稳定。

    该代码可以与距离传感器结合使用,因此只能检测到距离足够近的墙壁。可以在机器人上添加编码器或惯性测量单元(IMU)以精确转向。

    带有HoughLines的Canny Edge Detection等先进技术可以拾取地平线,确定角度和距离,如图6,因此机器人可以与墙对齐。OpenCV可以进行面部检测,甚至具有机器学习和神经网络模块。

    图6 拾取地平线、确定角度和距离的示例

    12. 扩展阅读

    机器人视觉是机器人技术的重要研究领域,本文几乎没有涉及任何内容。它是机器人技术中最有价值和令人兴奋的空间之一,值得进一步阅读。

    PyImageSearch网站(pyimagesearch.com)是一个极好的资源,可用于了解有关计算机视觉的更多信息并进一步探究从图像中检测出不同的属性。

    原文作者的书《学习机器人编程》(Learn Robotics Programming)中有一部分内容涉及计算机视觉,包括建立面部和对象跟随行为、以及将摄像头和流程平台投射到手机浏览器中以进行实时查看等内容。


    本公众号启莘风将从2020年1月刊(第89期)开始,对每期杂志的文章进行汉化翻译,旨在为国内的创客和树莓派开发者们提供实用的中文学习资源,分享国内外的树莓派应用案例。希望此举能够激发更多的创新灵感,期待得到各位的支持。


    相关文章

      网友评论

        本文标题:[MagPi 89期] 基于OpenCV的机器人小车视觉教程

        本文链接:https://www.haomeiwen.com/subject/htadyhtx.html