《K230 从熟悉到...》颜色识别
- 颜色识别的基本原理
《庐山派 K230 从熟悉到...》颜色识别
颜色识别是计算机视觉中的重要组件,它允许算法在图像中检测、识别和分类不同颜色。
颜色识别的基本原理
颜色识别的核心是通过分析图像中像素点的颜色信息,从中找到符合特定颜色范围的区域。这个过程一般有以下几个步骤:
获取图像:通过摄像头捕获一帧画面,转换成数字信号,供算法处理。
颜色空间转换:将图像从默认的颜色空间(一般是RGB)转换到适合分析的颜色空间(本节是LAB)。
阈值匹配:根据预先设定的颜色范围,筛选出符合条件的像素。
区域分析:将相邻的符合条件的像素组合成“区域”(Blob),并提取区域的特征(比如位置、大小、形状等)。
标记与输出:对识别出的区域进行标记,并输出相关信息。
在庐山派中,步骤2-4可以是由内置的图像处理库自动完成,我们只需定义颜色的阈值范围,并调用相关函数就可以完成颜色识别。
LAB是一种基于人眼感知设计的颜色表示方式,由三个通道组成:
- L通道:表示亮度,范围从黑到白,0表示黑,100表示白。
- A通道:表示从绿色到红色的颜色范围,范围是-128到127。负值靠近绿色,正值靠近红色。
- B通道:表示从蓝色到黄色的颜色范围,范围是-128到127,负值靠近蓝色,正值靠近黄色。
加粗样式
find_blobs(寻找图像中色块)
image.find_circles([roi[, x_stride=2[, y_stride=1[, threshold=2000[, x_margin=10[, y_margin=10[, r_margin=10]]]]]]])
参数 thresholds 必须为元组列表,形式为 [(lo, hi), (lo, hi), …],用于定义需要追踪的颜色范围。
- 对于灰度图像,每个元组应包含两个值:最小灰度值和最大灰度值。函数将仅考虑落在这些阈值之间的像素区域。
- 对于 RGB565 图像(彩色图像),每个元组需要包含六个值 (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi),分别对应 LAB 色彩空间中的 L、A 和 B 通道的最小和最大值。该函数会自动纠正最小值和最大值的交换情况。如果元组包含超过六个值,则其余值将被忽略;若元组不足,则假定缺失的阈值为最大范围。
import time, os, sysfrom media.sensor import *
from media.display import *
from media.media import *sensor = None
fps = time.clock()
try:# 指定颜色阈值# 格式:[min_L, max_L, min_A, max_A, min_B, max_B]color_threshold = [(0, 79, 31, 67, 26, 60)]sensor = Sensor()sensor.reset()sensor.set_framesize(width = 800, height = 480)sensor.set_pixformat(Sensor.YUV420SP)bind_info = sensor.bind_info()Display.bind_layer(**bind_info, layer = Display.LAYER_VIDEO1)# 通道2 320*240sensor.set_framesize(Sensor.QVGA, chn = CAM_CHN_ID_2)sensor.set_pixformat(Sensor.RGB565, chn = CAM_CHN_ID_2)Display.init(Display.ST7701)MediaManager.init()sensor.run()fps = time.clock()# 注意他们2个显示都不在一个层上面!!!while True:fps.tick()os.exitpoint()img = sensor.snapshot(chn = CAM_CHN_ID_2)blobs = img.find_blobs(color_threshold,area_threshold = 2000)# 如果检测到颜色块if blobs:# 遍历每个检测到的颜色块for blob in blobs:# 绘制颜色块的外接矩形# blob[0:4] 表示颜色块的矩形框 [x, y, w, h],img.draw_rectangle(blob[0:4])# 在颜色块的中心绘制一个十字# blob[5] 和 blob[6] 分别是颜色块的中心坐标 (cx, cy)img.draw_cross(blob[5], blob[6])# 在控制台输出颜色块的中心坐标print("Blob Center: X={}, Y={}".format(blob[5], blob[6]))Display.show_image(img, x = 800-320, layer = Display.LAYER_OSD1)print(fps.fps())except KeyboardInterrupt as e:print("user stop: ", e)
except BaseException as e:print(f"Exception {e}")
finally:# sensor stop runif isinstance(sensor, Sensor):sensor.stop()# deinit displayDisplay.deinit()os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)time.sleep_ms(100)# release media bufferMediaManager.deinit()