【雕爷学编程】MicroPython手册之 OpenMV Cam 视觉检测和定位

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
OpenMV Cam 是一款小型、低功耗的微控制器板,可以让你在现实世界中使用机器视觉轻松实现应用程序。你可以使用高级 Python 脚本(由 MicroPython 操作系统提供)而不是 C/C++ 对 OpenMV Cam 进行编程。OpenMV Cam 的技术参数包括以下几个方面:

1、处理器:OpenMV Cam H7 Plus 使用 STM32H743II ARM Cortex M7 处理器,运行频率为 480 MHz,具有 32MB SDRAM + 1MB SRAM 和 32 MB 外部闪存 + 2 MB 内部闪存。OpenMV Cam M4 V2 使用 STM32F427VG ARM Cortex M4 处理器,运行频率为 180 MHz,具有 256KB RAM 和 1 MB 闪存。
2、图像传感器:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都使用 OV7725 图像传感器,能够在分辨率高于 320x240 时以 75 FPS 拍摄 320x240 8 位灰度图像或 320x240 16 位 RGB565 图像,在分辨率低于 320x240 时能够以 150 FPS 拍摄。
3、I/O 接口:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都具有以下 I/O 接口:
(1)全速 USB (12Mbs) 接口,连接到电脑。当插入 OpenMV Cam 后,你的电脑会出现一个虚拟 COM 端口和一个“U盘”。
(2)μSD 卡槽能够进行 100Mbs 读/写,使你的 OpenMV Cam 能够录制视频,并把机器视觉的素材从 μSD 卡提取出来。
(3)SPI 总线的运行速度高达 54Mbs,使你可以简单地把图像流数据传给 LCD 扩展板、WiFi 扩展板,或者其他控制器。
(4)I2C 总线(高达 1Mb/s)、CAN 总线(高达 1Mb/s)和异步串行总线(TX/RX,高达 7.5Mb/s),用于与其他控制器或传感器连接。
(5)一个 12 位 ADC 和一个 12 位 DAC。
(6)所有 I/O 引脚上都有中断和 PWM(板上有 9 或者10个 I/O 引脚)。
4、LED:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都配备了一个 RGB LED(三色)和两个高亮的 850nm IR LED(红外)。
5、镜头:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都配备了标准 M12 镜头接口和一个默认的 2.8 毫米镜头。如果你想在 OpenMV Cam 上使用更专业的镜头,你可以轻松购买并自行安装。

在这里插入图片描述
MicroPython的OpenMV Cam可以用于视觉检测和定位任务,下面将从专业的视角,详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

高性能图像处理:OpenMV Cam搭载了强大的图像处理芯片和优化算法,能够高效地进行图像采集、处理和分析。它具备快速的图像处理能力,可以实时处理复杂的视觉算法。
灵活的编程接口:OpenMV Cam基于MicroPython编程语言,提供了简单易用的编程接口,使教师和学生可以方便地进行算法的开发和调试。他们可以根据需要自定义图像处理算法,实现个性化的视觉检测和定位功能。
多种传感器支持:OpenMV Cam支持多种传感器的连接,如红外传感器、温度传感器等,可以与视觉检测和定位相结合,实现更多样化的应用场景。
开放的硬件设计:OpenMV Cam的硬件设计是开放的,可以根据需要进行二次开发和扩展。这使得教师和学生可以根据具体需求进行定制化的开发,满足不同应用场景的需求。

应用场景:

智能机器人:OpenMV Cam可以嵌入到智能机器人中,实现对环境中目标物体的检测和定位。例如,在自主导航中,通过检测和定位周围的障碍物和目标物体,机器人可以进行路径规划和避障操作。
工业自动化:OpenMV Cam可以应用于工业自动化中的视觉检测和定位任务。例如,在生产线上,通过检测和定位产品的位置和状态,可以实现自动化的质量控制和物体识别等功能。
智能监控:OpenMV Cam可以用于智能监控系统中的视觉检测和定位。它可以实时监测场景中的人员、车辆等目标物体,实现智能报警和安全监控功能。

需要注意的事项:

