2021年送药小车,视觉部分功能实现(包括循迹)

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()

写了一下午的代码,试了一下效果可以,今天就到这里了,明天再更新相关代码的解释

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值