K210颜色识别实践 您所在的位置:网站首页 图片怎么识别颜色深浅 K210颜色识别实践

K210颜色识别实践

2024-07-04 00:45| 来源: 网络整理| 查看: 265

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

在本文中,我们将学习如何使用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)

sensor.reset()

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

sensor.set_pixformat()

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

sensor.set_framesize()

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

sensor.set_vflip()

作用:设置摄像头的垂直翻转模式。也叫后置模式,所见即所得。参数:0 或 1。返回值:无。说明:该函数用于设置摄像头的垂直翻转模式,即将图像垂直翻转以适应不同的应用场景。当参数为 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)都是一个元组,包含以下信息:

blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。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())打印每秒的帧数。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有