您的位置:

多面手OpenMV——一款基于OMV3的图像识别辅助计算机视觉编程神器

一、什么是OpenMV

OpenMV 是一款非常小巧、功能丰富的计算机视觉平台。支持图像识别、颜色跟踪、线性检测等功能,且使用简单、学习容易。通过硬件加速图像处理和机器学习操作,OpenMV 可以在编写控制器等较为负责的嵌入式系统时大大提高开发效率,降低开发成本,是一款性价比非常高的计算机视觉编程工具。

二、OpenMV的硬件和软件配置

OpenMV最新的版本是OMV3,使用STM32H743VIT6处理器,拥有1MB SRAM,2MB flash,支持2560x1440高清输出,以及22个通用输入输出(GPIO)。OpenMV 还搭载了外部SD卡槽和蓝牙、WiFi等外围设备接口,可以便捷地集成其它设备。OpenMV IDE是OpenMV官方的编程软件,使用起来非常方便,主要功能有代码编辑、图像采集、显示和调试。

三、OpenMV的集成应用

1.物联网应用:OpenMV具有各种控制低功耗无线网络通信,通过TCP / IP,LoRa,SIGFOX和Iridium进行通信,可实现基于物联网的监控任务和人工智能解决方案等。

2.机器人控制:OpenMV可以通过Uart,SPI或IIC接口与机器人微控制器,如Arduino,Raspberry Pi进行通信,实现机器人的自动导航、行为分析。

3.智能安防:OpenMV可以实现智能门禁、人脸识别、目标跟踪等功能,并能够自动抓拍破坏者信息,可应用于实验室门禁、家庭安防等场景中。

4.自动驾驶:OpenMV可以通过编写相关程序,实现车辆的自主导航、环境感知等功能。

四、OpenMV硬件功能的使用示例

下面介绍一些OpenMV硬件功能的使用示例。

1.图像采集

# Example for acquiring images only on movement.
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.QQVGA)  # Set frame size to QQVGA (80x60)
sensor.skip_frames(time = 2000)     # Wait for settings take effect.

# Reset the clock.
clock = time.clock()

# Save the previous frame.
previous = None

while(True):
    # Update clock.
    clock.tick()

    # Capture new image.
    image = sensor.snapshot()

    # Check if motion has occurred.
    if previous is not None and image.difference(previous).count() > 10:
        # Save image.
        image.save("/detect.bmp")

    # Store the previous image.
    previous = image.copy()

    # Print the elapsed time.
    print(clock.fps())

2.图像处理

# 在图像上查找一个由二进制形式的颜色掩码表示的颜色,返回矩形和两个掉帧信息(x和y方向上)
import sensor, image, time

# 配合 OpenMV 学习手册使用
# 有关颜色跟踪,请参阅以下文档:
# http://docs.openmv.io/library/omv.image.html#image.image_binary
# http: // docs.openmv.io/library/omv.image.html#image.image_mono_search

# 颜色跟踪颜色的二进制值。在此示例中,它是从色轮工具中获得的,某些部分的值略有不同。
MIN_DELTA = 1
MAX_DELTA = 10

bar_threshold_deltas = (MAX_DELTA - MIN_DELTA + 1)
bar_thresholds = [(MIN_DELTA + (i * bar_threshold_deltas // 8)) for i in range(bar_threshold_deltas)]

print("bar thresholds: %s" % (bar_thresholds))

threshold_index = 0

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_auto_gain(False, value=100)
sensor.set_auto_exposure(False, exposure_us=5000)
sensor.set_brightness(1)

clock = time.clock()
search_rect = [150, 80, 100, 100]  # [x, y, w, h]

while(True):
    clock.tick()

    img = sensor.snapshot()
    img.draw_rectangle(search_rect)
    img = img.crop(150, 80, 100, 100)
    img = img.mean_pooled(2, 2)

    # 方法 1: 使用二进制图像查找单通道颜色跟踪
    for threshold in bar_thresholds:
        result = img.binary([threshold]*3)
        # 用于只检测水平条的中点。
        r = result.find_blobs([1, 11, 100, 40]) #寻找二进制中的连通域,返回一个Blob对象列表
        if r:
            # 对于blob对象列表,x()、y()是blob中心,cx()、cy()是blob重心,w()、h()是blob的宽和高
            img.draw_rectangle(search_rect)
            img.draw_rectangle(r[0].rect(),color=127)
            # Coords can be accessed through virtually any blob object attribute such as
            # rect(), cx(), cy(), x(), y(), etc.
            print(threshold, r[0].cx())
            break

    # 方法 2: 使用二进制图像查找单通道颜色跟踪(一行代码)
    # 注意:如果使用这个,您必须根据情况调整一些参数,例如第8和第10行的参数。
    #
    # img.binary([(45, 75, -10, 14, -25, 27)], invert=False)
    #
    # 二进制函数可以同时采用 1 个、3 个或 6 个阈值元组(并带有相应的通道计数)。
    # GT的阈值将部分图像视为颜色,以后者为基础绘制一个二进制图像(一种选择),然后查找连续的球体。
    # 连续的球体被称为“大洞(大块)”,并将通过“find_blobs()”来查找,作为一组Blob对象返回。
    #“大洞”的一些阈值调整可能需要进行匹配,以便将大洞与轨迹完全重叠。
    # 有关阈值方法,请查看颜色跟踪和二进制函数的文档,并在IDE中搜索有关此方面的文档。
    #
    # 但是,在这个例子中,我们将使用普通色轮阈值(通过下面的“bar_thresholds”数组)来检测条形码上的蓝条,例如:“[(0, 50, -30, -15, 0, 20)]”。

    print(clock.fps())

3.机器学习

# 该文件的目的是演示如何使用神经网络在 OpenMV Cam 上进行识别。
#
# 您应该下​​载图像以进行训练。此示例使用一个图像集,其中包含洛杉矶的Keras代码中提供的250张图像,
# 位于“下载”文件夹中。每个文件名都是“数字_编号.jpg”,例如“3_23.jpg”对于数字“3”,它是第23个图像。
#
# 当然,您必须首先运行“mnist_cnn.py”来训练模型。在训练之后,请将生成的“权重.m5”文件复制到OpenMV的存储设备上并重新启动OpenMV Cam。

import sensor, image, time, os, nn

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=1000)
clock = time.clock()
labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

# Load the built-in "digits" classifier
net = nn.load('/digits.network')

while(True):
    clock.tick()
    img = sensor.snapshot().lens_corr(1.8)
    #img.draw_rectangle(80, 0, 80, 80)
    out = net.forward(img.binary([((200, 255), )])).index(max(net.out()))
    out = labels[out]
    print(clock.fps(), out)

五、总结

在本文中我们详细地阐述了OpenMV这一款基于OMV3的图像识别辅助计算机视觉编程神器。我们解释了其硬件和软件配置,介绍了其集成应用,最后展示了一些硬件功能的代码示例。这款神器是学习和使用计算机视觉编程的良好选择,同时还可以应用于生产实践中,如物联网、机器人控制、智能安防和自动驾驶等领域。OpenMV 的出现将进一步推进计算机视觉编程的普及和发展。