K210视觉体验—颜色识别
K210视觉体验—颜色识别使用设备ZTFR开发板颜色识别Lab 颜色空间构造函数示例代码1:识别RGB(红,绿,蓝)示例代码2:识别指定颜色使用设备ZTFR开发板颜色识别MaixPy 集成了 RGB565 颜色块识别 find_blobs 函数,主要是基于 LAB 颜色模型(每个颜色都是用一组 LAB阈值表示,有兴趣的用户可以自行查阅相关模型资料)。其位于 image模块下,因此我们直接将拍摄到的
·
K210视觉体验—颜色识别
使用设备
ZTFR开发板
颜色识别
MaixPy 集成了 RGB565 颜色块识别 find_blobs 函数,主要是基于 LAB 颜色模型(每个颜色都是用一组 LAB阈值表示,有兴趣的用户可以自行查阅相关模型资料)。其位于 image模块下,因此我们直接将拍摄到的图片进行处理即可。
Lab 颜色空间
打开MaixPy IDE,选择工具——机器视觉——阕值编辑器
构造函数
image 图像模块。导入image模块
import image
//色块对象是由 image.find_blobs 返回的。
image.find_blobs(thresholds, invert=False, roi, x_stride=2, y_stride=1, area_threshold=10, pixels_threshold=10, merge=False,margin=0, threshold_cb=None, merge_cb=None)
查找图像中指定的色块。返回 image.blog 对象列表;
【thresholds】 必须是元组列表。 [(lo, hi), (lo, hi), ..., (lo, hi)] 定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。 对于 RGB565 图像,每个元组需要有六个值(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi) - 分别是 LAB L,A 和 B通道的最小值和最大值。
【area_threshold】若色块的边界框区域小于此参数值,则会被过滤掉;
【pixels_threshold】若色块的像素数量小于此参数值,则会被过滤掉;
【merge】若为 True,则合并所有没有被过滤的色块;
【margin】调整合并色块的边缘。
函数 | 说明 |
---|---|
blob.rect() | 返回一个矩形元组(x,y,w,h),如色块边界。可以通过索引[0-3]来获得这些值。 |
blob.x() | 返回色块的边界框的x坐标(int)。可通过索引 [0] 取得这个值。 |
blob.y() | 返回色块的边界框的y坐标(int)。可通过索引 [1] 取得这个值。 |
blob.w() | 返回色块的边界框的w坐标(int)。可通过索引 [2] 取得这个值。 |
blob.h() | 返回色块的边界框的h坐标(int)。可通过索引 [3] 取得这个值。 |
blob.pixels() | 返回从属于色块(int)一部分的像素数量。可通过索引 [4] 取得这个值。 |
blob.cx() | 返回色块(int)的中心x位置。可通过索引 [5] 取得这个值。 |
blob.cy() | 返回色块(int)的中心x位置。可通过索引 [6] 取得这个值。 |
blob.rotation() | 返回色块的旋转(单位:弧度)。如果色块类似铅笔或钢笔,那么这个值就是介于0-180之间的唯一值。 如果这个色块圆的,那么这个值就没有效用。如果这个色块完全不具有对称性,您只能由此得到0-360度的旋转。可通过索引 [7] 取得这个值。 |
blob.code() | 返回一个16位的二进制数字,其中为每个颜色阈值设置一个位,这是色块的一部分。 例如,如果您通过 image.find_blobs 来寻找三个颜色阈值,这个色块可以设置为0/1/2位。 注意:除非以 merge=True 调用 image.find_blobs ,否则每个色块只能设置一位。 那么颜色阈值不同的多个色块就可以合并在一起了。 您也可以用这个方法以及多个阈值来实现颜色代码跟踪。可通过索引 [8] 取得这个值。 |
blob.count() | 返回合并为这一色块的多个色块的数量。只有您以 merge=True 调用 image.find_blobs 时,这个数字才不是1。可通过索引 [9] 取得这个值。 |
blob.area() | 返回色块周围的边框面积(w * h) |
blob.density() | 返回这个色块的密度比。这是在色块边界框区域内的像素点的数量。 总的来说,较低的密度比意味着这个对象的锁定得不是很好。 |
示例代码1:识别RGB(红,绿,蓝)
import sensor,image,lcd,time
#------常用初始化 ↓-------
lcd.init()
sensor.reset() #复位摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式 RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧尺寸 QVGA (320x240)
#------常用初始化 ↑-------
'''对于 RGB565 图像,每个元组需要有六个值(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi)
分别是 LAB中 L,A 和 B 通道的最小值和最大值。
L的取值范围为0-100,a/b 的取值范围为-128到127。'''
#红色阈值[0],绿色阈值[1],蓝色阈值[2]
rgb_thresholds =[(30, 100, 15, 127, 15, 127),
(0, 80, -70, -10, -0, 30),
(0, 30, 0, 64, -128, -20)] #阈值调试可以在IDE上看哦
while True:
img=sensor.snapshot()
blobs = img.find_blobs([rgb_thresholds[1]])
if blobs:
for b in blobs:
tmp=img.draw_rectangle(b[0:4]) #在图像上绘制一个矩形。
tmp=img.draw_cross(b[5], b[6]) #画十字交叉
c=img.get_pixel(b[5], b[6])# 返回(x, y)位置的RGB888像素元组
lcd.display(img)
示例代码2:识别指定颜色
本篇说了LAB颜色模式,我们来没还没用。而且每个人像是别的色彩是不一样的。光给RGB不够。所以我们要学会自定义哦。方法如下:
- 开局一张图
- 在Maixpy IDE 选择【工具】——【机器视觉】——【阈值编辑器】
- 选择【图像文件】
备注:帧缓冲区要事先把摄像头对准物体,在执行第二步
- 选好图片如下,尝试选择最佳的颜色跟踪阙值,通过滑动条来调节阈值,在二进制图像上红色块高亮(显示白色)。
- 调整好获取LAB添加到代码里
import sensor
import image
import lcd
import time
lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
red_threshold =(89, 100, -122, 96, -128, 47) # LAB
while True:
img=sensor.snapshot()
blobs = img.find_blobs([red_threshold])
if blobs:
for b in blobs:
tmp=img.draw_rectangle(b[0:4])
tmp=img.draw_cross(b[5], b[6])
c=img.get_pixel(b[5], b[6])
lcd.display(img)
- 效果如下
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献8条内容
所有评论(0)