OpenMV的VisionBoard视觉识别开发板学习记录

此篇博客仅用于对VisionBoard的开发板的学习研究记录,没有教学内容。

一、资料来源

开发板资料链接
开发板环境搭建手册
开发板视频教程
板子的资料网站
openmv官方的网站

目录

  • 一、资料来源
  • 二、针对 VisionBoard的目标识别和定位总结
      • 1. 目标识别功能
        • 1.1 物体检测
        • 1.2 人脸检测
        • 1.3 特征匹配
      • 2. 定位功能
        • 2.1 3D位置估计
        • 2.2 物体跟踪
      • 3. 开发环境
      • 4. 应用场景
  • 三、通过 OpenMV网站的中文教程总结他可以做什么
        • OpenMV是什么?
        • OpenMV适合做什么?
        • OpenMV不适合做什么?
        • MicroPython函数文档
        • OpenMV的分辨率
        • OpenMV的识别距离
        • OpenMV的算法概括
        • OpenMV图像处理的方法

二、针对 VisionBoard的目标识别和定位总结

VisionBoard,通过OpenMV Cam,提供了强大的计算机视觉功能,特别是在目标识别和定位方面。以下是关于其具体功能和参数的详细介绍。

1. 目标识别功能

1.1 物体检测

使用颜色跟踪、边缘检测和斑点检测等功能来识别和跟踪摄像头视野内的物体。例如,find_blobs()函数可以根据颜色阈值检测物体,这对于检测红色球或特定图案非常有用。

  • 颜色跟踪:通过颜色阈值检测和跟踪特定颜色的物体。
  • 示例代码:
    import sensor, image, time
    
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QVGA)
    sensor.skip_frames(time = 2000)
    
    while(True):
        img = sensor.snapshot()
        blobs = img.find_blobs([(30, 100, 15, 127, 15, 127)])  # 红色范围
        for blob in blobs:
            img.draw_rectangle(blob.rect())
            img.draw_cross(blob.cx(), blob.cy())
    
    • 参数
      • sensor.RGB565: 使用RGB565格式进行图像采集。
      • sensor.QVGA: 使用320x240分辨率进行图像采集。
      • find_blobs([(30, 100, 15, 127, 15, 127)]): 颜色阈值(L, A, B)范围,用于检测红色物体。
1.2 人脸检测

OpenMV Cam支持使用Haar特征进行简单的人脸检测,可以在检测到人脸时触发某些动作。

  • Haar特征检测:利用预训练的Haar特征级联分类器进行人脸检测。
    import sensor, image, time, pyb
    
    sensor.reset()
    sensor.set_pixformat(sensor.GRAYSCALE)
    sensor.set_framesize(sensor.QVGA)
    sensor.skip_frames(time = 2000)
    
    face_cascade = image.HaarCascade("frontalface", stages=25)
    while(True):
        img = sensor.snapshot()
        faces = img.find_features(face_cascade, threshold=0.5, scale_factor=1.5)
        for face in faces:
            img.draw_rectangle(face)
    
    • 参数
      • image.HaarCascade("frontalface", stages=25): 使用预训练的正面人脸Haar级联分类器,共25个级联阶段。
      • find_features(face_cascade, threshold=0.5, scale_factor=1.5): 检测人脸,设置阈值和缩放因子。
1.3 特征匹配

可以在不同图像之间进行特征匹配,这对于识别和区分多个物体非常重要。

  • ORB特征匹配:用于识别和匹配图像中的特征点。
    import sensor, image, time
    
    sensor.reset()
    sensor.set_pixformat(sensor.GRAYSCALE)
    sensor.set_framesize(sensor.QVGA)
    sensor.skip_frames(time = 2000)
    
    template = image.Image("/example.pgm")
    while(True):
        img = sensor.snapshot()
        match = img.find_keypoints(max_keypoints=150, threshold=10, scale_factor=1.2, normalized=True).match(template)
        if match:
            img.draw_rectangle(match.rect())
    
    • 参数
      • find_keypoints(max_keypoints=150, threshold=10, scale_factor=1.2, normalized=True): 检测图像中的关键点。
      • match(template): 与模板图像进行匹配。

2. 定位功能

VisionBoard也能够执行定位任务,这涉及确定物体的位置和方向:

2.1 3D位置估计

