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
:
思路说明:
#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 采集到的图像