赞
踩
前言:基于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())
###大家可根据自身需求对代码进行更改参数、恢复注释
参考资料:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。