helloworld

视频教程

凡哥带你玩转OpenMV视频教程之HelloWorld详解

Bilibili-凡哥带你玩转OpenMV视频教程之HelloWorld详解

HelloWorld详解

0. 概述

hi,大家好,欢迎大家来到云江学院, 本期凡哥将会带大家来深入了解一下 helloworld演示历程, 虽然行数不多,但是仍然有很多干货可以讲。

1. 运行helloworld程序

首先我们运行一遍helloworld历程。

# Hello World Example
#
# Welcome to the OpenMV IDE! Click on the green run arrow button below to run the script!

import sensor, time

sensor.reset()                      # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA)   # Set frame size to QVGA (320x240)
sensor.skip_frames(time = 2000)     # Wait for settings take effect.

clock = time.clock()                # Create a clock object to track the FPS.

while(True):
    clock.tick()                    # Update the FPS clock.
    img = sensor.snapshot()         # Take a picture and return the image.
    print(clock.fps())              # Note: OpenMV Cam runs about half as fast when connected
                                    # to the IDE. The FPS should increase once disconnected.

我们将为大家逐行讲解helloworld历程。

此历程共涉及到两个包sensortime 我们分别讲解一下。

2. 摄像头模块 sensor

cammera

如果大家对摄像头结构,感光芯片这些名词比较陌生, 可以参照我们的机器视觉背景知识. 机器视觉常识-摄像头结构

sensor模块包含了感光芯片与图像预处理的各项操作.

2.1. 引入sensor模块

import sensor

2.2. 重置并初始化OpenMV

sensor.reset() # Reset and initialize the sensor.

如果没有进行reset的话,在之前的运行的代码里对摄像头模组的设置将会被保留, 对后面的程序执行产生干扰。

2.3. 选择颜色空间与像素格式

如果你对色彩空间的概念不是很了解的话, 可以阅读我们的教程 机器视觉基础 - 色彩空间

设定选择颜色空间为RGB, 选择像素格式为RGB565.

sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)

RGB

颜色存储 红色(8位),绿色(8位), 蓝色(8位)

各个通道的取值范围 0 0 281=255 2^8 -1 = 255

RGB565

RGB565,是RGB的压缩格式, 多用在嵌入式领域, 节省内存。 颜色存储 红色(5位),绿色(6位), 蓝色(5位)

RGB565变换到RGB 演示示例

通道 RGB565数值二进制表示 RGB数值二进制表示 变化
R 10101 10101000 左移三位
G 100010 10001000 左移两位
B 00101 00101000 左移三位

2.4. 设定窗口大小

选择窗口分辨率为320*240

sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)

OpenMV只能设定一些预设的窗口大小,sensor.QVGA实际上是一个整数, 代表预设的窗口大小的编号。 常见的预设窗口大小如下。

预设窗口大小 窗口宽度 窗口高度
VGA 640 480
QVGA 320 240
QQVGA 160 120

如果你想了解更多的窗口大小, 可以参阅sensor-API文档

那为什么要预设这些不同窗口大小呢? 原因是,有些机器视觉的算法比较耗内存,如果我们都用高清的图像质量的话, 一方面帧率会很低,另一方面容易发生内存溢出, 所以我们需要在图像质量跟性能之间做一些折中。

延伸阅读 机器视觉常识 - 像素与分辨率

2.5. 跳过一些帧

我们在设定sensor的各项参数之后, 需要等待一会儿,画质稳定下来我们再进行图像数据的读取。

函数原型为

sensor.skip_frames([n, time])

也就是说,skip_frame() 一共有两种传参方式, 一种是设定跳过的帧数n

# 跳过20帧
sensor.skip_frame(20)

两外一种是指定等待的时间time,单位为ms

# 跳帧,等待2000ms = 2s
sensor.skip_frames(time = 2000) # Wait for settings take effect.

2.6. 拍照

截取当前sensor读取的画面,返回一个Image对象,赋值给img变量

img = sensor.snapshot() # Take a picture and return the image.

关于Image对象的各种属性,大家也可以参阅Image-API文档

那大家有没有感到奇怪, 好像我们的程序里面并没有发送图像到IDE的这个操作?那实时显示的视频是哪来的?

实际上,在OpenMV与OpenMV IDE usb相连的时候, 每当OpenMV执行snapshot拍照的时候, OpenMV还会将当前图像压缩,通过特定的传输协议发送给OpenMV IDE。所以我们才能在FrameBuffer视频显示区域看到实时返回的图像。同时因为是串口发送,会占用很多资源, 所以链接IDE时候的帧率大概是OpenMV脱机运行的一半。

sensor api文档 获取sensor模块的更多信息,可以查阅凡哥翻译的OpenMV中文文档。

Image-API文档

3. 计时模块 time

micropython的time模块与python标准库的time模块不是一个包, 这里的time模块主要起计时的作用,用于追踪过去的时间。

3.1. 创建一个clock对象

首先我们需要创建一个 clock实例。

import time
clock = time.clock()

然后就可以分别调用clock的两个函数, 分别是clock.tick()clock.fps();

3.2. 开始计时

这个函数的功能是开始计时追踪过去的时间。 这就像体育老师手里的秒表, 此操作就等同于摁一下手里的秒表,开始计时。

clock.tick()

3.3. 获取过去的时间,转换为帧率

这个函数做的事情是记录从clock.tick()开始。 中间做了一些其他操作, 然后到执行到clock.fps()这个函数之间一共花费了多久的时间, 我们记为t.然后再将这个时间t转换为帧率fps.

clock.fps()

在我们之前的IDE的讲解中, 我们有提到过fps英文 全称为frame per second, 代表的是每秒钟可以拍摄的画面(帧)的数量, 作为算法的性能指标。 所以帧率就等于消耗时间的倒数。 fps = 1 / t

这两个函数经常组合使用

# 开始计时
clock.tick()
# 做一些操作
doSomeThing()
# 获取过去的时间,并变换为帧率
clock.fps()

获取time模块的更多信息,可以查阅凡哥翻译的OpenMV中文文档。 time - api文档

4. 注解版helloworld - 知识大回顾


# 引入感光元件的模块
import sensor
# 引入计时模块
import clock

# 重置并初始化感光元件
sensor.reset()
# 设置为彩色, 颜色格式为RGB565
# 也就是说,颜色存储 红色(5位),绿色(6位), 蓝色(5位)
sensor.set_pixformat(sensor.RGB565)
# 设置图像的大小 320 * 240
sensor.set_framesize(sensor.QVGA)
# 在更改设置后,跳过一些帧,等待感光元件变稳定。(等待2ms钟)
sensor.skip_frames(time=2000)

# 初始化时钟对象
clock = time.clock()

# 一直拍照 while循环 重复执行
while(True):

    # 开始计时
    clock.tick()
    # 拍摄一张照片,snapshot()函数返回一个image对象
    # 随后图像经过串口传递给IDE, 读入FrameBuffer, 即左上角的视频框
    img = sensor.snapshot()
    # 计算自tick()之后过去的时间t,并转换为帧率 fps
    # 并在终端打印出来
    print(clock.fps())
Copyright 杭州云江科技有限公司 2017 all right reserved,powered by Gitbook该文件修订时间: 2019-04-06 01:13:21

results matching ""

    No results matching ""