《K230 从熟悉到...》颜色识别
《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, sys
from 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*240
sensor.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 run
if isinstance(sensor, Sensor):
sensor.stop()
# deinit display
Display.deinit()
os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
time.sleep_ms(100)
# release media buffer
MediaManager.deinit()