roi是“感兴趣区”。
left_roi = [0,0,160,240]
blobs = img.find_blobs([red],roi=left_roi)
x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10:
blobs = img.find_blobs([red],x_stride=10)
y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5:
blobs = img.find_blobs([red],y_stride=5)
invert 反转阈值,把阈值以外的颜色作为阈值进行查找
area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉
pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉
merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。
blob有多个方法:
blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用
blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。
blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。
blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。
blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。
blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。
blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。
blob.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过blob[7]来获取。
blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:
blobs = img.find_blobs([red, blue, yellow], merge=True)
如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。
blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。
blob.area() 返回色块的外框的面积。应该等于(w * h)
blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。
比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。
#uart = UART(1, 115200) # 串口配置 P1 P0(TX RX)
#uart = UART(3, 115200) # P4 P5
THRESHOLD = (20, 47, 21, 57, 11, 47)
import sensor, image, time,ustruct
from pyb import UART,LED
import pyb
sensor.reset()
#sensor.set_vflip(True)
#sensor.set_hmirror(True)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQQVGA)
#sensor.set_windowing([0,20,80,40])
sensor.skip_frames(time = 2000)
clock = time.clock()
下边是视觉小车部分
#32通信
uart = UART(1,115200) #定义串口3变量
uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters
#识别区域,绘图区域 左右上区域
roi1 = [(0, 17, 15, 25), # 左 x y w h
(65,17,15,25), # 右
(30,0,20,15), # 上
(0,0,80,60)] # 停车
def send_data_w(x,a,f_x,f_a):
global uart;
data = ustruct.pack("<bbhhhhb", #格式为俩个字符俩个短整型(2字节)
0x2C, #帧头1 00101100
0x12, #帧头2 00010010
#下面的4个数据存到上面的情况里面,进行一个打包
int(x), # rho 截距
int(a), # theat 角度
int(f_x), # 位置判断信息
int(f_a), # 位置判断信息
0x5B) # 帧尾 01011011
uart.write(data);
while(True):
clock.tick()
img = sensor.snapshot().binary([THRESHOLD])
line = img.get_regression([(100,100)], robust = True)
left_flag,right_flag,up_flag=(0,0,0)#三个区域块的值,和下面的判断相关
for rec in roi1:
img.draw_rectangle(rec, color=(255,0,0))#绘制出roi区域
if (line):
rho_err = abs(line.rho())-img.width()/2
if line.theta()>90:
theta_err = line.theta()-180
else:
theta_err = line.theta()
#直角坐标调整
img.draw_line(line.line(), color = 127)
#画出直线
x=int(rho_err)
a=int(theta_err)
f_x=0
f_a=0
if x<0:
x=-x
f_x=1
if a<0:
a=-a
f_a=1
if line.magnitude()>8:
outdata=[x,a,f_x,f_a]
print(outdata)
send_data_w(x,a,f_x,f_a) #outuart发送的就是 x,a,flag,对应的就是截距,角度
if img.find_blobs([(96, 100, -13, 5, -11, 18)],roi=roi1[0]): #left
left_flag=1
if img.find_blobs([(96, 100, -13, 5, -11, 18)],roi=roi1[1]): #right
right_flag=1
if img.find_blobs([(96, 100, -13, 5, -11, 18)],roi=roi1[2]): #up
up_flag=1
if left_flag==1 and right_flag==1:
send_data_w(0,0,2,2)
time.sleep_ms(100)
send_data_w(0,0,2,2)
print(0,0,2,2)
print('shizi')
continue
else:
pass
else:
send_data_w(0,0,3,3)
print('3')
print('stop')
LAB 是一种颜色空间(类似 RGB),它将颜色分解为三个分量,更符合人眼对颜色的感知方式,在机器视觉中常用于颜色阈值分割。
L(Lightness):亮度· 含义:表示颜色的明暗程度,与颜色无关。
A(Green-Red):绿红分量· 含义:表示颜色在绿色和红色之间的偏向。
B(Blue-Yellow):蓝黄分量· 含义:表示颜色在蓝色和黄色之间的偏向。