算法设计和优化:视觉检测和定位涉及到复杂的图像处理算法,教师和学生需要对算法进行设计和优化,以实现高效的检测和定位性能。
数据集和训练:为了提高检测和定位的准确性,教师可以引导学生构建适合的数据集,并进行模型的训练和优化。合理的数据集和训练方法对于算法的性能提升非常重要。
环境适应性:视觉检测和定位需要适应不同的环境条件,如光照变化、背景干扰等。教师应指导学生进行算法的鲁棒性测试和优化,使其能够在各种环境下稳定运行。
实时性和延迟:在某些应用场景下,实时性和低延迟是很重要的要求。教师和学生需要关注算法的运行时间,尽量减少处理的延迟,以满足实时性的需求。

综上所述,MicroPython的OpenMV Cam在视觉检测和定位方面具有高性能图像处理、灵活的编程接口、多种传感器支持和开放的硬件设计等主要特点。它适用于智能机器人、工业自动化和智能监控等应用场景。在使用过程中,需要注意算法设计和优化、数据集和训练、环境适应性以及实时性和延迟等方面的问题。教师可以指导学生在这些方面进行开发和调试,以实现更好的视觉检测和定位效果。

案例一:使用OpenMV Cam进行颜色检测

import sensor, image, time

# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 定义颜色阈值
color_thresholds = [(30, 100, 15, 127, 15, 127)]

while(True):
    img = sensor.snapshot()

    # 寻找红色物体
    for color in color_thresholds:
        r, g, b = color
        if (img.get_pixel(100, 100) >= r and img.get_pixel(100, 100) <= g and img.get_pixel(100, 100) >= b):
            print("找到红色物体")
            break
    else:
        print("未找到红色物体")

解读:这个程序首先导入了所需的库,然后设置了摄像头的参数。接着定义了一个颜色阈值列表,用于检测红色物体。在while循环中,程序不断地获取摄像头的画面,并检查画面中是否有红色物体。如果找到了红色物体,就输出“找到红色物体”,否则输出“未找到红色物体”。

案例二:使用OpenMV Cam进行人脸检测

import sensor, image, time

# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 加载人脸检测模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

while(True):
    img = sensor.snapshot()
    gray = cv2.cvtColor(img.array(), cv2.COLOR_RGB2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    for (x, y, w, h) in faces:
        img.drawRectangle(x, y, x+w, y+h, color=(255, 0, 0))
        print("找到人脸,位置:", x, y, x+w, y+h)

解读:这个程序首先导入了所需的库,然后设置了摄像头的参数。接着加载了一个预训练的人脸检测模型。在while循环中,程序不断地获取摄像头的画面,并将画面转换为灰度图像。然后使用人脸检测模型检测画面中的人脸,并在原画面上画出检测到的人脸框。最后输出检测到的人脸的位置信息。

案例三:使用OpenMV Cam进行二维码识别

import sensor, image, time
from pyzbar.pyzbar import decode

# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 加载二维码识别模型
qrcode_model = cv2.imread('qrcode_model.xml', 0)

while(True):
    img = sensor.snapshot()
    gray = cv2.cvtColor(img.array(), cv2.COLOR_RGB2GRAY)
    decoded_objects = decode(gray)

    for obj in decoded_objects:
        img.drawRectangle(obj.rect.left, obj.rect.top, obj.rect.width, obj.rect.height, color=(255, 0, 0))
        print("找到二维码,内容:", obj.data.decode('utf-8'))

解读:这个程序首先导入了所需的库,然后设置了摄像头的参数。接着加载了一个预训练的二维码识别模型。在while循环中,程序不断地获取摄像头的画面,并将画面转换为灰度图像。然后使用二维码识别模型识别画面中的二维码,并在原画面上画出识别到的二维码区域。最后输出识别到的二维码的内容。

案例四:颜色识别

import sensor, image, time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 延迟 2000 毫秒以使相机进行初始化  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    r, g, b = img.get_color() # 获取照片的 RGB 值  
    print(r, g, b) # 打印 RGB 值

这个程序会不断地拍摄照片,并获取每张照片的 RGB 值。你可以通过改变这个颜色值,使 OpenMV Cam 对特定的颜色进行检测和识别。

案例五:边缘检测

import sensor, image, time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.GRAYSCALE) # 设置像素格式为灰度  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 延迟 2000 毫秒以使相机进行初始化  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    edged = img.find_edges(threshold = 20) # 进行边缘检测,阈值可以根据实际需要进行调整  
    edged.draw() # 在原图上绘制检测到的边缘  
    sensor.skip_frames(time = 1000) # 延迟 1000 毫秒以使处理进行完毕并获取处理后的图片