结合IMU(惯性测量单元)数据和视觉数据,板子可以估计物体的3D位置。通过使用卡尔曼滤波或Madgwick滤波等传感器融合技术,可以提高精度。

  • IMU数据融合:通过IMU传感器的数据进行3D位置估计。结合视觉数据,使用卡尔曼滤波等技术实现高精度定位。
    from machine import I2C
    from mpu6050 import MPU6050
    
    i2c = I2C(1)
    mpu = MPU6050(i2c)
    while True:
        accel = mpu.get_accel()
        gyro = mpu.get_gyro()
        print("Accelerometer:", accel)
        print("Gyroscope:", gyro)
    
    • 参数
      • MPU6050(i2c): 使用MPU6050传感器获取加速度计和陀螺仪数据。
      • get_accel(), get_gyro(): 获取加速度和陀螺仪数据。
2.2 物体跟踪

通过连续监控物体的位置,VisionBoard可以实时跟踪物体的移动。这对于需要精确物体跟踪的应用(如机器人导航和互动)非常有用。

  • 连续跟踪:实时监控物体位置,进行物体跟踪。结合IMU和视觉数据,实现精确定位。
    import sensor, image, time
    
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QVGA)
    sensor.skip_frames(time = 2000)
    
    clock = time.clock()
    while(True):
        clock.tick()
        img = sensor.snapshot()
        blobs = img.find_blobs([(30, 100, 15, 127, 15, 127)])
        for blob in blobs:
            img.draw_rectangle(blob.rect())
            img.draw_cross(blob.cx(), blob.cy())
            print("Tracking object at: x=", blob.cx(), " y=", blob.cy())
    
    • 参数
      • find_blobs([(30, 100, 15, 127, 15, 127)]): 颜色阈值(L, A, B)范围,用于检测和跟踪物体。

3. 开发环境

  • OpenMV IDE:支持MicroPython脚本,简化开发过程。提供图像数据可视化、调试工具和摄像头设置配置。
  • 硬件参数
    • 处理器:STM32H743VI ARM Cortex-M7,480 MHz
    • 内存:1MB RAM,2MB Flash
    • 摄像头:OV7725,支持最大640x480分辨率,帧率60fps
    • 接口:SPI、I2C、UART、ADC、DAC、GPIO。

4. 应用场景

  • 机器人:自主导航、物体操控、环境映射
  • 安防:入侵检测、人脸识别、监控
  • 工业自动化:质量控制、物体分类、生产线监控
  • 教育项目:教授计算机视觉和嵌入式系统编程

总体来说,VisionBoard通过其强大的硬件和丰富的软件生态系统,在目标识别和定位任务方面表现出色,适用于多种应用场景。


三、通过 OpenMV网站的中文教程总结他可以做什么

资料

OpenMV是什么?

简单的来说,它是一个可编程的摄像头,通过MicroPython语言,可以实现你的逻辑。而且摄像头本身内置了一些图像处理算法,很容易使用。


OpenMV适合做什么?

DIY相关的项目制作,比如追踪小球的车,云台,或者解魔方的机器人。
对成本要求很高的嵌入式工业方案,比如流水线物品的分拣。


OpenMV不适合做什么?

复杂的算法:比如OCR识别,车牌识别,猫狗分类,深度学习之类的。


MicroPython函数文档

MicroPython 和 OpenMV Cam 中文文档
MicroPython 和 pyboard 中文文档
MicroPython 和 ESP32 中文文档
MicroPython 和 moxing-stm32 中文文档


图像处理背景知识:物理上,颜色就是不同波长的电磁波。


OpenMV的分辨率

OpenMV2 M4 / OpenMV3 M7 / OpenMV4 H7: 30万像素,OV7725 / MT9M114 感光元件。
通常在程序中使用:QQVGA: 160x120,QVGA: 320x240
最大支持:VGA: 640x480
注:VGA彩色为压缩格式,不支持图像算法。
OpenMV4 Plus / OpenMV RT1062 标配了OV5640模组,最高可支持500万像素。


OpenMV的识别距离

标配镜头:
乒乓球大小的物体:0.5m~1m
人脸识别:1m
长焦镜头可以看多远?
乒乓球大小的物体:3m


OpenMV的算法概括

追踪颜色、二维码识别、人脸识别、机器人巡线、模版匹配、特征点检测、人眼追踪、HAAR,LBP,HOG算法、保存图像、录制视频、边缘检测、瞳孔识别、直线检测、光流人脸分辨、AprilTag


