跳到主要内容

画图

前言

通过摄像头采集到照片后,我们会进行一些处理,而这时候往往需要一些图形来指示,比如在图片某个位置标记箭头、人脸识别后用矩形框提示等。本节就是学习在图形上画图的使用功能。

实验目的

在摄像头拍摄的图像上画各种图形。

实验讲解

上一节我们学习了摄像头sensor模块应用,通过摄像头实时采集到的是图片image, 没错,本节实验就是建立在非常重要的image模块上面。CanMV已经将图片处理(包含画图)封装成各类模块,我们只需要熟悉其构造函数和使用方法即可,具体如下:

image对象

构造函数

img=sensor.snapshot()

通过摄像头拍摄方式返回image对象。


img=image.Image(path[, copy_to_fb=False])

通过读取图片方式创建image对象。

  • copy_to_fb: 加载大图片。
    • True : 可以加载大图片。
    • False : 不可以加载大图片。

例:img = image.Image("01Studio.bmp", copy_to_fb=True),表示加载根目录下的01Studio.bmp图片。

使用方法

image.draw_line(x0, y0, x1, y1[, color[, thickness=1]])

画线段。

  • x0, y0: 起始坐标;
  • x1, y1: 终点坐标;
  • color: 颜色;
  • thickness: 线条粗细;

image.draw_rectangle(x, y, w, h[, color[, thickness=1[, fill=False]]])

画矩形。

  • x, y: 起始坐标;
  • w: 宽度;
  • h: 高度;
  • color: 颜色;
  • thickness: 边框粗细;
  • fill: 是否填充;、
    • True : 填充。
    • False : 不填充。

image.draw_circle(x, y, radius[, color[, thickness=1[, fill=False]]])

画圆。

  • x, y: 圆心;
  • radius: 宽度;
  • h: 高度;
  • color: 颜色;
  • thickness: 线条粗细;
  • fill: 是否填充;、
    • True : 填充。
    • False : 不填充。

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[, color[, scale=1[,mono_space=True]]]])

写字符。

  • x, y: 起始左边;
  • text: 字符内容;
  • color: 颜色;
  • scale: 字体大小;
  • mono_space: 强制间隔;
    • True : 有间隔。
    • False : 无间隔。

更多用法请阅读官方文档:
https://developer.canaan-creative.com/canmv/main/canmv/library/canmv/image.html


熟悉了image对象的画图功能后,我们尝试在摄像头采集到的画面依次画出线段、矩形、圆形、箭头、十字交叉和字符。具体编程思路如下:

参考代码

'''
实验名称:画各种图形和写字符
版本: v1.0
日期: 2022.9
作者: 01Studio
'''

import sensor, image, time, lcd

lcd.init(freq=15000000)
sensor.reset() #复位摄像头
sensor.set_vflip(1) #将摄像头设置成后置方式(所见即所得)

sensor.set_pixformat(sensor.RGB565) # 设置像素格式 RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # 设置帧尺寸 QVGA (320x240)
sensor.skip_frames(time = 2000) # 灯带设置响应.
clock = time.clock() # 新建一个时钟对象计算FPS.

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)

lcd.display(img) # 在LCD显示
print(clock.fps()) #终端打印FPS

实验结果

在CanMV IDE中打开画图例程文件draw.py,点击运行。可以看到在图像缓冲区中画上了各种图形。

draw1

在LCD上同样能看到实验结果。由于CanMV IDE缓冲区图片经过压缩,所以LCD上的效果会更好一点。

draw2

画图形是很基础的功能,在以后的实验中特别是指示识别内容时候会经常用到。