import sensor, image, lcd, time
import KPU as kpu
import gc, sys
from machine import UART #串口库函数
from fpioa_manager import fm # GPIO重定向函数
input_size = (224, 224) #拍照图片的大小
labels = [2, 1, 7, 6, 3, 4, 5, 8]
anchors = [1.34, 1.59, 1.5, 1.41, 1.19, 1.12, 1.56, 1.91, 1.22, 1.34]
Threshold = (25, 0, 32, -63, -23, 40) #图像阈值
roi1 = (0,40,320,30) #感兴趣区,也就是色块识别的区域,在那一块区域进行色块识别
fm.register(7, fm.fpioa.UART1_TX, force=True)
fm.register(6, fm.fpioa.UART1_RX, force=True)
uart_A = UART(UART.UART1, 115200, 8, 0, 1)
def sending_data(x,y,z): #数据包发送代码,由于循迹和数字识别均在K210上进行,因此没有接收的代码
FH = bytearray([0x2C,0x12,x,y,z,0x5B])
uart_A.write(FH);
def lcd_show_except(e):
import uio
err_str = uio.StringIO()
sys.print_exception(e, err_str)
err_str = err_str.getvalue()
img = image.Image(size=input_size)
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)
def main(anchors, labels = None, model_addr="/sd/m.kmodel", sensor_window=input_size, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing(sensor_window)
sensor.set_hmirror(sensor_hmirror)
sensor.set_vflip(sensor_vflip)
sensor.run(1)
lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)
List_score01 = [0]*9 #得分序列,用于检测出正确识别的数字
if not labels:
with open('labels.txt','r') as f:
exec(f.read())
if not labels:
print("no labels.txt")
img = image.Image(size=(320, 240))
img.draw_string(90, 110, "no labels.txt", color=(255, 0, 0), scale=2)
lcd.display(img)
return 1
try:
img = image.Image("startup.jpg")
lcd.display(img)
except Exception:
img = image.Image(size=(320, 240))
img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)
lcd.display(img)
try:
Number_get = 0
Target_Num = 0
flag_1 = 0 #十字路口查验状态,1为检查到十字路口,0为未检查到十字路口
flag_2 = 0 #查验并提取数字是否完成以及控制小车的行驶状态(0~8为提取的数字,10为停止,11为行驶)
status = 0 #状态机状态存储
distance = 0
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
if(status == 0): #开机识别数字状态0 记录数字状态1 查验数字状态2
objects = kpu.run_yolo2(task, img)
if objects:
for obj in objects:
list1=list(obj.rect())
List_score01[int(labels[obj.classid()])] += 1 #为保证可信,只有当数字检测十次后的才认为识别的数字是正确的
if(List_score01[1] >= 10):
Number_get = 1
if(List_score01[2] >= 10):
Number_get = 2
if(List_score01[3] >= 10):
Number_get = 3
if(List_score01[4] >= 10):
Number_get = 4
if(List_score01[5] >= 10):
Number_get = 5
if(List_score01[6] >= 10):
Number_get = 6
if(List_score01[7] >= 10):
Number_get = 7
if(List_score01[8] >= 10):
Number_get = 8
if(Number_get != 0):
List_score01 = [0]*9 #完成一次识别后将得分序列清零,进行下一次的数字识别
Numver_get = 0
pos = obj.rect()
if(Number_get == Target_Num and flag_1 ==1): #查验数字
flag_1 = 0
flag_2 = Target_Num
img.draw_string(pos[0], pos[1], "%s : %.2f" %(labels[obj.classid()], obj.value()), scale=2, color=(255, 0, 0))
if(status == 1):
if(Number_get != 0):
Target_Num = Number_get
status = 0
else:
flag_2 = 10
if(status == 2):
status = 0
flag_1 = 1
blobs = img.find_blobs([Threshold],roi = roi1,merge=True) #识别色块
if blobs:
for blob in blobs:
if (blob.w() > 50): #识别到十字路口
status = 2
distance = blob.cx()
else:
status = 1
else:
distance = 0
sending_data(distance,flag_2,0)
lcd.display(img)
except Exception as e:
raise e
finally:
if not task is None:
kpu.deinit(task)
if __name__ == "__main__":
try:
# main(anchors = anchors, labels=labels, model_addr=0x300000, lcd_rotation=0)
main(anchors = anchors, labels=labels, model_addr="/sd/model-53567.kmodel")
except Exception as e:
sys.print_exception(e)
lcd_show_except(e)
finally:
gc.collect()
写了一下午的代码,试了一下效果可以,今天就到这里了,明天再更新相关代码的解释