目录
前言
一.摄像头的配置
二.画图
本人所用为01 studio的pyAi-K210和pyAI-OpenMV4,本人在学习完K210后,学习openMV时发现很多实验K210和openMV可以一起学习,所以写下此篇分享,本人基本都是个人笔记,非常希望有大佬提出错误和改进之处,但大佬轻喷哈!!!
-----------------------------------------------------我是分割线-------------------------------------------------------------
在 pyAI-K210 和 pyAI-OpenMV4 中摄像头是视觉效应的基本元件,接下来让我们来学习摄像头的应用吧。
OpenMV4 和 K210 对摄像头配置的使用是一摸一样的,由此我们可以得出,两个机器的摄像头模块的所有功能应该也是可以互通的,那么让我们继续学习摄像头的有趣应用吧。
构造函数 | sensor 摄像头对象,通过 import 直接调用 |
使用方法 | 【sensor.reset()】---------->初始化摄像头 freq:设置摄像头时钟频率,频率越高帧率越高,但是画质可能更差。默认为24MHz set_regs:允许程序写摄像头寄存器,默认为 True。 【sensor.set_pixformat(pixformat)】 设置像素格式,pixformat有三个参数。 sensor.GRAYSCAL:灰度图像,每像素8位(1字节),处理速度快; sensor.RGB565:每像素为16位(2字节),5位用于红色,6位用于绿色,5位用于蓝色,处理速度比灰度要慢。 sensor.BAYER:占空间小,仅捕捉图像用,不可做图像处理。 【sensor.set_framesize(framesize)】 设置每帧大小(即图像尺寸)。 常用的 framesize 参数如下: sensor.QQVGA:160*120; sensor.QVGA:320*240; sensor.VGA:640*480; sensor.LCD:128✖160(LCD模块) sensor.QQVGA2:128✖160(LCD模块) 【sensor.skip_frames([n,time])】 摄像头配置后跳过n帧或者等待时间 time (ms)让其变稳定。 当 n 和 time 均未指定,则默认跳过300ms的帧。 【sensor.snapshot()】 使用相机拍摄一张照片,并返回 image 对象 【sensor.set_vflip(enable)】 enable:1:表示开启垂直翻转; 0:表示关闭垂直翻转; |
补充 clock 模块:
构造函数 | clock=time.clock() 创造一个时钟。 |
使用方法 | clock.tick() 开始追踪运行时间。 clock.fps() 停止追踪运行时间,并返回当前 FPS (每秒帧数) 在调用该函数前始终首先调用 tick。 |
注意:摄像模块的使用不仅仅只有以上哦,还有很多,这些需要我们自己去官方文档学习哦。
官方代码如下:
'''
导入 sensor、time 模块
初始化和配置 sensor 模块
创建 1 个计时时钟
拍摄图片
打印 FPS(每秒帧数)
'''
#导入相关模块
import sensor, image, time, lcd
lcd.init(freq=15000000) # LCD 初始化
sensor.reset() # 复位和初始化摄像头设备,执行 sensor.run(0)停止
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为彩色 RGB565 (或灰色GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # 设置帧大小为 QVGA (320x240) 默认 LCD 大小
sensor.skip_frames(time = 2000) # 等待设置生效
clock = time.clock() # 创建一个时钟来追踪 FPS(每秒拍摄帧数).
while(True):
clock.tick() # 更新 FPS 时钟.
img = sensor.snapshot() # 拍摄图像并返回 image.
lcd.display(img) # 在 LCD 上显示
print(clock.fps()) # 注意: 当 MaixPy 连接到 IDE 时候,运行速度减半,
# 因此当脱机运行时,FPS 会提升。
#两个机型的代码是一样的哦
画图功能是摄像头应用中的一个重要的辅助功能,在摄像头进行采集的时候,一般都会通过画图功能进行指示。
构造函数 | img=sensor.snapshot() 或者 img=image.Image(path[,copy_to_fb=False]) 创建图像,通过拍摄或者读取文件路径获取。 copy_to_fb=False:不可以加载大图片; copy_to_fb=True:可以加载大图片。 |
使用方法 | 【image.draw_line(x0,y0,x1,y1[,color[,thickness=1]])】 画线段。 (x0,y0):起始坐标; (x1,y1):终点坐标; color:颜色,如(255,0,0)表示红色; thickness:粗细。 【image.draw_rectangle(x,y,w,h)[,color[,thickness=1[,fill=False]]])】 画矩形。 (x,y):起始坐标; w:宽度; h:长度; color:颜色,如(255,0,0)表示红色; thickness:边框粗细; fill:是否填充‘’ 【image.draw_clrcle(x,y,radius[,color[,thickness[,fill=False]]])】 画圆。 (x,y):圆心; radius:半径; color:颜色; thickness:线条粗细; fill:是否填充。 【image.draw_arrow(x0,y0,x1,y1[,color[,size,[thickness=1]]])】 画箭头。 (x0,y0):起始坐标; (x1,y1):终点坐标; color:颜色; size:箭头位置大小, thickness:线粗细。 【image.draw_cross(x,y[,color[,size=5[,thickness=1]]])】 画十字交叉。 (x,y):交叉坐标; color:颜色; size:尺寸; thickness:线粗细。 【image.draw_string(x,y,text[,scale=1[,mono_space=Ture....]]])】 写字符。 (x,y):起始坐标; text:字符内容; color:颜色; scale:字体大小; mono_space:强制间距。 |
官方代码如下:
'''
导入 sensor、time 模块
初始化和配置 sensor 模块
创建 1 个计时时钟
拍摄图片
画各类图形
'''
import sensor, image, time, pyb
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # or GRAYSCALE...
sensor.set_framesize(sensor.QVGA) # or QQVGA...
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
# 画线段:从 x0, y0 到 x1, y1 坐标的线段,颜色红色,线宽度 2。
img.draw_line(20, 20, 100, 20, color = (255, 0, 0), thickness = 2)
#画矩形:绿色不填充。
img.draw_rectangle(150, 20, 100, 30, color = (0, 255, 0),
thickness = 2, fill = False)
#画圆:蓝色不填充。
img.draw_circle(60, 120, 30, color = (0, 0, 255), thickness = 2, fill = False)
#画箭头:白色。
img.draw_arrow(150, 120, 250, 120, color = (255, 255, 255), size = 20, thickness = 2)
#画十字交叉。
img.draw_cross(60, 200, color = (255, 255, 255), size = 20, thickness = 2)
#写字符。
img.draw_string(150, 200, "Hello 01Studio!", color = (255, 255,255), scale = 2,mono_space = False)
print(clock.fps())
# todo 两个机型的代码是一样的哦
以上学习我们已经对 pyAi-K210 和 pyAI-OpenMV4 两种机型摄像头有了一定的了解了,其实K210的摄像头固件就是OpenMV,所以在两者联立起来学习会更加的提高效率。
---------------------------------------------------------------我是分割线---------------------------------------------------
此处进行说明,当前所有代码均引用官方例程,后续会陆续加入自己碰到的有意思的代码。