OpenMV图像处理的方法
  1. 感官元件
  2. 图像的基本运算
  3. 使用图像的统计信息

  1. 反馈图像

在这里插入图片描述


  1. 寻找色块函数
    OpenMV 的IDE里加入了阈值选择工具,极大的方便了对于颜色阈值的调试。
    拖动六个滑块,可以实时的看到阈值的结果,我们想要的结果就是,将我们的目标颜色变成白色,其他颜色全变为黑色。
    在这里插入图片描述

  1. AprilTag视觉基准系统
    AprilTag是一个视觉基准系统,可用于各种任务,包括AR,机器人和相机校准。这个tag可以直接用打印机打印出来,而AprilTag检测程序可以计算相对于相机的精确3D位置,方向和id。
    在这里插入图片描述
    简单来说,只要把这个tag贴到目标上,就可以在OpenMV上识别出这个标签的3D位置,id。
    AprilTag最神奇的是3D定位的功能,它可以得知Tag的空间位置,一共有6个自由度,三个位置,三个角度。 在串口输出为6个变量,Tx, Ty, Tz为空间的3个位置量,Rx,Ry,Rz为三个旋转量。

  1. 模板匹配
    模板匹配(find_temolate)采用的是ncc算法,只能匹配与模板图片大小和角度基本一致的图案。局限性相对来说比较大,视野中的目标图案稍微比模板图片大一些或者小一些就可能匹配不成功。
    模板匹配适应于摄像头与目标物体之间距离确定,不需要动态移动的情况。 比如适应于流水线上特定物体的检测,而不适应于小车追踪一个运动的排球(因为运动的排球与摄像头的距离是动态的,摄像头看到的排球大小会变化,不会与模板图片完全一样)。
    多角度多大小匹配可以尝试保存多个模板,采用多模板匹配。

  1. 特征点检测
    特征点检测(find_keypoint): 如果是刚开始运行程序,例程提取最开始的图像作为目标物体特征,kpts1保存目标物体的特征。默认会匹配目标特征的多种比例大小和角度,而不仅仅是保存目标特征时的大小角度,比模版匹配灵活,也不需要像多模板匹配一样保存多个模板图像。
    特征点检测,也可以提前保存目标特征,之前是不推荐这么做的,因为环境光线等原因的干扰,可能导致每次运行程序光线不同特征不同,匹配度会降低。但是最新版本的固件中,增加了对曝光度、白平衡、自动增益值的调节,可以人为的定义曝光值和白平衡值,相对来说会减弱光线的干扰。也可以尝试提前保存目标特征。

  1. 利用OpenMV进行测距
    第一种方法:
    利用apriltag,Apriltag可以进行3D定位。
    第二种方法:
    OpenMV采用的是单目摄像头,想要实现测距,就需要选参照物,利用参照物的大小比例来计算距离。
    计算公式: 距离 = 一个常数/直径的像素
    常数获取步骤:先让球距离摄像头10cm,打印出摄像头里直径的像素值,然后相乘,就得到了k的值!

  1. 扫码识别
    草料二维码生成器、条形码生成器

  1. 颜色形状同时识别
  2. 颜色与模板匹配同时识别

  1. 分辨不同人脸
    使用LBP特征分辨不同的人脸。我们需要先建立自己的图像库,然后,我们可以运行以下代码来采集不同的人脸样本。注意采集时尽量让背景均匀,并且让人脸尽量充满整个画面。人脸可以微笑,不笑,正脸,歪头,戴眼镜,不戴眼镜等。可以选择每人10-20张图片。
    在这里插入图片描述
    最后,我们运行以下代码,来识别当前摄像头视野内的人脸,并输出与当前对象最匹配的人。
# Face recognition with LBP descriptors.
# See Timo Ahonen's "Face Recognition with Local Binary Patterns".
#
# Before running the example:
# 1) Download the AT&T faces database http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
# 2) Exract and copy the orl_faces directory to the SD card root.


import sensor, time, image  

sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALE
sensor.set_framesize(sensor.B128X128) # or sensor.QQVGA (or others)
sensor.set_windowing((92,112))
sensor.skip_frames(10) # Let new settings take affect.
sensor.skip_frames(time = 5000) #等待5s



