OpenMV入门

1. 什么是OpenMV

OpenMV  是一个开源,低成本,功能强大的机器视觉模块。

OpenMV上的机器视觉算法包括寻找色块、人脸检测、眼球跟踪、边缘检测、标志跟踪等。

以STM32F427CPU为核心,集成了OV7725摄像头芯片,在小巧的硬件模块上,用C语言高效地实现了核心机器视觉算法,提供Python编程接口。

(这也就意味着,我们可以通过python来对他进行编程,所以我们就需要学习一点基础的python知识)

———————————————

2. 关于OpenMV 和 OpenCV

OpenMV是开源的机器视觉框架,而 OpenMV  是一种开源计算机视觉库,两者都是实现视觉应用的工具,不同的是 OpenMV 可以运行在MCU上,而OpenCV可以运行在多种框架的CPU上,OpenMV的优势在于轻量化,但是处理高复杂图形信息和告诉图像能力的时候明显弱于OpenCV

———————————————

3. OpenMV的教程

序言 · OpenMV中文入门教程

上面的链接是星通官方给我们的启动教程,我们接下来的内容也是视频内容的一个注解

Home – 廖雪峰的官方网站

以上链接为 Python 语法的学习网址,适合对其他语言有一些基础的同学

———————————————

4. OpenMV IDE 界面介绍

OpenMV入门

上面是我们下载完 IDE 后进入的界面

OpenMV入门

中间是我们的代码编辑框,我们可以在里面写代码

OpenMV入门

右上角是 Frame Buffer,可以用来查看OpenMV的摄像头的头像

OpenMV入门

右下角是图像的直方图,可以查看图像的不同颜色阈值

OpenMV入门

当我们连接OpenMV后,点击连接,就可以看到 图像显示出来了

OpenMV入门

左上角的菜单栏 File

OpenMV入门

在下面的例子中,有一些官方的流程

OpenMV入门

————————————

OpenMV入门

控制一些基本外设

———————————————

OpenMV入门

画图,画十字,画线,画框

———————————————

OpenMV入门

图像相关过滤

———————————————

OpenMV入门

保存图像的屏幕截图等。

———————————————

OpenMV入门

录制视频等

———————————————

OpenMV入门

人脸识别、人脸跟踪

———————————————

OpenMV入门

以下是一些特征点匹配:

线段、圆识别、边缘检测、模板匹配等

———————————————

OpenMV入门

瞳孔识别、人眼识别

———————————————

OpenMV入门

与颜色识别相关:自动灰度颜色识别、自动色图颜色识别、红外颜色识别等。

———————————————

OpenMV入门

运行LCD程序,当我们外接LCD显示屏的时候使用

———————————————

OpenMV入门

红外热成像例程

____________________________

OpenMV入门

蓝牙 , WIFI ,舵机拓展板 例程

———————————————

OpenMV入门

条码、二维码相关扫描识别

____________________________________________________

然后 Edit 里面,就是我们最经常使用的复制 黏贴等

OpenMV入门

——————————————————————————————

5. 基础程序的讲解

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

import sensor, image, 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.

上面这段代码,也就是我们刚进入 IDE 时,直接给我们的,我们对他先来进行分析

· 首先 import 是导入此代码所依赖的模块,在 hellow world 这个代码中主要依赖

sensor 感光元件模块
image 图像处理相关模块
time 时钟
sensor.reset()    重置感光元件
RGB565 彩图
sensor.set_pixformat(sensor.RGB565) 设置感光元件的图像的色彩
sensor.set_framesize(sensor.QVGA) 设置感光元件的分辨率的大小
sensor.skip_frames(time = 2000) 使图像跳过几帧
clock = time.clock()  设置时钟

我们进入一个while大循环,在这里 image 在不断的截图保存图像,而截取的图像我们就可以在右上角看到

最后一句 也就是打印的帧率,我们可以在下面的框Terminal看到

———————————————————————————————————————

5. 如何进行OpenMV的脱机运行程序

而我们想在没有连接电脑的情况下使用我们的代码,我们需要使用它来离线运行

把代码保存的OpenMV内置的 flash 内存里面(也就是OpenMV连接电脑时,弹出的U盘,我们把文件保存在那里面,我们在那里面存储代码或图片)

我们使用工具中的一键下载

OpenMV入门

当写入成功时,我们的灯会亮一下,就代表脱机完成,脱机成功后,我们给OpenMV重新上电(也就是重新启动一下),就可以自动运行里面的代码。我们也可以在 OpenMV的U盘里面看到我们刚刚保存的代码

