K210颜色识别实践

本文内容是对官方例程做一个详细讲解,作为笔记便于回顾学习。

在本文中,我们将学习如何使用K210进行颜色识别,并将识别结果实时显示在LCD屏幕上,将逐步解释代码的各个部分,包括每个参数的含义以及函数的返回值。

1、简介

K210是一款嵌入式人工智能芯片,具有强大的图像处理能力。在这个示例中,我们将利用K210的图像处理功能进行颜色识别,以检测摄像头捕获的图像中的红色、绿色和蓝色区域,并在LCD屏幕上标记出这些区域。

硬件连接如图:

2、完整代码展示


import sensor,lcd,time

#摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1) #后置模式,所见即所得

#lcd初始化
lcd.init()

clock=time.clock()

# 颜色识别阈值 (L Min, L Max, A Min, A Max, B Min, B Max) LAB模型
# 下面的阈值元组是用来识别 红、绿、蓝三种颜色,当然你也可以调整让识别变得更好。
thresholds = [(30, 100, 15, 127, 15, 127), # 红色阈值
              (30, 100, -64, -8, -32, 32), # 绿色阈值
              (0, 30, 0, 64, -128, -20)] # 蓝色阈值

while True:

    clock.tick()

    img=sensor.snapshot()

    blobs = img.find_blobs([thresholds[2]]) # 0,1,2分别表示红,绿,蓝色。
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4])
            tmp=img.draw_cross(b[5], b[6])

    lcd.display(img)     #LCD显示图片
    print(clock.fps())   #打印FPS

这里只是为了更全貌的了解代码,在下面分块解释。

3、分块解释

import sensor, lcd, time

首先导入摄像头(sensor)、LCD(lcd)和时间(time)模块。

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(1)
  1. sensor.reset()

    • 作用:复位摄像头。
    • 参数:无。
    • 返回值:无。
    • 说明:该函数用于将摄像头模块恢复到默认状态,包括清除所有设置和配置。调用此函数后,摄像头将处于初始状态,可以重新设置参数。
  2. sensor.set_pixformat()

    • 作用:设置摄像头的像素格式。
    • 参数:sensor.RGB565sensor.GRAYSCALE
    • 返回值:无。
    • 说明:通过该函数可以设置摄像头采集图像的像素格式。sensor.RGB565 表示每个像素用16位表示,其中5位用于红色、6位用于绿色和5位用于蓝色sensor.GRAYSCALE 表示每个像素用8位表示,用于灰度图像。根据需求选择适合的像素格式。
  3. sensor.set_framesize()

    • 作用:设置摄像头的帧大小。
    • 参数:sensor.QVGAsensor.VGAsensor.HD 等。
    • 返回值:无。
    • 说明:该函数用于设置摄像头采集图像的帧大小。常见的帧大小包括 sensor.QVGA(320x240)、sensor.VGA(640x480)和 sensor.HD(1280x720)。选择合适的帧大小可以平衡图像质量和处理性能。
  4. sensor.set_vflip()

    • 作用:设置摄像头的垂直翻转模式。也叫后置模式,所见即所得。
    • 参数:01
    • 返回值:无。
    • 说明:该函数用于设置摄像头的垂直翻转模式,即将图像垂直翻转以适应不同的应用场景。当参数为 1 时,表示开启垂直翻转模式;当参数为 0 时,表示关闭垂直翻转模式。
#lcd初始化
lcd.init()

clock=time.clock()

初始化LCD屏幕,准备开始LCD显示操作。
创建一个时钟对象,用于跟踪每秒的帧数。

# 颜色识别阈值 (L Min, L Max, A Min, A Max, B Min, B Max) LAB模型
# 下面的阈值元组是用来识别 红、绿、蓝三种颜色,当然你也可以调整让识别变得更好。
thresholds = [(30, 100, 15, 127, 15, 127),  # 红色阈值
              (30, 100, -64, -8, -32, 32),  # 绿色阈值
              (0, 30, 0, 64, -128, -20)]   # 蓝色阈值