#SUB = "s1"
NUM_SUBJECTS = 6 #图像库中不同人数,一共6人
NUM_SUBJECTS_IMGS = 20 #每人有20张样本图片

# 拍摄当前人脸。
img = sensor.snapshot()
#img = image.Image("singtown/%s/1.pgm"%(SUB))
d0 = img.find_lbp((0, 0, img.width(), img.height()))
#d0为当前人脸的lbp特征
img = None
pmin = 999999
num=0

def min(pmin, a, s):
    global num
    if a<pmin:
        pmin=a
        num=s
    return pmin

for s in range(1, NUM_SUBJECTS+1):
    dist = 0
    for i in range(2, NUM_SUBJECTS_IMGS+1):
        img = image.Image("singtown/s%d/%d.pgm"%(s, i))
        d1 = img.find_lbp((0, 0, img.width(), img.height()))
        #d1为第s文件夹中的第i张图片的lbp特征
        dist += image.match_descriptor(d0, d1)#计算d0 d1即样本图像与被检测人脸的特征差异度。
    print("Average dist for subject %d: %d"%(s, dist/NUM_SUBJECTS_IMGS))
    pmin = min(pmin, dist/NUM_SUBJECTS_IMGS, s)#特征差异度越小,被检测人脸与此样本更相似更匹配。
    print(pmin)

print(num) # num为当前最匹配的人的编号。

运行结果如图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/652750.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react ant 表格实现 拖拽排序和多选

项目背景 : react ant 要实现 : 有多选功能(实现批量删除 , 也可以全选) 可以拖拽(可以复制 , 方便顶部的搜索功能) 要实现效果如下 1 这是最初的拖拽功能实现 , 不能复制表格里的内容 , 不符合要求 2 更改了ROW的内容 , 实现了可以复制表格内容 代码 //控制是否可以选中表格…

Oracle数据库操作问题汇总

一、简介 Oracle Database&#xff0c;又名Oracle RDBMS&#xff0c;或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是世界上流行的关系数据库管理系统&#xff0c;系统可移植性好、使用方便、功能强&…

数据结构--二叉树--顺序存储判断是否二叉搜索树(2022统考真题)

数据结构–二叉树–顺序存储判断是否二叉搜索树(2022统考真题) 题目描述&#xff1a; 思路 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种具有以下性质的二叉树&#xff1a; 对于树中的每个节点 N&#xff0c;它的左子树&#xff08;如果…

重学java 49 List接口

但逢良辰&#xff0c;顺颂时宜 —— 24.5.28 一、List接口 1.概述: 是collection接口的子接口 2.常见的实现类: ArrayList LinkedList Vector 二、List集合下的实现类 1.ArrayList集合的使用及源码分析 1.概述 ArrayList是List接口的实现类 2.特点 a.元素有序 —> 按照什么顺…

Oracle中rman的增量备份使用分享

继上次使用RMAN的全量备份和异机还原以后&#xff0c;开始研究一下增量备份和还原的方法。相比于全量RMAN的备份还原&#xff0c;增量的备份还原就相对简单。本实践教程直接上操作&#xff0c;还是回归到一个问题&#xff0c;就是关于两个数据库创建时候&#xff0c;必须保持or…

【职业教育培训机构小程序】教培机构“招生+教学”有效解决方案

教培机构“招生教学”有效解决方案在数字化转型的浪潮中&#xff0c;职业教育培训机构面临着提升教学效率、拓宽招生渠道、增强学员互动等多重挑战。小程序作为一种新兴的移动应用平台&#xff0c;为解决这些痛点提供了有效途径。 一、职业教育培训机构小程序的核心功能 &…

SpringBoot自动装配源码

自动装配&#xff1a; 实际上就是如何将Bean自动化装载到IOC容器中管理&#xff0c;Springboot 的自动装配时通过SPI 的方式来实现的 SPI&#xff1a;SpringBoot 定义的一套接口规范&#xff0c;这套规范规定&#xff1a;Springboot 在启动时会扫描外部引用 jar 包中的META-IN…

栈(从数据结构的三要素出发)

文章目录 逻辑结构物理结构顺序栈链栈共享栈 数据的操作顺序栈的基本操作链栈的基本操作共享栈的基本操作 数据结构的应用栈在括号匹配中的应用栈在表达式求值中的应用栈在递归调用中的应用 逻辑结构 栈是只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表&#xf…

保留两位小数不四舍五入,10000.55变成10000.54的坑

