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

一、什么是OpenMV

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

二、OpenMV的硬件和软件配置

OpenMV最新的版本是OMV3,使用STM32H743VIT6处理器,拥有1MB SRAM,2MB flash,支持2560×1440高清输出,以及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 的出现将进一步推进计算机视觉编程的普及和发展。

原创文章,作者:IGTSX,如若转载,请注明出处:https://www.506064.com/n/313648.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IGTSX的头像IGTSX
上一篇 2025-01-07 09:44
下一篇 2025-01-07 09:44

相关推荐

  • 如何在Java中拼接OBJ格式的文件并生成完整的图像

    OBJ格式是一种用于表示3D对象的标准格式,通常由一组顶点、面和纹理映射坐标组成。在本文中,我们将讨论如何将多个OBJ文件拼接在一起,生成一个完整的3D模型。 一、读取OBJ文件 …

    编程 2025-04-29
  • 如何实现图像粘贴到蒙版

    本文将从多个方面介绍图像粘贴到蒙版的实现方法。 一、创建蒙版 首先,在HTML中创建一个蒙版元素,用于接收要粘贴的图片。 <div id=”mask” style=”widt…

    编程 2025-04-29
  • Python图像黑白反转用法介绍

    本文将从多个方面详细阐述Python图像黑白反转的方法和技巧。 一、Pillow模块介绍 Pillow是Python的一个图像处理模块,可以进行图片的裁剪、旋转、缩放等操作。使用P…

    编程 2025-04-28
  • 使用boofcv进行图像处理和机器视觉

    本文将详细介绍使用boofcv进行图像处理和机器视觉的方法和实践。首先,我们将介绍boofcv的概述和安装方法,然后分别介绍它的图像处理、相机校准和机器学习功能。 一、概述和安装 …

    编程 2025-04-28
  • Matlab二值图像全面解析

    本文将全面介绍Matlab二值图像的相关知识,包括二值图像的基本原理、如何对二值图像进行处理、如何从二值图像中提取信息等等。通过本文的学习,你将能够掌握Matlab二值图像的基本操…

    编程 2025-04-28
  • Python实现图像转化为灰度图像

    本文将从多个方面详细阐述如何使用Python将图像转化为灰度图像,包括图像的概念、灰度图像的概念、Python库的使用以及完整的Python代码实现。 一、图像与灰度图像 图像是指…

    编程 2025-04-28
  • 图像与信号处理期刊级别

    本文将从多个方面介绍图像与信号处理期刊级别的相关知识,包括图像压缩、人脸识别、关键点匹配等等。 一、图像压缩 图像在传输和存储中占据了大量的空间,因此图像压缩成为了很重要的技术。常…

    编程 2025-04-28
  • JFXtras样式——美化JavaFX应用的必备神器

    本文将从多个方面对JFXtras样式进行详细的阐述,教你如何使用JFXtras样式来美化你的JavaFX应用。无需任何前置知识,让我们一步步来了解。 一、简介 JFXtras是一个…

    编程 2025-04-27
  • Anaconda Python – 多面手的全能编程开发工具

    Anaconda Python是一个全能的编程开发工具,它集成了多种Python数据科学和机器学习库以及其他工具。在这篇文章中,我们将从多个方面对Anaconda Python进行…

    编程 2025-04-27
  • Python 文件内图像重命名

    Python作为一门功能强大的编程语言,可以实现很多实用的操作。在基本编程操作中,经常会遇到需要对文件进行操作,而文件中的图像也需要进行重命名。本文将从多个方面详细介绍如何使用Py…

    编程 2025-04-27

发表回复

登录后才能评论