from maix import display, image
hello_img = image.new(size = (240, 240),
color = (255, 0, 0), mode = "RGB") #创建一张红色背景图
hello_img.draw_string(30, 115, "hello world!", scale = 1.0,
color = (255, 255, 255), thickness = 1) #在红色背景图上写下hello world
display.show(hello_img) #把这张图显示出来
img.draw_line(0, 0, 100, 100, color = (127, 127, 127),
thickness = 1) #画一条从(0,0)到(100,100)的白色线段
display.show(img)
img.draw_rectangle(10, 10, 60, 60, color=(255, 0, 0),
thickness=-1) #画一个从(10, 10)到(60, 60)的红色实心矩形
img.draw_rectangle(80, 160, 160, 200, color=(0, 0, 255),
thickness=1) #画一个从(80, 160)到(160, 200)的蓝色矩形外框
display.show(img)
thickness=1) #画一个中心点在(50,50),半径为20的空心蓝圆
img.draw_circle(150, 150, 20, color=(255, 0, 0),
thickness=-1) #画一个中心点在(150,150),半径为20的实心红圆
display.show(img)
from maix import display, image #引入python模块包
hello_img = image.new(size = (240, 240), color = (0, 0, 0),
mode = "RGB") #创建一张黑色背景图
hello_img.draw_string(30, 115, "hello world!", scale = 1.0, color = (255, 255, 255),
thickness = 1) #在黑色背景图上写下hello world
display.show(hello_img) #把这张图显示出来
img = image.new(color=(255, 255, 255))
image.load_freetype("/home/res/sans.ttf")
s = "二进制例程"
x, y = image.get_string_size(s, 3)
img.draw_string(0, 120 - (y + 5), s, 3, (255, 0, 0)) # show left-button
s = "可执行文件示例"
x, y = image.get_string_size(s, 2)
img.draw_string(240 - x, 0, s, 2, (0, 255, 0)) # show right-up # wait fix
image.free_freetype()
s = "bin example"
x, y = image.get_string_size(s, 1)
img.draw_string(0, 240 - (y + 5), s, 1, (0, 0, 255)) # show left-button
display.show(img)
from maix import image, display
img = image.new(size = (240, 240), color = (0, 0, 0),
mode = "RGB") #创建一张黑色背景图
img.draw_ellipse(120, 40, 20, 50, 90, 0, 360, color=(0,255,0),
thickness = 1)
display.show(img)
img = image.new(color=(255, 0, 0))
img.draw_string(100, 100, "hello", 2, color=(0, 0, 255))
mk = img.crop(90, 90, 100, 50) # 截一张图出来, x, y, w, h
imga = image.new(color=(0, 255, 0))
imga.draw_image(mk, 10, 10)
# imga.draw_image(imga) # py no-allow use self but libmaix support
imga.draw_image(mk, 100, 100, alpha=0.5)
display.show(imga)
resize(w, h, func) # width, height, cv::INTER_LINEAR
flip(code) # -1 horizontal & vertical, 1 horizontal, 0 vertical
rotate(angle, adjust) # [-360, +360],
adjust uasge
imga.draw_image(mk.rotate(-90), 70, 10) # 顺时针 90 旋转
imga.draw_image(mk.flip(1), 130, 10) # 水平翻转 horizontal
imga.draw_image(mk.resize(80, 50), 10, 80) # 缩放到 (80, 50)
imga.draw_image(mk.flip(0), 100, 80) # 垂直翻转 vertical
imga.draw_image(mk.rotate(-135, adjust=0), 10, 150) # 顺时针 135 旋转
imga.draw_image(mk.rotate(+45, adjust=1), 100, 150) # 逆时针 45 旋转
display.show(imga)
from maix import image, display
img = image.new(size=(240, 240), mode="RGB", color=(255, 255, 255))
img.draw_line(0, 0, 240, 240)
img.draw_rectangle(40, 120, 160, 200, color=(255, 0, 0), thickness=16) #
img.draw_circle(120, 120, 20, color=(0, 255, 0))
img.draw_string(40, 40, "dalaoshu", 2, color=(0, 0, 255))
import cv2
import numpy as np
cv_img = cv2.imdecode(np.frombuffer(img.tobytes('jpg'), np.uint8), cv2.IMREAD_COLOR)
cv_img = cv_img[ : , : , (2,1,0)]
tmp = image.load(cv_img.tobytes(), cv_img.shape)
tmp.save('tmp.jpg')
img_encode = cv2.imencode('.jpg', cv_img)[1]
tmp = image.open(img_encode.tobytes())
tmp.save('tmp.jpg')
from maix import image, display
img = image.new(size=(240, 240), mode="RGB", color=(255, 255, 255))
img.draw_line(0, 0, 240, 240)
img.draw_rectangle(40, 120, 160, 200, color=(255, 0, 0), thickness=16) #
img.draw_circle(120, 120, 20, color=(0, 255, 0))
img.draw_string(40, 40, "dalaoshu", 2, color=(0, 0, 255))
# 保存图片到 test.png 中
img.save("test.png")
# 读取 test.png 中的图片
tmp = image.open("test.png")
# 0.5.0 以后支持导出 jpg 、 bmp 、 png 、 默认 rgb 等格式的图像数据到 bytes 变量中,方便向外传输图像数据。
img_bytes = tmp.resize(size=(160, 120)).tobytes('jpg')
# >>> img_bytes = img.tobytes('jpg')
# >>> img_bytes[:2]
# b'\xff\xd8'
# >>> img_bytes[-2:]
# b'\xff\xd9'
# >>> img_bytes = img.tobytes('bmp')
# >>> img_bytes[:2]
# b'BM'
# >>> img_bytes = img.tobytes('rgb')
# >>> img_bytes[:2]
# b'\x00\x00'
# >>> img_bytes = img.tobytes('png')
# >>> img_bytes[:2]
# b'\x89P'
# 0.5.2 以后 image.open 支持直接打开上述格式导出的 bytes 编码数据。
tmp = image.open(img_bytes)
print('tmp.png', tmp)
tmp.save("tmp.png")
display.show(tmp)
【传统视觉基础】寻找色块(颜色识别)
该功能需要更新到 0.5.1 版本以后,填色的顺序为 [(L 最小值, L 最大值, A 最小值, A 最大值, B 最小值, B 最大值)]。
使用 find_blobs 的查找色块算法,查找图像中符合 LAB 颜色阈值的色块,可以在列表中放入多个阈值区间进行匹配,通过阈值编辑工具可将目标颜色变成白色意为提取,其他颜色全变为黑色表示忽略。
如
blue = 13, 54, 11, 48, -91, -28
为什么是 蓝色 的 lab 阈值,这是因为使用 LAB 阈值工具可以获得两个期望颜色区间的最大和最小的 L A B 值,所以上图对应的下图示意图的顺序。
现已支持在线图传调试 LAB 阈值
wiki.sipeed.com/threshold
,动态调试效果请看
Github 实现
。
Lab颜色空间中的L分量用于表示像素的亮度,取值范围是 [0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是 [127,-128];b表示从黄色到蓝色的范围,取值范围是 [127,-128]。
from maix import image, display, camera
blue = [(34, 100, -38, 3, -128, -28)] # 0.5.0 以后蓝色的 lab 阈值,0.4.9 之前为 [(13, 11, -91, 54, 48, -28)]
while True:
img = camera.capture()
blobs = img.find_blobs(blue, merge=True) #在图片中查找lab阈值内的颜色色块 merge 合并小框。
if blobs:
for i in blobs:
img.draw_rectangle(i["x"], i["y"], i["x"] + i["w"], i["y"] + i["h"],
color=(0, 0, 255), thickness=1) #将找到的颜色区域画出来
display.show(img)
【传统视觉基础】阈值处理
该功能需要更新到 0.5.3 版本以后
基于上述获得的 LAB 阈值,可以直接应用到图像上(俗称二值化),便于后续的寻线寻迹预处理,可以解决红、黄、蓝、绿线等各种场合。
这里演示的是蓝色跑道白色数值的场合,当然具体情况具体分析吧!
不想
pip install -U maixpy3
联网下载的可以到 pypi 下载 armv7l 的 whl 包放到板子里使用
pip install maixpy3*.whl -U
安装
。
from maix import image, display, camera
THRESHOLD = [(34, 100, -38, 3, -128, -28)]
while True:
img = camera.capture().binary(THRESHOLD, invert=False, zero=False) # invert 取反阈值,zero 是否不填充阈值区域。
display.show(img)
while True:
img = camera.capture()
tmp = img.find_lines((0, 0, 240, 240), 2, 1, 1100, 50, 50)
for l in tmp:
img.draw_line(l[0], l[1], l[2], l[3], color = (0, 255, 0))
display.show(img)
【传统视觉基础】寻线寻迹
找线算法是面对小车寻线而开发的一个算法。主要的流程是,灰度化 -> 自适应阈值处理 -> 形态学运算 -> 图像最小二乘法。完成算法流程后返回一条线的信息,让小车能够根据识别出来线的信息进行运动。这个接口比较适合做图像寻线。
对应实现
点我跳转到 github
img = camera.capture()
line = img.find_line()
img.draw_line(line["rect"][0], line["rect"][1], line["rect"][2],
line["rect"][3], color=(255, 255, 255), thickness=1)
img.draw_line(line["rect"][2], line["rect"][3], line["rect"][4],
line["rect"][5], color=(255, 255, 255), thickness=1)
img.draw_line(line["rect"][4], line["rect"][5], line["rect"][6],
line["rect"][7], color=(255, 255, 255), thickness=1)
img.draw_line(line["rect"][6], line["rect"][7], line["rect"][0],
line["rect"][1], color=(255, 255, 255), thickness=1)
img.draw_circle(line["cx"], line["cy"], 4,
color=(255, 255, 255), thickness=1)
display.show(img)
img = camera.capture()
colors = img.get_blob_color((100, 100, 10, 10), 0, 0)
img.draw_rectangle(100, 100, 110, 110,
color=(255, 0, 0), thickness=1) #将找到的颜色区域画出来
img.draw_rectangle(9, 9, 21, 21,
color=(255, 255, 255), thickness=1) #将找到的颜色区域画出来
img.draw_rectangle(10, 10, 20, 20,
color=(int(colors[0]), int(colors[1]), int(colors[2])), thickness=-1) #将找到的颜色区域画出来
display.show(img)