OpenMV保存的 时候 会把我们的代码默认保存为 main.py,我们也可以在保存之后重新保存为其他的名称.py

但需要注意的是,我们上电之后,他会自动执行我们main.py的程序,而不是其他的程序

关于我们如何查看是否正确保存了我们的代码,我们可以将示例代码中闪灯的代码,作为测试,保存到我们的  main.py  里面,然后上电之后看看有没正确闪灯即可

如果我们发现,有时候并没有正确的把代码保存进去,我们就可以把U盘格式化一下,再重新保存

———————————————————————————————————————

6. 颜色识别

前面我们知道,OpenMV里面有很多的颜色识别,我们就来看一下 单颜色彩色识别

# Single Color RGB565 Blob Tracking Example
#
# This example shows off single color RGB565 tracking using the OpenMV Cam.

import sensor, image, time, math

threshold_index = 0 # 0 for red, 1 for green, 2 for blue

# Color Tracking Thresholds (L Min, L Max, A Min, A Max, B Min, B Max)
# The below thresholds track in general red/green/blue things. You may wish to tune them...
thresholds = [(30, 100, 15, 127, 15, 127), # generic_red_thresholds
              (30, 100, -64, -8, -32, 32), # generic_green_thresholds
              (0, 30, 0, 64, -128, 0)] # generic_blue_thresholds

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
clock = time.clock()

# Only blobs that with more pixels than "pixel_threshold" and more area than "area_threshold" are
# returned by "find_blobs" below. Change "pixels_threshold" and "area_threshold" if you change the
# camera resolution. "merge=True" merges all overlapping blobs in the image.

while(True):
    clock.tick()
    img = sensor.snapshot()
    for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=200, area_threshold=200, merge=True):
        # These values depend on the blob not being circular - otherwise they will be shaky.
        if blob.elongation() > 0.5:
            img.draw_edges(blob.min_corners(), color=(255,0,0))
            img.draw_line(blob.major_axis_line(), color=(0,255,0))
            img.draw_line(blob.minor_axis_line(), color=(0,0,255))
        # These values are stable all the time.
        img.draw_rectangle(blob.rect())
        img.draw_cross(blob.cx(), blob.cy())
        # Note - the blob rotation is unique to 0-180 only.
        img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)
    print(clock.fps())

一开始也是导入代码需要的模块


import sensor, image, time, math

接下来设置颜色的阈值

threshold_index = 0 # 0 for red, 1 for green, 2 for blue

然后 重置感光元件,摄像头。设置颜色格式为RGB565, 图像大小为QVGA,设置帧率

关闭白平衡和颜色识别中的自动增益(打开可能会改变颜色阈值)

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
clock = time.clock()

在 while 循环里面

一、给感光元件拍照

 for blob in img.find_blobs([thresholds[threshold_index]], pixels_threshold=200, area_threshold=200, merge=True):

这是 python的语法,在下面进行判断。

它的意思是 在这个函数中,我们进行颜色识别,find_blobs 这个函数会返回一个列表

roi是“感兴趣区”。

left_roi = [0,0,160,240]
blobs = img.find_blobs([red],roi=left_roi)

x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10:

blobs = img.find_blobs([red],x_stride=10)

y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5:

blobs = img.find_blobs([red],y_stride=5)

invert 反转阈值,把阈值以外的颜色作为阈值进行查找

area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉

pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉

merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。

在这里,我们默认寻找红色

OpenMV入门

他把我们诬陷

find_blobs对象返回的是多个blob的列表。(注意区分blobs和blob,这只是一个名字,用来区分多个色块,和一个色块)。
列表类似与C语言的数组,一个blobs列表里包含很多blob对象,blobs对象就是色块,每个blobs对象包含一个色块的信息

blob有多个方法:

blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。

blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。

blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。

blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。

blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。

blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。

blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。

blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。

blob.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过blob[7]来获取。

blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:

blobs = img.find_blobs([red, blue, yellow], merge=True)

如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。

blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。

blob.area() 返回色块的外框的面积。应该等于(w * h)

blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。
比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。

—————————

临界点

red = (minL, maxL, minA, maxA, minB, maxB)

以上是一个颜色阈值的结构

元组里面的数值分别是L A B 的最小值和最大值。

OpenMV 的IDE里加入了阈值选择工具,极大的方便了对于颜色阈值的调试。

OpenMV入门

==========>  (To be contnue…….)

版权声明:本文为博主ArtoriaLili原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/ArtoriaLili/article/details/123035268

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年2月22日 下午3:46
下一篇 2022年2月22日 下午4:10

相关推荐

此站出售,如需请站内私信或者邮箱!