这个程序会不断地拍摄照片,并进行边缘检测。它会在检测到的边缘上绘制线条,然后延迟一段时间以获取处理后的图片。你可以通过调整阈值,改变边缘检测的灵敏度。

案例六:对象识别

以下是一个基于Python和OpenCV库的简单对象识别程序代码。该程序使用OpenCV中的预训练的Cascade分类器来检测图像中的对象。在这个例子中,我们将在图像中检测人。

import cv2  
  
# 创建级联分类器对象  
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')  
  
# 读取图像  
img = cv2.imread('test.jpg')  
  
# 转换为灰度图像  
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  
  
# 检测图像中的对象  
faces = face_cascade.detectMultiScale(gray, 1.1, 4)  
  
# 在检测到的每个对象周围绘制矩形  
for (x, y, w, h) in faces:  
    cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)  
  
# 显示图像  
cv2.imshow('img', img)  
  
# 按任意键退出  
cv2.waitKey(0)  
cv2.destroyAllWindows()

这个程序首先加载一个预训练的级联分类器,该分类器被训练用来检测图像中的人脸。然后,它将输入的图像转换为灰度图像,因为许多图像处理算法都需要在灰度图像上运行。接下来,使用级联分类器在灰度图像中检测人脸,检测到的每个脸都会在原始图像上绘制一个矩形框。最后,显示修改后的图像。按任意键可以退出程序。

此代码需要在安装了OpenCV的Python环境中运行。如果你还没有安装OpenCV,你可以通过pip来安装:pip install opencv-python。此外,这个代码假设你的图片名为’test.jpg’,并且它将在你的工作目录下创建和打开这个文件。如果你的图片名或位置不同,你需要相应地修改代码。

案例七:色块检测和定位:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

def color_block_detection():
    while True:
        img = sensor.snapshot()
        # 执行色块检测算法
        # 获取色块检测结果
        # 在图像上绘制检测框
        # 定位色块位置

color_block_detection()

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行色块检测和定位。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个color_block_detection()函数,用于色块检测和定位。
在函数中,使用sensor.snapshot()函数获取当前图像。
执行色块检测算法,可以使用颜色分割和形状分析等算法进行色块检测。
获取色块检测结果,并在图像上绘制检测框以标识检测到的色块位置。
进行色块定位,可以计算色块的中心位置或其他位置信息。
在主程序中,调用color_block_detection()函数进行色块检测和定位。

案例八:QR码检测和定位:


import sensor
import image
import time
import pyb

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

def qr_code_detection():
    while True:
        img = sensor.snapshot()
        # 执行QR码检测算法
        # 获取检测到的QR码信息
        # 在图像上绘制检测框
        # 定位QR码位置

qr_code_detection()

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行QR码检测和定位。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个qr_code_detection()函数,用于QR码检测和定位。
在函数中,使用sensor.snapshot()函数获取当前图像。
执行QR码检测算法,可以使用二维码识别库或图像处理算法进行QR码检测。
获取检测到的QR码信息,并在图像上绘制检测框以标识检测到的QR码位置。
进行QR码定位,可以计算QR码的中心位置或其他位置信息。
在主程序中,调用qr_code_detection()函数进行QR码检测和定位。

案例九:地标检测和定位:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

def landmark_detection():
    while True:
        img = sensor.snapshot()
        # 执行地标检测算法
        # 获取检测到的地标信息
        # 在图像上绘制检测框
        # 定位地标位置

landmark_detection()

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行地标检测和定位。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个landmark_detection()函数,用于地标检测和定位。
在函数中,使用sensor.snapshot()函数获取当前图像。
执行地标检测算法,可以使用计算机视觉算法或深度学习模型进行地标检测。
获取检测到的地标信息,并在图像上绘制检测框以标识检测到的地标位置。
进行地标定位,可以计算地标的中心位置或其他位置信息。
在主程序中,调用landmark_detection()函数进行地标检测和定位。
这些示例代码可以帮助你使用MicroPython和OpenMV Cam进行视觉检测和定位。你可以根据实际需求选择适合的检测和定位算法,并在程序中执行相应的图像处理和分析任务。在运行代码之前,确保你已正确设置了OpenMV Cam的硬件和软件环境。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值