K210-AI视觉

1、颜色识别

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)

thresholds : 必须是元组列表。 [(lo, hi), (lo, hi), …, (lo, hi)] 定义你想追踪的颜色范围。 对于灰度图像,每个元组需要包含两个值 - 最小灰度值和最大灰度值。 仅考虑落在这些阈值之间的像素区域。
对于 RGB565 图像,每个元组需要有六个值(l_lo,l_hi,a_lo,a_hi,b_lo,b_hi) - 分别是 LAB L,A 和 B通道的最小值和最大值。
阈值这个参数不是万能的,要依据个人实际情况进行设置,最准确的就是上电运行,将摄像头对着被追踪物体,然后停止运行,打开阈值编辑器取阈值。

roi : 设置色块寻找区域,对于 QVGA ,全屏寻找就设置成(0,0,320,240),这四个参数分别代表的是x,y,w,h,即x轴开始坐标,y轴开始坐标,x轴宽度,y轴高度。x轴和y轴的零点坐标都在图像的左上方。这个值略微修改就可以摇身一变,让寻找色块变成巡线。比如你可以设置这个值为(0,110,320,20),就表示你要从x轴的0坐标开始,到x轴的320,y轴的110坐标开始,到y轴的130,寻找色块,这样一来,就可以知道小车的当前位置是在x轴哪里,x轴中心是160,如果当前位置小于160,就左转,大于160,就右转,这样就可以完成巡线。

x_stride y_stride : 设置色块x轴、y轴上像素的最小宽度,如果被寻找的目标比较大,可以调大这两个参数提高寻找速度。

color_pixels_threshold :设置被找色块像素的个数阈值,如果被找到的色块像素个数少于这个值,将会被滤除,这是作为一种辅助手段,排除环境干扰的好方法。

color_area_threshold : 设置被找色块被框面积的个数阈值,如果被找到的色块被框面积少于这个值,将会被滤除,这是作为一种辅助手段,排除环境干扰的好方法。

color_merge : 需不需要合并找到的像素,一般都是需要的。

black.color_margin : 控制色块合并间距,例如调节此参数为1,若上面选择True合并色块且被找到的色块有多个,它们之间如果相距1像素,则会将这些色块合并。

返回的对象blob
K210-AI视觉_第1张图片

思路说明:
#1.导入相关模块
#2.初始化模块
#3.定义颜色阈值
#4.寻找相匹配的颜色(红,绿,蓝)

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、KPU使用

import KPU as kpu
import image
#加载模型
task = kpu.load(offset or file_path)

anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)

#pu_net: kpu 网络对象, 即加载的模型对象, KPU.load()的返回值
#threshold: 概率阈值, 只有是这个物体的概率大于这个值才会输出结果, 取值范围:[0, 1]
#nms_value: box_iou 门限, 为了防止同一个物体被框出多个框,当在同一个物体上框出了两个框,这两个框的交叉区域占两个框总占用面积的比例 如果小于这个值时, 就取其中概率最大的一个框
#anchor_num: anchor 的锚点数, 这里固定为 len(anchors)//2
#anchor: 锚点参数与模型参数一致,同一个模型这个参数是固定的,和模型绑定的(训练模型时即确定了), 不能改成其它值。

img = image.Image()
#运行模型
kpu.run_yolo2(task, img)
# task: kpu_load 返回的 kpu_net 对象
# image_t:从 sensor 采集到的图像

你可能感兴趣的:(K210,人工智能,K210)