背景介绍:
通过 《图像处理基础》能知道视觉就是在图片上找目标。通过《OpenMV 图片对象(目标识别基础)》能知道怎么找目标。本篇继续这个话题,说说找目标是为了做什么。
提取赛道
线性回归方法的优点是能在视场中的任何位置找到线,缺点是慢。巡线设置为“灰度”、“QQQVGA”来加快速度,由于不跟踪颜色,所以不需要闭自动白平衡。
使用 histeq()
方法提高图像的对比度,以便接下来将图像二值化分离出赛道。
下面用 OpenMV IDE 提取赛道的灰度阀值,如下:
因为 Sugar 从柜子里翻出的老赛道充满了褶皱,所以噪点特别多。下面用 mean(2)
方法消个噪,再看下效果:
现在看上去好多了,接下来把图像通过 binary()
方法二值化,提取出赛道,如下:
赛道有点细,可以通过 erode(1)
让赛道粗一点,如下:
找赛道
1、车灯
小车前放车灯减小环境光对图像的影响,灯选用 WS2812 灯条(8 个灯珠)。WS2812 的驱动代码如下:
# -*- coding: utf-8 -*-
import gc
import pyb
ON = 255
OFF = 0
class WS2812:
"""
Driver for WS2812 RGB LEDs. May be used for controlling single LED or chain
of LEDs.
Example of use:
chain = WS2812(spi_bus=1, led_count=4)
data = [
(255, 0, 0), # red
(0, 255, 0), # green
(0, 0, 255), # blue
(85, 85, 85), # white
]
chain.show(data)
Version: 1.0
"""
buf_bytes = (0x88, 0x8e, 0xe8, 0xee)
def __init__(self, spi_bus=1, led_count=1, intensity=1):
"""
Params:
* spi_bus = SPI bus ID (1 or 2)
* led_count = count of LEDs
* intensity = light intensity (float up to 1)
"""
self.led_count = led_count
self.intensity = intensity
# prepare SPI data buffer (4 bytes for each color)
self.buf_length = self.led_count * 3 * 4
self.buf = bytearray(self.buf_length)
# SPI init
self.spi = pyb.SPI(spi_bus, pyb.SPI.MASTER, baudrate=3200000, polarity=0, phase=1)
# turn LEDs off
self.show([])
def