前言:基于spieed出品的MaixPy-Dock开发板(K210芯片)进行实践。编译运用MicroPython语言,其是基于 Python3 的语法做的一款解析器,包含了 Python3 的大多数基础语法,主要运行在性能和内存有限的嵌入式芯片上。
计算机视觉为无人机的导航提供了不可估量的作用,本文实现无人机对基础图形、颜色的识别与视觉循迹功能(视觉算法部分 不包括串口通信)
import sensor, image, time, lcd
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 灰度更快
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
lcd.init()
clock = time.clock()
#----颜色参数选择----#
color_a = (20, 52, -13, 70, 2, 65)
#---------------------------------功能函数--------------------------------------#
#----------圆形图像识别---------#
def fcircle():
img = sensor.snapshot().lens_corr(1.8)
img.laplacian(1, sharpen=True)
#lcd.display(img)
for c in img.find_circles(threshold = 5000, x_margin = 10, y_margin = 10, r_margin = 10,r_min = 1, r_max = 80, r_step = 2):
a=img.draw_circle(c.x(), c.y(), c.r(), color = (0, 255, 0))
#lcd.display(a)
print(c)
#----------矩形图像识别---------#
def frectangle():
img = sensor.snapshot().lens_corr(1.8)
img.laplacian(1, sharpen=True)
for r in img.find_rects(threshold = 10000):
img.draw_rectangle(r.rect(), color = (255, 0, 0))
for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0))
print(r)
#----------特定颜色识别---------#
def find_max_blob(blobs):
maxsize = 0
for blob in blobs:
if blob[2]*blob[3] > maxsize:
mmax_blob = blob
maxsize = blob[2]*blob[3]
return mmax_blob
def fcolors(color):
img = sensor.snapshot() # 拍一张照片并返回图像。
blobs = img.find_blobs([color])
if blobs:
b = find_max_blob(blobs)
if b[2] > 15 and b[3] > 15:
img.draw_rectangle(b[0:4])
img.draw_cross(b[5], b[6])
print(b[5], b[6])
else:
print('No')
else:
print('NO')
#-----------循迹----------#
def tracing(colors):
# 拍摄一张图片并按阈值二值化
img = sensor.snapshot()
# 使用kpu加速的锐化进行边缘增强
#img.conv3(con_sharpen)
# 对于图像进行kpu加速的高斯模糊,使图像中心化平滑
img.conv3(con_gauss)
img = img.binary(line_color_union)
# 对二值化的图片进行线性回归得到直线
line = img.get_regression([(100,100,0,0,0,0)], roi = (2,2,img.width()-4,img.height()-4))
img.draw_rectangle((2,2,img.width()-4,img.height()-4))
if line and line.magnitude() > 3:
# 在图片上画线
img.draw_line(line.line(), color = 110, thickness = 5)
# 计算横滚误差
erho = abs(line.rho())-img.width()/2
# 计算偏航误差
if line.theta() > 90:
etheta = line.theta()-180
else:
etheta = line.theta()
# 误差归一化
res_erho = erho/(img.width()/2)
res_etheta = etheta/90
# 误差输出
print('tt',int(res_erho*1000), int(res_etheta*1000))
else:
# 定义误差只能小于1000,若输出无效值则寻迹无效
print('tt',1001, 1001)
# 显示图片
lcd.display(img)
#------------------------------------主函数-------------------------------------#
while True:
clock.tick()
#fcircle()
#frectangle()
#fcolors(color_a)
#tracing(color_a)
print("FPS %f" % clock.fps())
###大家可根据自身需求对代码进行更改参数、恢复注释
参考资料:
MaixPy 文档简介 - Sipeed Wiki