正解 function moneyFormat(num){ let money num "";//隐式转换为字符串和toString()效果一样//没有小数补齐这个0if(money.indexOf(".")"-1"){moneymoney".00";}else{//有小数截取前二位小数moneymoney.substring(0,money.inde…

工业AI的崛起,中国自主创新的新机遇

我们都知道&#xff0c;互联网已经深刻地改变了我们的生活方式&#xff0c;催生了无数的新型商业模式和创新产业&#xff0c;推动了社会的经济变革。中国在互联网领域的发展取得了举世瞩目的成就&#xff0c;建成了全球规模最大、技术领先的5G网络&#xff0c;互联网应用的普及…

vue3 vite title 页面标题设置

效果图&#xff1a; 1. 安装 vite-plugin-html 插件 npm install vite-plugin-html -D2. 修改 vite.config.js import {defineConfig, loadEnv} from vite import { createHtmlPlugin } from "vite-plugin-html" import {resolve} from path import vue from vitej…

我说同事咋找工作命中率这么高,原来是学习了这些招式

最近有两个同事离职了&#xff0c;其中一个还是专科&#xff0c;他俩一个是前端开发&#xff0c;一个是python开发&#xff0c;两个人都接近35岁了。我们还劝告他们&#xff0c;不要离职&#xff0c;要骑驴找马。但了解后&#xff0c;他俩非常有信心的说&#xff1a;不怕&#…

振弦采集仪在岩土工程地质灾害监测中的可行性研究

振弦采集仪在岩土工程地质灾害监测中的可行性研究 引言&#xff1a; 岩土工程地质灾害是指在岩土体中由于自然力和人类活动等因素引起的&#xff0c;对人类生活、财产以及环境造成威胁的灾害。为了及时发现并准确监测地质灾害的发生和演化过程&#xff0c;振弦采集仪作为一种新…

web自动化-下拉框操作/键鼠操作/文件上传

在我们做UI自动化测试的时候&#xff0c;会有一些元素需要特殊操作&#xff0c;比如下拉框操作/键鼠操作/文件上传。 下拉框操作 在我们很多页面里有下拉框的选择&#xff0c;这种元素怎么定位呢&#xff1f;下拉框分为两种类型&#xff1a;我们分别针对这两种元素进行定位和…

6-4 先序输出度为2的结点

作者 DS课程组 单位 临沂大学 本题要求实现一个函数&#xff0c;按照先序遍历的顺序输出给定二叉树中度为2的结点。 函数接口定义&#xff1a; void PreorderPrintNodes( BiTree T);T是二叉树树根指针&#xff0c;PreorderPrintNodes按照先序遍历的顺序输出给定二叉树T中度为…

随笔(二)——项目代码优化

文章目录 前言一、传入的props的默认值定义为空数组1.问题&#xff08;提示对象的类型为unknwn&#xff09;2.优化 二、document 上不存在xxx属性1.问题2.做了一个兼容浏览器的关闭全屏方法3. 解决方法 &#xff08;使用declare globa设置全局变量类型&#xff09;&#xff08;…

ssm球场计费管理系统-计算机毕业设计源码77275

摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在球馆计费管理的要求下&#xff0c;开发一款整体式结构的球场计费管理…

配置阿里yum源

配置阿里yum源&#xff08;这个很重要&#xff09;&#xff1a;https://developer.aliyun.com/article/1480470 1.备份系统自带yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2.下载ailiyun的yum源配置文件 2.1 CentOS7 wge…

专业软件测试机构CMA、CNAS资质与测试报告介绍

软件测试机构 一、专业软件测试机构CMA和CNAS的资质介绍如下&#xff1a; 1.CMA&#xff08;China Inspection Body and Laboratory Mandatory Approval&#xff09;是中国计量认证的缩写&#xff0c;是由中国计量认证机构对软件测试实验室在测试技术能力、测试设备、质量保证…

【Java面试】四、MySQL篇(上)

文章目录 1、定位慢查询2、慢查询的原因分析3、索引3.1 数据结构选用&#xff1a;二叉树 & 红黑树3.2 数据结构选用&#xff1a;B树 4、聚簇索引、非聚簇索引、回表查询4.1 聚簇索引、非聚簇索引4.2 回表查询 5、覆盖索引、超大分页优化5.1 覆盖索引5.2 超大分页处理 6、索…