openmv学习笔记[V1]

Created: February 9, 2023 9:03 AM
Created by: Luser
Type: AI

openmv是什么以及Openmv IDE的安装与使用这里就不多加赘述。下面直接通过例程对openmv cam特定的函数库进行学习。

因为只是为了电赛做准备进行学习的笔记,所以很多例程和代码并不会进行深究。

例程理解

# 色块监测 例子
#
# 这个例子展示了如何通过find_blobs()函数来查找图像中的色块
# 这个例子查找的颜色是深绿色

import sensor, image, time

# 颜色追踪的例子,一定要控制环境的光,保持光线是稳定的。
green_threshold   = (   0,   80,  -70,   -10,   -0,   30)
#设置绿色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA,
# maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需
#设置(min, max)两个数字即可。

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些
sensor.skip_frames(time = 2000) # 跳过2000s,使新设置生效,并自动调节白平衡
sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。
sensor.set_auto_whitebal(False)
#关闭白平衡。白平衡是默认开启的,在颜色识别中,一定要关闭白平衡。
clock = time.clock() # 追踪帧率

while(True):
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = sensor.snapshot() # 从感光芯片获得一张图像

    blobs = img.find_blobs([green_threshold])
    #find_blobs(thresholds, invert=False, roi=Auto),thresholds为颜色阈值,
    #是一个元组,需要用括号[ ]括起来。invert=1,反转颜色阈值,invert=False默认
    #不反转。roi设置颜色识别的视野区域,roi是一个元组, roi = (x, y, w, h),代表
    #从左上顶点(x,y)开始的宽为w高为h的矩形区域,roi不设置的话默认为整个图像视野。
    #这个函数返回一个列表,[0]代表识别到的目标颜色区域左上顶点的x坐标,[1]代表
    #左上顶点y坐标,[2]代表目标区域的宽,[3]代表目标区域的高,[4]代表目标
    #区域像素点的个数,[5]代表目标区域的中心点x坐标,[6]代表目标区域中心点y坐标,
    #[7]代表目标颜色区域的旋转角度(是弧度值,浮点型,列表其他元素是整型),
    #[8]代表与此目标区域交叉的目标个数,[9]代表颜色的编号(它可以用来分辨这个
    #区域是用哪个颜色阈值threshold识别出来的)。
    if blobs:
    #如果找到了目标颜色
        for b in blobs:
        #迭代找到的目标颜色区域
            # Draw a rect around the blob.
            img.draw_rectangle(b[0:4]) # rect
            #用矩形标记出目标颜色区域
            img.draw_cross(b[5], b[6]) # cx, cy
            #在目标颜色区域的中心画十字形标记

    print(clock.fps()) # 注意: 你的OpenMV连到电脑后帧率大概为原来的一半
    #如果断开电脑,帧率会增加

可以一边读这个文件的编程思路,一边翻阅对应的函数功能来加深理解,参考:MicroPython 函数库 — MicroPython 1.9.2 文档 (singtown.com)

上面这个程序可以实现对绿色物体的追踪效果,如果需要实现对其它颜色物体的追踪,只需要修改程序第九行中的LAB的各项阈值就可以了。

关于LAB值的了解:

  • L:表示颜色的明亮度,正数表示偏白,负数表示偏黑。
  • A:表示红绿值,正数表示偏红,负数表示偏绿。
  • B:表示黄蓝值,正数表示偏黄,负数表示偏蓝。

所以如果想要对红色物体追踪只要进行如下修改

green_threshold   = (   0,   80,  -70,   -10,   -0,   30)

改为

green_threshold   = (   0,   80,  10,   70,   -0,   30)

就可实现对红色物块进行追踪。

对其流程进行整理:

https://s2.loli.net/2023/01/14/5vRJYqXgBIuSk1o.png

其中第一、二步先后顺序任意。

想要获得我们想要追踪的那个物体的各项阈值,则需要在openmv IDEframebuffer下面的坐标图中,选择LAB Color Space模式,

https://book.openmv.cc/assets/02-019.jpg

然后在framebuffer中的目标颜色上左击圈出一个矩形,就会得到如图三个坐标图

https://book.openmv.cc/assets/02-020.jpg

三个坐标图分别表示圈出的矩形区域内的颜色的LAB值,选取三个坐标图的最大最小值,即( 0, 60, -70, -10, -0, 30)。

另一个方法就是通过调用Tools -> Machine Vision -> Threshold Editor -> Frame Buffer这个工具,自行调节阈值直到图像中只剩目标物体显示为白色为止。此时就可直接复制其阈值进行判断就好了。如图:

https://s2.loli.net/2023/01/14/mBnhEZ2SjU3ai9v.png

在使用img.find_blobs函数查找色块时可以添加area_threshold参数来限制选入的色块大小,也即色块面积小于area_threshold值的目标色物块会被过滤掉。

idea

上面是一个最简单色块识别和追踪的例程,我目前能想到的应用就是通过特定色块的物体,返回其位置信息给到小车主控芯片,让小车按照不同信息去做出不同的动作。

下面做一个假设,如果小车和物块都在二维平面内,小车可移动,物块不移动,小车无非两个目的,碰撞物块或者避开物块。

若将摄像头平置与小车正前方,可知此时物块对于小车的位置只有三种,也即正前,左前,右前。

可将openmv返回的信息分为1个含有正负数的区间,例如[-10, 10] ,物块位于小车正前方时输出信号为零,在小车左前输出信号为负数,右前方输出信号为正数,按照左右的偏移度返回相应大小的数值。可以将信号分为1020段,也就是可以输出1020种信号给小车主控芯片,小车主控芯片只需要使用switch来执行对应动作即可。

至于离小车前方为多少距离时进行判断则是借助前文提到的area_threshold参数来指定进入特定距离后执行操作。

当然,需要进行识别的时候情况往往是比较复杂的,需要考虑其它环境因素,可能只有在追踪物体的时候可以发挥作用,所以这种方式大概是没什么作用的。

此外,有看到关于WIFI图传、模板匹配、人脸识别、形状识别、分辨不同人脸之类的例程,个人感觉不太需要,首先说模板匹配、人脸识别,模板识别是我觉得最不靠谱的一个例程,这个玩意儿受外界影响太大了,很容易就识别不出来,要是比赛的时候一个没弄好就直接寄了,人脸识别所以准确度可以,但是在小车上的应用可能不太行。个人偏向于通过openmvTinyML实现,这才是这个玩意儿真的能够起到作用的地方,所以重点学习方向应该放在openmv上的神经网络模型部署上才对。

所以目前需要学习并解决的问题有两方面的:一是通过opoenmv自带的IO口对主控芯片进行信号传输的方案,二是部署自定义神经网络模型的解决方案,在网上了解到tensorflow lite已经在openmv上有了比较完善的部署流程,通过在线的部署平台基本可以做到神经网络小白也可以实现部署自定义模型。

官网上的教程只需要使用openmv收集数据集,然后将数据集上传到在线的网站就可以完成训练过程。

但我并不满足于此,在openmv上部署神经网络很显然是属于一个TinyML项目,如果只运用已成熟的商业工具显然并不能对其深入了解,考虑到openmv本身已经支持tensorflow lite模型,我打算自己动手实现数据收集、模型构建、训练模型、模型量化、部署模型这一系列步骤。