废话不多说,先上代码:
import sensor, image, time
red_threshold = (0, 255, 50, 12, -4, 27)
black_threshold = (0, 255, -81, -40, 40, 79)
red_color_code = 1
black_color_code = 2
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(True)
sensor.set_auto_exposure(False, 103000)
sensor.skip_frames(time=2000)
clock = time.clock()
def color_blob():
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_auto_whitebal(False)
sensor.set_vflip(True)
sensor.skip_frames(time=2000)
sensor.set_auto_gain(False)
clock = time.clock()
while True:
clock.tick()
img = sensor.snapshot().lens_corr(1.8)
blobs = img.find_blobs([red_threshold, black_threshold], area_threshold=10, roi=(108, 35, 170, 165), merge=True)
if blobs:
for blob in blobs:
# 处理识别到的色块...
pass
else:
color_code = 0
pass
def tuxing():
rrr = img.find_rects(threshold=20000, roi=(108, 35, 170, 165))
if rrr:
for r in img.find_rects(threshold=20000, roi=(108, 35, 170, 165)):
# 处理识别到的矩形...
pass
if aa1 != 0 and aa2 != 0:
color_blob()
while True:
clock.tick()
img = sensor.snapshot().lens_corr(1.8)
img.draw_rectangle(108, 35, 170, 165, color=(255, 255, 255))
tuxing()
代码解析:
首先,导入了三个模块:sensor
、image
和 time
。
接下来定义了两个颜色阈值变量:
red_threshold
:表示红色的阈值范围。由一个六元组(0, 255, 50, 12, -4, 27)
组成,分别表示红色在 RGB 色彩空间中的最小和最大取值范围。black_threshold
:表示黑色的阈值范围。由一个六元组(0, 255, -81, -40, 40, 79)
组成,分别表示黑色在 RGB 色彩空间中的最小和最大取值范围。
然后定义了两个颜色代码变量:
red_color_code
:表示红色的代码,赋值为 1。black_color_code
:表示黑色的代码,赋值为 2。
接下来进行了图像传感器的设置和初始化。步骤如下:
- 调用
sensor.reset()
方法重置传感器设置。 - 设置图像格式为 RGB565,使用
sensor.set_pixformat(sensor.RGB565)
。 - 设置图像帧大小为 QVGA(320x240 分辨率),使用
sensor.set_framesize(sensor.QVGA)
。 - 使用
sensor.set_vflip(True)
方法进行图像的垂直翻转。 - 关闭自动曝光,设置曝光时间为 103000 微秒,使用
sensor.set_auto_exposure(False, 103000)
。 - 使用
sensor.skip_frames(time=2000)
跳过前两秒的帧。
接下来创建了一个 clock
对象用于计时。
紧接着是 color_blob()
函数的定义,用于处理识别到的色块。函数内部的操作如下:
- 再次进行了图像传感器的设置和初始化,与之前相同。
- 进入一个无限循环,不断进行图像处理。
- 使用
sensor.snapshot().lens_corr(1.8)
获取当前图像并进行镜头校正。 - 调用
img.find_blobs()
方法来识别图像中的色块。传入了颜色阈值列表[red_threshold, black_threshold]
,并设置最小面积阈值为 10,感兴趣区域为(108, 35, 170, 165)
。 - 如果找到了色块,则遍历每个色块并进行相应的处理。在代码中省略了处理色块的部分(通过注释标识),您需要根据实际需求添加适当的处理代码。
- 如果没有找到色块,则将
color_code
设为 0,并执行一个空语句(pass
)。
然后定义了 tuxing()
函数,用于处理识别到的矩形。函数内部的操作如下:
- 调用
img.find_rects()
方法来识别图像中的矩形。传入了阈值为 20000,感兴趣区域为(108, 35, 170, 165)
。 - 如果找到了矩形,则遍历每个矩形并进行相应的处理。在代码中省略了处理矩形的部分(通过注释标识),您需要根据实际需求添加适当的处理代码。
- 如果
aa1
和aa2
都不等于 0,则调用color_blob()
函数。
最后,在主循环中,进行以下操作:
- 调用
sensor.snapshot().lens_corr(1.8)
获取当前图像并进行镜头校正。 - 使用
img.draw_rectangle(108, 35, 170, 165, color=(255, 255, 255))
在图像上绘制一个白色的矩形框,这是感兴趣区域。 - 调用
tuxing()
函数来处理识别到的矩形。