smartcamera ── AI Camera 应用层驱动库

smartcamera 模块提供AI Camera模块的摄像头、显示屏、KPU运算、补光灯、按键等应用驱动。

SmartCamera

class smartcamera.SmartCamera(rx=Pin.P13, tx=Pin.P14)

构建AI Camera应用实例, rxtx 参数为定义串口通讯引脚。

smartcamera.light

k210.Light 的实例,用于控制补光灯亮灭。有关更多类的方法,请查阅该类详情。

smartcamera.button

k210.Button 的实例,检测按键状态。有关更多类的方法,请查阅该类详情。

smartcamera.image

k210.Image 的实例, Image 尺寸为AI Camera的LCD屏的尺寸大小(240*135)。有关更多类的方法,请查阅该类详情。

smartcamera.sensor

k210.Sensor 的实例,用于摄像头的操作。有关更多类的方法,请查阅该类详情。

smartcamera.lcd

k210.LCD 的实例,用于LCD屏的操作。有关更多类的方法,请查阅该类详情。

smartcamera.kpu

k210.KPU 的实例,用于AI模型运行的相关。有关更多类的方法,请查阅该类详情。

实时摄像
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from mpython import *
import smartcamera
import time
import music
ai_camera = smartcamera.SmartCamera(Pin.P13, Pin.P14)

while True:
    img = ai_camera.sensor.snapshot()
    ai_camera.lcd.display(img)
    if ai_camera.button.was_pressed():
        localtime = time.localtime()
        img_name = "img_{:2d}_{:2d}_{:2d}.jpg" .format(
            localtime[3], localtime[4], localtime[5])
        img.save("/sd/{}" .format(img_name))
        music.pitch(1000, 200)
        print('Save image: {}' .format(img_name))
image绘图操作
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from mpython import *
import smartcamera
import time

ai_camera =smartcamera.SmartCamera(Pin.P13,Pin.P14)

# 图片填充红色
ai_camera.image.fill((255, 0, 0))
ai_camera.lcd.display(ai_camera.image)
time.sleep(0.4)

# 图片填充绿色
ai_camera.image.fill((0, 255, 0))
ai_camera.lcd.display(ai_camera.image)
time.sleep(0.4)

# 图片填充蓝色
ai_camera.image.fill((0, 0, 255))
ai_camera.lcd.display(ai_camera.image)
time.sleep(0.4)

# 图片像素点清除
ai_camera.image.clear()
# 字符显示
ai_camera.image.DispChar("Hello,MaixPy!", 0, 0, color=(255, 255, 255))
ai_camera.image.DispChar("你好,掌控板!", 0, 16, color=(255, 0, 0))

# 画线
ai_camera.image.DispChar("水平线", 0, 40,(255, 255, 0))
ai_camera.image.hline(40, 50, 50, c=(255, 255, 0), thickness=1)
ai_camera.image.DispChar("垂直线", 0, 50,(255,0,0))
ai_camera.image.vline(50, 60, 50, c=(255,0,0), thickness=2)
ai_camera.image.DispChar("任意线", 0, 60,(0, 255, 255))
ai_camera.image.line(50, 70, 80, 90, c=(0, 255, 255), thickness=1)


#画点
import random
ai_camera.image.DispChar('画点',100,80)
for i in range(20):
    x=random.randint(100,150)
    y=random.randint(80,130)
    ai_camera.image.pixel(x,y,c=(255,255,0))

ai_camera.lcd.display(ai_camera.image)

# # 绘制矩形框
ai_camera.image.DispChar('矩形', 100, 0)
ai_camera.image.rect(100, 16, 30, 30, c=(255, 0, 0), thickness=2)

# # 绘制实心矩形
ai_camera.image.DispChar('实心矩形', 150, 0)
ai_camera.image.fill_rect(150, 16, 30, 30, c=(0, 255, 0))


# 画中画
ai_camera.image.DispChar('画中画', 150, 60)
ai_camera.image.draw_image(ai_camera.sensor.snapshot(),150,80,x_scale=0.2, y_scale=0.2)
ai_camera.lcd.display(ai_camera.image)
人脸检测
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from mpython import *
import smartcamera


ai_camera = smartcamera.SmartCamera(Pin.P13, Pin.P14)

# 模型加载
task = ai_camera.kpu.load(0x300000)   # 人脸追踪 flash地址
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987,
          5.3658, 5.155437, 6.92275, 6.718375, 9.01025)

ai_camera.kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while True:
    img = ai_camera.sensor.snapshot()
    code = ai_camera.kpu.run_yolo2(task, img)
    if code:
        for i in code:
            print('侦测到人脸, 位置({},{},{},{}), 概率为{:0.2f}'.format(
                i['x'], i['y'], i['w'], i['h'], i['value']))
            img.rect(i['x'], i['y'], i['w'], i['h'])
            img.DispChar('{:0.2f}' .format(i['value']), i['x'], i['y'])
    ai_camera.lcd.display(img)
20类检测
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from mpython import *
import smartcamera


ai_camera = smartcamera.SmartCamera(Pin.P13, Pin.P14)

classes = ['飞机', '自行车', '鸟', '船', '瓶子', '大巴', '小车', '猫', '椅子', '牛',
           '餐桌', '狗', '马', '摩托车', '人', '植物', '羊', '沙发', '火车', '监视器']
task = ai_camera.kpu.load(0x640000)   # 20类模型的flash地址
anchor = (1.08, 1.19, 3.42, 4.41, 6.63, 11.38, 9.42, 5.11, 16.62, 10.52)
ai_camera.kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)

while True:
    img = ai_camera.sensor.snapshot()
    code = ai_camera.kpu.run_yolo2(task, img)
    if code:
        for i in code:
            print('识别到{}, 位置({},{},{},{}), 概率为{:0.2f}' .format(
                classes[i['classid']], i['x'], i['y'], i['w'], i['h'], i['value']))
            img.rect(i['x'], i['y'], i['w'], i['h'])
            img.DispChar('{},概率{:0.1f}' .format(
                classes[i['classid']], i['value']), i['x'], i['y'])

    ai_camera.lcd.display(img)
4类花的图像分类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from mpython import *
import smartcamera


ai_camera = smartcamera.SmartCamera(Pin.P13, Pin.P14)
# ai_camera.repl.debug =1

ai_camera.sensor.set_windowing((224, 224))
ai_camera.sensor.run(1)

ai_camera.lcd.clear()
ai_camera.lcd.draw_string(0, 0, "MobileNet_Classifier Demo")

labels=["daisy","dandelion","roses","sunflowers","tulipss"]

task = ai_camera.kpu.load("/sd/Classifier_flower.kmodel") 
ai_camera.lcd.clear()

while True:
    img = ai_camera.sensor.snapshot()
    classifier_ret = ai_camera.kpu.forward(task, img)
    classifier_max_pro = max(classifier_ret)
    max_index = classifier_ret.index(classifier_max_pro)
    ai_camera.lcd.display(img)
    ai_camera.lcd.draw_string(0,0,"%.1f: %s" %(classifier_max_pro, labels[max_index]))
    print("类别: {}, 概率: {}" .format(labels[max_index], classifier_max_pro))

上述示例 4类花图像分类kmodel模型 下载。