此篇博客仅用于对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图像处理的方法
- 感官元件
- 图像的基本运算
- 使用图像的统计信息
- 反馈图像
- 寻找色块函数
OpenMV 的IDE里加入了阈值选择工具,极大的方便了对于颜色阈值的调试。
拖动六个滑块,可以实时的看到阈值的结果,我们想要的结果就是,将我们的目标颜色变成白色,其他颜色全变为黑色。
- AprilTag视觉基准系统
AprilTag是一个视觉基准系统,可用于各种任务,包括AR,机器人和相机校准。这个tag可以直接用打印机打印出来,而AprilTag检测程序可以计算相对于相机的精确3D位置,方向和id。
简单来说,只要把这个tag贴到目标上,就可以在OpenMV上识别出这个标签的3D位置,id。
AprilTag最神奇的是3D定位的功能,它可以得知Tag的空间位置,一共有6个自由度,三个位置,三个角度。 在串口输出为6个变量,Tx, Ty, Tz为空间的3个位置量,Rx,Ry,Rz为三个旋转量。
- 模板匹配
模板匹配(find_temolate
)采用的是ncc算法,只能匹配与模板图片大小和角度基本一致的图案。局限性相对来说比较大,视野中的目标图案稍微比模板图片大一些或者小一些就可能匹配不成功。
模板匹配适应于摄像头与目标物体之间距离确定,不需要动态移动的情况。 比如适应于流水线上特定物体的检测,而不适应于小车追踪一个运动的排球(因为运动的排球与摄像头的距离是动态的,摄像头看到的排球大小会变化,不会与模板图片完全一样)。
多角度多大小匹配可以尝试保存多个模板,采用多模板匹配。
- 特征点检测
特征点检测(find_keypoint
): 如果是刚开始运行程序,例程提取最开始的图像作为目标物体特征,kpts1保存目标物体的特征。默认会匹配目标特征的多种比例大小和角度,而不仅仅是保存目标特征时的大小角度,比模版匹配灵活,也不需要像多模板匹配一样保存多个模板图像。
特征点检测,也可以提前保存目标特征,之前是不推荐这么做的,因为环境光线等原因的干扰,可能导致每次运行程序光线不同特征不同,匹配度会降低。但是最新版本的固件中,增加了对曝光度、白平衡、自动增益值的调节,可以人为的定义曝光值和白平衡值,相对来说会减弱光线的干扰。也可以尝试提前保存目标特征。
- 利用OpenMV进行测距
第一种方法:
利用apriltag,Apriltag可以进行3D定位。
第二种方法:
OpenMV采用的是单目摄像头,想要实现测距,就需要选参照物,利用参照物的大小比例来计算距离。
计算公式:距离 = 一个常数/直径的像素
常数获取步骤:先让球距离摄像头10cm,打印出摄像头里直径的像素值,然后相乘,就得到了k的值!
- 扫码识别
草料二维码生成器、条形码生成器
- 颜色形状同时识别
- 颜色与模板匹配同时识别
- 分辨不同人脸
使用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为当前最匹配的人的编号。
运行结果如图: