基于OpenMV的智能兵乓球拾取小车.docx
摘要 当我们跟随着现代化科学技术的脚步缓缓向前走去,社会也以一种现代化、高科技、智能时代的姿态向我们走路。无论是日常刷着微信朋友圈的智能手机、办公室中协助完成工作的台式电脑、物联网控制下的智能家居。这些无孔不入地高科技产品逐渐成为我们日常生活和工作中的一部分。说到智能化,就不得不提及人工智能。而在人工智能研究领域极里面,机器视觉又占据着极其重要的一部分。一些基于机器视觉系统的智能化机器设备除了很大程度带动了科技社会的发展和进步,也使得人们的工作和生活更加便利。本文便是设计了一款以Arduino开发板作为主控制器,便利人们在乒乓球比赛和训练中不需要进行人工手动捡球的捡球小车。该智能兵乓球拾取小车是基于OpenMV机器视觉模块对目标物体进行视觉识别,摄像头获取到的图像通过相关算法检测出目标兵乓球距离以及位置信息,通过TTL串口通讯将数据传递给小车Arduino开发板控制机器运动,机器操作部分则是控制舵机转动将车身前方由亚克力板和弹力绳组成的捕获笼通过定点下落来拾取检测到的地面上固定位置的兵乓球。用户可以通过ESP8266无线终端模式在移动端发送相关指令控制车身实现捡球小车在一定区域内进行前进、后退、左右转向、遇到障碍物进行躲避、拾取地面上散落的兵乓球功能。关键词:OpenMV;Arduino;乒乓球;摄像头;机器视觉AbstractWhen we follow the pace of modern science and technology, the society is walking towards us in a modern, high-tech and intelligent era. Whether it's a smart phone with WeChat circle of friends, a desktop computer in the office to help complete the work, or a smart home under the control of the Internet of things. These high-tech products have gradually become a part of our daily life and work. When it comes to intelligence, we have to mention artificial intelligence. In the field of artificial intelligence, machine vision plays an important role.Some intelligent machine equipment based on machine vision system not only greatly promote the development and progress of science and technology society, but also make people's work and life more convenient. In this paper, we design a kind of ball picking car which uses Arduino development board as the main controller, so that people don't need to pick up the ball manually in table tennis competition and training. The intelligent table tennis pick-up car is based on the OpenMV machine vision module for visual recognition of the target object. The image obtained by the camera detects the distance and position information of the target table tennis through the relevant algorithm. The data is transmitted to the car Arduino development board through TTL serial port communication to control the machine movement. The machine operation part is to control the rotation of the steering gear and the acrylic plate in front of the body the capture cage composed of elastic rope and elastic rope picks up the detected ping-pong ball at a fixed position on the ground by falling at a fixed point. Through ESP8266 wireless terminal mode, the user can send relevant instructions to control the car body to realize the functions of moving forward, backward, turning left and right, avoiding obstacles and picking up the scattered ping-pong balls on the ground in a certain area.Key words:OpenMV; Arduino; Table tennis; The camera; Machine vision目录第一章 绪论11.1 课题的背景和意义11.2 智能捡球机在国外发展状况1第二章 整体方案设计32.1 系统整体方案32.2 系统整体框架图3第三章 硬件设计分析53.1 硬件总体设计53.2 WeMos D1 开发板介绍63.2.1 低功耗主控芯片介绍63.3 OpenMv机器视觉模块73.4 HC-SR04超声波模块工作原理93.5 SG90舵机模块的工作原理103.6 L9110S直流电机驱动模块11第四章 软件设计分析134.1 主程序设计134.2 子程序设计144.2.1 小车行进控制子程序144.2.2 拾取兵乓球子程序164.3 文件应用174.3.1 ESP8266闪存文件应用174.4 兵乓球识别原理184.4.1 兵乓球距离识别原理184.4.2 兵乓球颜色识别原理204.4.3 兵乓球形状识别原理21第五章 实物功能与测试结果23结论25参 考 文 献26致谢27 广东东软学院本科生毕业设计(论文)第一章 绪论1.1 课题的背景和意义乒乓球虽然只是比赛当中的一个小球,但却是我们中国的国球。除了专业的兵乓球手,业余爱好者也是常常会在空闲地时间与二三个志同道合的球友去兵乓球馆内进行对练。只是每次长时间的训练结束后,地板上都能看到四处散落的兵乓球,给场地工作人员带来困扰的局面。因此,为了便利人们在日常生活种的需求,同时减少一部分不必要的人力。专门针对兵乓球进行拾取的捡球机器便由此应运而生。目前市面上出售的捡球机器参差不齐,有的捡球机器进行兵乓球拾取的效率可以说是相当高效,但是其机器本身的造价也可以说是十分之昂贵,性价比并不高。市面上也有相对便宜且无需弯腰便能进行拾取的轻便捡球网框。后者价格虽然相比之前者要来得实惠,然而其仍然需一定的人力来进行拾取,这就相对于前者而言来得没那么便利了。伴随着机器视觉技术跨过一个个门槛逐步“破冰”,机器视觉领域的逐步发展使得捡球器制造行业迈入新的发展阶段。简单说来,机器视觉就像是我们自己的眼睛,用摄像头代替我们自己的眼睛来观察这个世界,同时又利用人工智能相关技术对物体进行测量和判断。结合机器视觉技术,本文设计了基于OpenMV机器视觉模块、Arduino控制模块以及ESP8266通信模块的智能拾取兵乓球小车。这样就方便了人们在打乒乓球时不用多次进行弯腰拾取,该智能拾取兵乓球小车通过抓取系统中机器视觉模块的标定、目标小球的识别匹配、机器小车对目标小车的定位抓取。不仅能够简单的检测和识别乒乓球,并能够对多个小球进行拾取。如此提高了拾取的效率,减轻了工作人员身上的包袱。1.2 智能捡球机在国外发展状况如果把某种技术的发展史比作人的年龄,那么机器视觉就像是一位迈入而立之年正在逐渐走向成熟的中年男子。其中智能捡球机可以算是智能制造的一个显著例子,它通过机器代替人工节省了不必要劳动力地浪费,让拾取小球的工作效率更高。纵观整个发展,机器视觉在其中起到不可替代的作用。在全球机器视觉市场中,美国和日本不仅占领着大半的份额,并且处于一个相当高的一个水平,像是日本的基恩士、美国的康耐视等都是有名的机器视觉公司。美国在机器视觉方面已经从最初的实验室阶段步入了工业实际生产的应用阶段。并且,美国在技术研发、产品生产和实际应用方面,处于一种较为均衡的状态。像最近的一款自动捡球机器人 Teninibot就是来自美国波士顿的团队设计.该机器自带的传感器能帮助其检测散落在周围的网球,通过计算机视觉和人工智能技术自动定位,机器臂就会抓取前方的小球放进后方的收纳篮里。如果用户相应让Teninibot在规定的区域内捡球,可以在使用手机伴侣 APP 进行连接上Teninibot之后对其进行相应的设置。第二章 整体方案设计2.1 系统整体方案项目以智能小车为载体,OpenMV机器视觉模块进行实时图像采集以及兵乓球定位,通过ESP8266实现网页配置。因此基于OpenMV的智能兵乓球拾取小车一共分为三部分:第一部分是OpenMV视觉识别的模块数据采集部分,第二部分是Arduino控制的小车行进拾取部分,第三部分是用户使用移动终端通过ESP8266对小车进行网页控制。如图2.1为各部分功能模块:OpenMV视觉模块进行数据采集WeMos D1 控制小车车身行进拾取用户通过ESP8266在移动终端进行控制TTL串口通讯串口通讯图2.1 各部分功能模块OpenMV是以STM32H743II为内核的机器视觉模块,通过对OV5640传感器的控制获取视频信号,然后视频信号经OpenMV分析和处理,判断出乒乓球的位置,进而将视频信号中抽象出的信息通过TTL串口实现通信传递给机械运动控制终端。同时,通过WiFi接收到的信号来控制数据的采集时间。WeMos D1控制小车机器部分主要完成功能是:通过TTL串口通信接收OpenMV发来的数据,判读数据后控制车身前进到对应距离,转动舵机落下捕获笼拾取乒乓球。该模块主要由SG90舵机控制捕获笼升降、电机控制移动和避障三部分组成,其中避障主要由超声波组成,这样避免小车在寻找乒乓球过程中撞上前方障碍物。ESP8266网页控制部分就是使用它的无线终端工作模式,作为一个无线终端连接空间内的WiFi路由器,路由器给连接的ESP8266网络设备分配独立的IP地址。首先的就是将data文件夹相关网页上传到板载Flash,然后需要连接到一个现有的网络,通过查看手机连接热点信息可以看到IP地址,在浏览器输入IP地址可以打开网页在移动终端控制小车。2.2 系统整体框架图供电外部电源CMOS摄像头供电供电HC-SR04超声波模块数字信号数据传输主控板 WeMos D1 PWM信号输出L9110S电机驱动数据传输OpenMv机器视觉模块距离感测PWM信号输出SG90舵机模块图2.2 系统整体框图外部电源供电部分是通过18650锂电池进行供电,由于供电系统需要提供5V电压。因此,通过将两节18650电池串联起来以便提供合适的电压电源给主控板以及各子模块。CMOS摄像头将被拍摄的物体转换成数字化信号传送给OpenMV机器视觉模块,内置程序对这些信号进行相关算法的运算抽取兵乓球的特征,当程序通过面积阈值、颜色阈值匹配到眼前的物体是我们需要的进行拾取的兵乓球时就会通过参照物比例测距来定位兵乓球的位置以获取当前距离数值。同时机器视觉模块通过PWM端口输出信号到SG90舵机模块,让舵机驱动模块等待执行相应的动作。WeMos D1主控板与OpenMV建立软串口通讯后获取兵乓球位置信息数据,同样通过条件判断控制小车执行相应的动作,其点击驱动控制由PWM端口进行信号输出到L9110S控制电机驱动模块。在小车执行相应动作的过程中若是遇到障碍物,超声波模块会接收到之前发送出去遇到障碍物后传回的超声波,主控板识别非接触式距离感测到的数据后会带动舵机转动超声波模块,识别左右方向是否具有空旷区域。若有,则车身后退一定距离进行转向以躲避前方障碍物。第三章 硬件设计分析3.1 硬件总体设计基于OpenMV的智能兵乓球拾取小车的整体构成主要硬件是WeMOS D1主控板模块、超声波测距传感器、舵机驱动、L9110S控制驱动电路以及机器视觉模块。OpenMV的P7、P8、P9口是PWM口,舵机连接机器视觉模块上的PWM端口以及GND端口,由外部电源进行供电。WeMos D1主控板与机器视觉模块之间通过TTL串口通讯传输数据。通过相关代码识别数据,设置SG90舵机模块以及L9110S直流电机驱动模块相应输出端口为需要的高低电平,以控制小车执行相应的动作和主动避障。其硬件功能框如图3.1所示:5V稳压基准电路电源切换电路ESP8266物联网芯片舵机驱动图像传感器接头电路机器视觉模块超声波测距传感器舵机驱动超声波发射电路超声波接收电路主控板L9110控制驱动电路图3.1 硬件电路功能框图主控板上有电源切换电路。如图3.1.1所示:图3.1.1 电源切换电路1运放作为比较器存在,运放输入一端接3.3V,另一端接在两个串联分压电阻中间。两个电阻上端接外部电源,运放的另一个输入的电压为外部电源的一半。在运放的输出端接的是PMOS的G极也就是控制端。PMOS管相当于一个开关。开门条件为VGS<VTP,VGS是指门极-源极电压VTP是一个门限电压,对于PMOS来说是一个负值。若源极电压固定,那么G极电压上升,则PMOS管就会被关闭。VIN作为外部电源,在VIN输入小于6.6V的时候使用USBVCC作为5V电源,当VIN大于6.6V的时候切断USBVCC,通过开发板上黑色圆形的电源接口连接外部电源,经过稳压后的5V对芯片进行供电1。3.2 WeMos D1 开发板介绍3.2.1 低功耗主控芯片介绍WeMos D1 是基于ESP8266物联网芯片的Arduino类开发板。它与其他ESP8266板是相同的Wi-Fi板,具有D0D15个口,有IIC、SPI、串口、AD,和板子上带了个CH340的USB转TTL的芯片。这意味着可以使用Arduino IDE对其进行编程。其开发板实物图如3.2.1所示:图3.2.1 WeMos D1主控板实物图主控板上的物联网芯片ESP8266利用WiFi联网时有三种工作模式。第一种模式是接入点模式(ACCESS POINT):ESP8266建立起一个WIFI网络向外界发送WIFI信号,这个WIFI有名称,也可以设立密码。而其他移动设备也就是我们平常使用的手机或者笔记本电脑可以通过ESP8266发射出来的WIFI信号与其进行网络连接,从而实现设备之间的通讯。第二种模式为无线终端模式(WIRELESS SATION):ESP8266可以作为一个无线终端连接空间内的WIFI路由器,路由器给连接的ESP8266网络设备分配独立的IP地址。第三种模式则是混合模式:即ESP8266同时处于接入点模式与无线终端模式的工作模式。其连接电路图如图3.2.2所示:图3.2.2 ESP8266连接电路图3.3 OpenMV机器视觉模块OpenMV是一个完全开源的项目,这个项目在github上有完整的硬件以及软件内容。支持热成像和全局快门的摄像头,就像是一个机器视觉版的Arduino。OpenMV图像处理的方法包括颜色识别、边缘检测、模块匹配、神经网络模型、特征点检测、测距等。可以用来检测室内是否有外人随意进入、筛选工业生产中检测到的不合格的产品、对标记物进行跟踪等。本次设计的基于OpenMV的智能乒乓球拾取小车在对散落在地面上的兵乓球进行识别检测的时候就使用到了颜色形状识别功能。如图3.3为OpenMV4的PCB以及原理图:图3.3 OpenMV4的原理图以及PCB2根据OpenMV4的原理图,我们可以基本知道部分子模块的作用。其中USB模块为USB接口与芯片供电电路。不仅能为芯片提供电源,而且OpenMV固件把内置2MB+外置32MB的FLASH虚拟成U盘,通过电脑上的集成开发环境OpenMV IDE与USB处接口的连接对该机器视觉模块进行代码编写、程序调试和更新固件版本等操作。SD CARD模块电路是用来读取存储卡信息电路。它配置了用来插入大容量TF卡存储设备的卡槽,方便用户存放程序和相关视频图片。LED是电源指示灯模块,能够及时把OpenMV机器视觉模块的情况反映给我们使用者。接通电源,指示灯亮起。烧录程序,指示灯闪烁。MT9V034为图像传感器接头电路模块,机器视觉模块集成了OV5640摄像头芯片,图像视频透过镜头照在感光芯片上把光照的强度和波长等信息转换成为电脑可以识别的数字信号,也就是我们认识的分辨率和像素。STM32F7XX MCU:在以STM32H74VIT6芯片为核心的单片机内部集成了一个MicroPython解释器,编写代码的时候其实是拿Python去写代码,然后保存到单片机里面运行代码。3.4 HC-SR04超声波模块工作原理超声波模块具有四个引脚,使用时在VCC引脚接上5V电源,在GND引脚接上电源负极,然后拉低Trig端口电平后给10微秒脉冲信号,这样传感器模块就会发射超声波,超声波遇到物体返回,传感器接收到返回的超声波。ECHO端口会有一个持续的高电平输出,持续的时间就是超声波到发射到接收的时间。通过高电平脉冲时长,我们就可以算出传感器到被测物体之间的距离。其计算公式为:距离=高电平持续时间(微秒)÷29微秒/厘米(音速)÷2(来回距离)此时测试的距离单位为厘米,转换为米则是:距离=高电平持续时间(微秒)÷340秒/米(音速)÷2(来回距离)我们用函数pulsen(端口,val)来读取高电平持续的脉冲时长,而这个函数有两个参数和一个返回值,第一个参数是数字端口号,第二个参数是HIGH或者LOW,它的返回值就是持续的时间,单位为微秒。函数的功能是读取引脚的脉冲信号,被读取的脉冲信号可以是HIGH或者LOW。例如我们要检测HIGH脉冲信号,模块将在引脚变为高电平时开始计时,当引脚变为低电平时停止计时,并返回脉冲持续时长11。如果在超时时间内没有读到脉冲信号的话将返回零。超声波测距传感器工作原理以及实物图如图3.4.1所示:测量距离超声波发射器超声波接收器实际距离障碍物图3.4.1 HC-SR04超声波模块工作原理以及实物图33.5 SG90舵机模块的工作原理在频率固定的情况下,调节脉宽的绝对时长可以控制舵机转动的角度。一般用0.5-2.5ms的脉宽来控制舵机的角度。以转动角度为0-180度的舵机为例,当脉宽小于0.5ms时为死区,舵机输出轴转角保持零度或稍小于零度,当脉宽等于0.5ms时,舵机输出轴转角为0度、当脉宽等于1ms时,舵机输出轴转角为45度、当脉宽等于1.5ms时,舵机输出轴转角为90度、当脉宽等于2ms时,舵机输出轴转角为135度、当脉宽等于2.5ms时,舵机输出轴转角为180度。当脉宽大于2.5ms时为死区脉宽,舵机输出轴转角会保持在180度或稍大于180度。舵机输出轴转角只跟脉宽时长绝对值有关系。舵机的工作原理实际很简单,舵机的控制电路中有个脉宽比较器,通过脉宽的比较计算舵机输出轴应该保持的角度,舵机输出轴实际角度用电位器的阻值来反馈。当实际角度与应保持的角度不一致时,舵机电路驱动电机正转或反转,通过齿轮组把舵机的输出轴调节到应该保持的位置。如图3.5为转角与脉宽时长关系以及实物图:图3.5 转角与脉宽时长关系以及实物图43.6 L9110S直流电机驱动模块L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,主要用于小车马达控制驱动。5两个直流电机分别由OA和OB输出控制,它们对应的控制端分别为L9110A的IA、IB和 L9110B的IA、IB.当接通VCC和GND时电源指示灯亮起。当L9110A的IA输入高电平而IB输入低电平时,电机向正方向转动;当 L9110B的IA输入低电平而IB输入高电平时,电机向反方向转动。L9110S直流电机驱动模块原理图以及L9110S实物图如图3.6所示:图3.6 L9110S直流电机驱动模块原理图以及L9110S实物图第四章 软件设计分析4.1 主程序设计采用Arduino IDE作为编程软件来进行相关程序的编程。基于OpenMV的智能兵乓球拾取小车包含HC-SR04超声波模块、SG90舵机拾取模块、L9110S直流电机驱动控制小车运动模块、OpenMV机器视觉模块,通信系统模块等。由于ESP8266可以作为一个无线终端连接空间内的WIFI路由器,同时路由器给连接的网络设备分配独立的IP地址。使用前对ESP8266相关初始化设置,首先建立网络服务器对象ESP8266WebServer,该对象用于响应HTTP请求,监听端口80。设置连接其作为无线终端连接的局域网的名称以及密码。连接之后打开分配的IP地址,浏览器就会自动请求芯片内存中SPIFFS区域的网页资源。用户可以在打开的移动端上选择相应的功能将指令发送到小车的主控板上执行相应的动作。功能分别有前走、后退、左转、右转、停止、避障、捡球。其中,捡球指令是通过主控板与机器视觉模块之间的双向数据传输实现的。WeMOS D1板内置的引脚0和2支持串口通信,使用SoftwareSerial库可以与OpenMV进行软串口通讯进行数据传输。其整个数据传输过程大致为:主控板发送捡球指令-机器视觉模块开始实时传输数据到主控板上-主控板程序根据数据判断相应动作执行的条件。总体程序流程图如图4-1所示。初始化 连接局域网ESP8266无线终端模式NY发送捡球指令?有小球?区域移动、避障NY捡球偏移避障前进用户发送结束指令 图4.1 总体程序流程图4.2 子程序设计4.2.1 小车行进控制子程序小车在行进过程中,超声波模块遇到障碍物会反射超声波,通过函数读取脉冲时长获得小车与障碍物之间的距离。当距离过近时,Arduino首先控制电机停止转动,之后舵机控制超声波模块左右转动,比较传感器传回来的左右区域距离数值,区域较为空旷的区域,小车转向,继续前进,流程图如图4.2.1所示:开始初始化小车前进发射超声波传回传感器N前方有障碍物?Y距离过近?Y小车停止左右转向测距小车转向距离大的方向图4.2.1 子程序流程图4.2.2 拾取兵乓球子程序在这一过程中,OpenMV同时会实时拍摄前方地面图像,图像中出现圆形黄色色块时,通过参照物距离的三角几何函数关系公式的计算,得出与兵乓球相距的距离。小车一边前进,一边接收从OpenMV传过来逐渐减小的距离数值。当兵乓球进入抓取范围,距离数值接近小车上方捕获笼到舵机的距离时,OpenMV控制两个舵机同时以相反方向转动一定角度让兵乓球落入捕获笼,流程图如图4.2.2所示:开始初始化OpenMV实时摄像检测到前方有兵乓球计算距离抓取范围内小车停止舵机控制捕获笼下落拾取结束图4.2.2 小车行进控制子程序流程图实时摄像之前要进行相应的初始化设置。首先要先清除掉之前摄像头存在的代码对于图片的设置,然后设置图片格式RGB565,这个565是说存储RGB三个通道每个通道存储像素值所对应的二进制位分别是5,6,52。同时还要设置采集到图片的分辨率,跳过一些刚开始不稳定的时候再开始读取图像。由于在机器视觉模块中白平衡是默认开启的,所以在颜色识别中,一定要关闭白平衡。之后就是追踪帧率以及设置串口通讯的波特率6。相关代码如下:sensor.reset() sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QQVGA) sensor.skip_frames(10)sensor.set_auto_whitebal(False) clock = time.clock() uart = UART(3, 115200,timeout_char= 1000)OpenMV通过接收到ESP8266作为无线终端传来的指令执行相应命令,此时机器视觉模块接收到的是字符串数据类型。因为JSON通常用于在Web客户端和服务器数据交换,即把字符串类型的数据转换成Python基本数据类型或者将Python基本数据类型转换成字符串类型7。若小车前进直到处于拾取兵乓球的范围内,舵机反向转动同样的角度使得捕获笼落下,设定拾取过程持续5秒,之后舵机重新转动返回原位。相关代码如下:if length<=70 and a=b'arn':for i in range(-30,30):s1.angle(i)s2.angle(-i)time.sleep(5)4.3 文件应用4.3.1 ESP8266闪存文件应用这个文件系统可以帮助我们存储一些变更频率不频繁的文件例如网页、配置或者是某些固化的数据等。将网页和图片、html、css、javaScript等相关资源存入到flash的SPIFFS区域。这样WIFI配置信息就不用放在代码里了可以更容易适配不同的应用场合 而且代码本身因为不记录WLAN配置信息就可以打包成固件。配置环境的时候有Flash Size的选项来分配程序和SPIFFS空间。系统代码主要是增加了获取状态码的方法返回信息给浏览器,引导请求用户访问根目录到网页文件上并将相关的网页文件压缩成gz格式。浏览器中支持这种格式的压缩文件,优点是能够减少请求访问的数据量,节约传输的带宽8。除此之外,在代码里边设置了还文件检查函数,如果找到相同命名以及压缩格式的文件就优先返回此格式文件,如果没有找到相关文件就跳转到404页面或者内置的页面上来处理不在预设中的页面。9 文件检查函数相关代码如下:void handleNotFound() String path = server.uri(); String contentType = getContentType(path); String pathWithGz = path + ".gz" if(SPIFFS.exists(pathWithGz) | SPIFFS.exists(path) if(SPIFFS.exists(pathWithGz) path += ".gz" File file = SPIFFS.open(path, "r"); size_t sent = server.streamFile(file, contentType); file.close(); return; String message = "File Not Foundnn" message += "URI: " message += server.uri(); message += "nMethod: " message += ( server.method() = HTTP_GET ) ? "GET" : "POST" message += "nArguments: " message += server.args(); message += "n" for ( uint8_t i = 0; i < server.args(); i+ ) message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "n" server.send ( 404, "text/plain", message );4.4 兵乓球识别原理4.4.1 兵乓球距离识别原理在捡乒乓球时,采用OpenMV机器视觉模块作为图像采集与处理平台。由于OpenMV采用的是单目摄像头,想要实现测距,就需要选取摄像头里乒乓球做参照物,利用参照物的大小比例来计算摄像头与乒乓球之间的距离。主要利用参照物的大小比例的几何原理,计算摄像头与乒乓球之间的距离10。运用Python语言进行目标识别与扫描定位算法的研究,对摄像头的图象采集进行预处理。根据像素阀值获得识别小球,将参照与直径像素的关系计算得到距离数据传输给Esp8266控制小车实现抓取。对于参照物距离的三角几何函数关系如图4.4.1所示:摄像头里的图像Hm真实的RmdcCpixDpix真实环境里的图像Lm图4.4.1 星瞳科技官网所示几何关系由左边摄像头的几何关系可知:由右边的真实环境里的几何关系得知:代入得:上面就是最终我们知道的关系,等号左边的Lm是长度,Dpix是摄像头中,球所占的直径的像素。等号右边,Rm是球真实的半径11,Cpix是是固定的像素,C是视角的一半。这个公式告诉我们的就是:实际长度和摄像头里的像素成反比。简化就是:距离 = 一个常数/直径的像素因此,在代码里面我们设置一个常数K:K=5000为了便于追踪兵乓球设置了ROI, 也就是region of interest,即感兴趣区域。一般如果不设置ROI就默认为是整个图像区域。当绘制矩形感兴趣区域时一般通过四个参数来确定ROI,ROI左顶点坐标以及矩形区域的宽高。像素坐标为(x,y)包括横坐标x参数和纵坐标y参数两个参数,矩形区域宽w参数,高h参数两个参数。找到目标颜色后从左上角圈出一个矩形,该矩形区域便是色块们的外框。而在blob色块的对象中,2代表目标区域的宽,3代表目标区域的高。max_blob2返回色块的外框的宽度,max_blob3则返回色块的外框的高度。计算直径的像素为:Lm = (max_blob2+max_blob3)/2综上可得: length = K/Lm4.4.2 兵乓球颜色识别原理利用颜色阈值取出跟踪目标。兵乓球的颜色是识别目标的一个比较突出的特点,RED,GREEN,BLUE是彩色图像的三基色,在此基础上建立的模型是RGB模型,然而这里我需要的是LAB模型。LAB模型由三个通道组成,但不是R、G、B通道。它的其中一个通道是表示明亮度,即L分量。另外两个是色彩通道,用A和B来表示。在转换到LAB之前要先将RGB转换到XYZ12,因为RGB无法直接转换到LAB。即整个流程下来:从RGB到XYZ再到LAB13因此RGB颜色空间转换到LAB颜色空间的公式分两部分:(1) RGB转XYZ(2) 其中由X、Y、Z转换到L、a、b的函数f(x)为:通过计算上面两个公式,得出LAB色彩空间三个通道的值。颜色阈值分割就是利用LAB的相关特性,设置一个范围将所需要区别于背景的目标颜色提取出来。就比如当我们需要捕捉的兵乓球的颜色是黄色时,通过OpenMV IDE中的阈值编辑器获取的颜色阈值的范围如图4.4.2所示:图4.4.2 LAB阈值范围然后将获取到的颜色阈值范围的相关数值填入yellow_threshold函数:yellow_threshold = (0, 100, 12, 127, 34, 127)通过颜色阈值分割我们能很直观的提取出画面中的兵乓球,但是阈值的选取最大的缺点就是容易受到背景颜色的干扰。为避免背景色块的影响,可以设置面积阈值和像素个数阈值,当阈值大于色块被框起来的面积以及色块像素数量时,就可以过滤掉那些不必要的背景色块,这样就能在一定程度上排除背景颜色对小球的干扰。部分代码如下: img = sensor.snapshot() blobs=img.find_blobs(yellow_threshold,pixels_threshold=100,area_threshold=100)4.4.3 兵乓球形状识别原理在识别兵乓球形状时主要使用了霍夫圆变换,它是霍夫变换的一种特殊形式。霍夫圆变换和霍夫直线的检测完完全全是一样的,只是算法的复杂度会高一个指数,即n的4次方复杂度,直线的话是的3次方的复杂度,所以检测出圆形会慢一些。霍夫变化寻找直线可以根据两个参数确定一条直线,而圆需要三个参数,半径的长度以及圆心的位置。圆心的位置是两