定义了用于颜色识别的阈值,这些阈值分别用于识别红色、绿色和蓝色区域。

LAB色彩空间是一种将颜色描述为人眼感知到的亮度(L)和两个颜色通道的色度(A、B)的模型。这种色彩空间是一种设备无关的颜色表示方法,不受光源的影响。在LAB色彩空间中,L表示亮度(从黑到白的变化),A和B表示色度。A通道表示从绿色到红色的变化,负值表示绿色,正值表示红色。B通道表示从蓝色到黄色的变化,负值表示蓝色,正值表示黄色。
LAB色彩空间的主要优点是它的设备无关性,即使在不同的设备或光照条件下,相同的LAB值也会产生相似的颜色。因此,它在颜色识别和颜色校正等应用中被广泛使用。
在给定的阈值中,通常使用LAB色彩空间来表示颜色范围,以便在图像处理中识别特定的颜色。通过调整阈值的L、A、B值,可以选择性地识别不同的颜色。

while True:
    clock.tick()  # 更新时钟,用于计算每秒的帧数
    img = sensor.snapshot()  # 获取摄像头采集的当前图像
    blobs = img.find_blobs([thresholds[2]])  # 在图像中寻找符合蓝色阈值的区域,返回一个区域列表
    if blobs:  # 如果找到了符合条件的区域
        for b in blobs:  # 遍历每个找到的区域
            tmp = img.draw_rectangle(b[0:4])  # 在图像上绘制一个矩形框,用于标记检测到的区域
            tmp = img.draw_cross(b[5], b[6])  # 在图像上绘制一个十字叉,叉的中心点为检测到的区域的中心
    lcd.display(img)  # 在LCD屏幕上显示处理后的图像
    print(clock.fps())  # 打印每秒的帧数,用于性能监控

在给定的代码中,clock = time.clock()创建了一个时钟对象,然后在后续的循环中,clock.tick()方法被调用来更新时钟对象。这样做的目的是为了追踪每秒的帧数(FPS,Frames Per Second),因为clock.tick()方法会在每次调用时更新时钟对象的内部状态,以计算出时间间隔,从而实现对每秒的帧数进行计数
帧率如图所示:

blobs是一个列表,其中包含了图像中所有符合给定颜色阈值的区域。每个区域都是一个元组,包含了区域的一些属性信息,例如位置、尺寸等。

在这个特定的例子中,blobs = img.find_blobs([thresholds[2]])是通过在图像中寻找符合蓝色阈值的区域来进行目标检测。函数find_blobs()接受一个阈值列表作为参数,并返回一个包含所有符合条件的区域的列表

每个区域(或blob)都是一个元组,包含以下信息:

  1. blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。
  2. blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。
  3. blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。
  4. blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。
  5. blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。
  6. blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
  7. blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。

如果找到了符合条件的区域(色块),我们遍历每个区域,并使用img.draw_rectangle(b[0:4])在图像上绘制一个矩形框,用于标记检测到的区域,并使用img.draw_cross(b[5], b[6])在图像上绘制一个十字叉,叉的中心点为检测到的区域的中心。

当调用 img.draw_rectangle(b[0:4])img.draw_cross(b[5], b[6]) 方法时,需要传入相应的参数来指定要绘制的矩形框和十字叉的位置、大小和样式。下面是参数的解释:

img.draw_rectangle(b[0:4])

  • b[0]: 矩形框左上角的 x 坐标。
  • b[1]: 矩形框左上角的 y 坐标。
  • b[2]: 矩形框的宽度。
  • b[3]: 矩形框的高度。

img.draw_cross(b[5], b[6])

  • b[5]: 十字叉的中心点的 x 坐标。
  • b[6]: 十字叉的中心点的 y 坐标。

这些参数提供了绘制矩形框和十字叉所需的位置和尺寸信息。通过调整这些参数,可以控制矩形框和十字叉的位置和大小,以便更好地标记和可视化图像中的检测结果。

效果如图所示:

最后,我们将处理后的图像显示在LCD屏幕上,并通过print(clock.fps())打印每秒的帧数。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值