本文内容是对官方例程做一个详细讲解,作为笔记便于回顾学习。
在本文中,我们将学习如何使用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())
打印每秒的帧数。