【雕爷学编程】MicroPython手册之 OpenMV Cam LCD显示

在这里插入图片描述
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可以通过LCD显示屏来实现图像显示和用户界面交互。下面我将详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

显示图像:OpenMV Cam的LCD显示功能可以将图像数据实时显示在LCD屏幕上。这使得用户可以直观地观察到图像处理和计算机视觉算法的结果。

用户界面交互:通过LCD显示屏,OpenMV Cam可以提供用户界面交互的能力。用户可以通过按键、触摸屏等方式与设备进行交互,进行参数设置、模式选择等操作。

多种显示模式:LCD显示功能通常支持多种显示模式,如单色、彩色、灰度等。可以根据具体需求选择合适的显示模式,以满足不同的应用需求。

应用场景:

图像处理和计算机视觉:OpenMV Cam广泛应用于图像处理和计算机视觉领域。通过LCD显示屏,可以实时显示图像处理算法的结果,如边缘检测、目标跟踪、物体识别等。

实时监控和调试:LCD显示屏可以用于实时监控和调试系统。通过显示实时图像或相关信息,可以方便地观察系统状态、调试代码逻辑和参数设置。

用户界面显示:通过LCD显示屏,可以提供友好的用户界面显示。例如,在嵌入式系统中,可以通过显示菜单、按钮等界面元素实现用户操作和反馈。

需要注意的事项:

显示分辨率和尺寸:在选择LCD显示屏时,需要考虑其分辨率和尺寸是否适合具体应用需求。较高的分辨率和较大的尺寸可以提供更好的显示效果,但也需要更多的系统资源和功耗。

显示速度和刷新率:LCD显示的速度和刷新率会影响图像的流畅度和实时性。在设计和编写代码时,需要合理控制显示速度,以确保图像显示的实时性和稳定性。

显示接口和驱动:在使用LCD显示功能时,需要了解和选择合适的显示接口和驱动程序。确保OpenMV Cam能够正确连接和驱动LCD显示屏,以实现正常的显示功能。

能耗和资源管理:LCD显示功能通常需要较多的系统资源和功耗。在使用过程中,需要合理管理系统资源和电源,以避免过度消耗资源和能耗。

总结来说,MicroPython的OpenMV Cam通过LCD显示屏实现图像显示和用户界面交互。它在图像处理和计算机视觉、实时监控和调试、用户界面显示等应用场景中发挥重要作用。在使用时,需要注意显示分辨率和尺寸、显示速度和刷新率、显示接口和驱动、以及能耗和资源管理等方面的事项,以确保显示效果的质量和系统的稳定性。

案例一:显示摄像头捕获的图像

import sensor, image, time

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

while(True):
    img = sensor.snapshot() # 捕获一帧图像
    lcd.display(img) # 在LCD上显示图像
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序首先导入了sensor、image和time模块。然后初始化摄像头,设置像素格式为RGB565,帧大小为320x240,并等待设置生效。在while循环中,不断捕获摄像头的图像并在LCD上显示,每次显示后延时100毫秒。

案例二:实现摄像头的自动对焦功能

import sensor, image, time

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

focus_state = False # 焦点状态,初始值为False

while(True):
    img = sensor.snapshot() # 捕获一帧图像
    focus_value = img.find_blobs([(0, 255)], area_threshold = 100, pixels_threshold = 100, merge=True) # 寻找红色斑点
    
    if focus_value: # 如果找到红色斑点
        focus_state = not focus_state # 切换焦点状态
        lcd.display("Focus: {}".format(focus_state)) # 在LCD上显示焦点状态
    else:
        lcd.display("No focus") # 如果没有找到红色斑点,显示"No focus"
    
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序同样导入了sensor、image和time模块。初始化摄像头后,设置像素格式为RGB565,帧大小为320x240,并等待设置生效。在while循环中,不断捕获摄像头的图像并寻找红色斑点。如果找到红色斑点,切换焦点状态并在LCD上显示;如果没有找到红色斑点,显示"No focus"。每次显示后延时100毫秒。

案例三:实现摄像头的水平翻转功能

import sensor, image, time

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

flip_state = False # 水平翻转状态,初始值为False

while(True):
    img = sensor.snapshot() # 捕获一帧图像
    flip_value = img.width > img.height # 判断是否为横向照片
    
    if flip_value != flip_state: # 如果当前照片方向与上次拍照方向不同
        flip_state = not flip_state # 切换水平翻转状态
        lcd.display("Flip: {}".format(flip_state)) # 在LCD上显示水平翻转状态
    else:
        lcd.display("No flip") # 如果照片方向与上次拍照方向相同,显示"No flip"
    
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序同样导入了sensor、image和time模块。初始化摄像头后,设置像素格式为RGB565,帧大小为320x240,并等待设置生效。在while循环中,不断捕获摄像头的图像并判断照片方向。如果照片方向与上次拍照方向不同,切换水平翻转状态并在LCD上显示;如果照片方向与上次拍照方向相同,显示"No flip"。每次显示后延时100毫秒。

案例四:显示图像:

import sensor
import lcd

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

lcd.init()
lcd.rotation(2)

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

要点解读:
该程序使用OpenMV Cam的LCD显示功能来实时显示摄像头捕获的图像。
使用sensor.reset()重置摄像头传感器。
使用sensor.set_pixformat()设置图像像素格式为RGB565。
使用sensor.set_framesize()设置图像帧大小为QVGA(320x240)。
使用sensor.run(1)启动摄像头。
使用lcd.init()初始化LCD显示。
使用lcd.rotation(2)设置LCD显示旋转角度。
使用sensor.snapshot()捕获图像并将其存储在img变量中。
使用lcd.display()在LCD上显示捕获的图像。
在一个无限循环中,使程序持续捕获和显示图像。

案例5:显示文本信息:

import lcd

lcd.init()
lcd.rotation(2)
lcd.clear()

while True:
    lcd.draw_string(10, 10, "Hello, World!", lcd.WHITE, lcd.BLACK)

要点解读:
该程序使用OpenMV Cam的LCD显示功能,在LCD屏幕上显示文本信息。
使用lcd.init()初始化LCD显示。
使用lcd.rotation(2)设置LCD显示旋转角度。
使用lcd.clear()清空LCD屏幕上的内容。
在一个无限循环中,使程序持续执行以下操作:
使用lcd.draw_string()在LCD屏幕上绘制文本。
参数依次为文本的位置(x,y坐标)、文本内容、前景色(文本颜色)、背景色。
在本例中,将字符串"Hello, World!"绘制在LCD屏幕上的位置(10, 10),使用白色文本颜色和黑色背景色。

案例6:显示传感器数据:

import sensor
import lcd

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

lcd.init()
lcd.rotation(2)
lcd.clear()

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

    temp = sensor.temperature()
    lcd.draw_string(10, 10, "Temperature: {} C".format(temp), lcd.WHITE, lcd.BLACK)

要点解读:
该程序使用OpenMV Cam的LCD显示功能,在LCD屏幕上显示摄像头捕获的图像和温度传感器的数据。
使用sensor.reset()重置摄像头传感器。
使用sensor.set_pixformat()设置图像像素格式为RGB565。
使用sensor.set_framesize()设置图像帧大小为QVGA(320x240)。
使用sensor.run(1)启动摄像头。
使用lcd.init()初始化LCD显示。
使用lcd.rotation(2)设置LCD显示旋转角度。
使用lcd.clear()清空LCD屏幕上的内容。
在一个无限循环中,使程序持续执行以下操作:
使用sensor.snapshot()捕获图像并将其存储在img变量中。
使用lcd.display()在LCD屏幕上显示捕获的图像。
使用sensor.temperature()读取温度传感器的数据。
使用lcd.draw_string()在LCD屏幕上绘制温度信息。
在本例中,将温度信息绘制在LCD屏幕上的位置(10, 10)。
这些实际运用程序示例展示了如何使用MicroPython和OpenMV Cam的LCD显示功能。第一个示例展示了实时显示摄像头图像。第二个示例展示了在LCD上显示文本信息。第三个示例展示了如何将摄像头图像和传感器数据同时显示在LCD上。这些示例可以帮助您理解如何利用LCD显示功能来实现各种应用,例如图像处理、数据可视化和传感器监测等。根据您的具体需求,您可以根据这些示例进行修改和扩展,以实现更复杂的功能和应用。

案例七:一个案例是使用OpenMV Cam来实现人脸识别,并在LCD显示屏上显示识别结果。代码如下:

# 导入相关模块
import sensor, time, image, lcd

# 初始化摄像头和LCD
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
lcd.init()

# 加载人脸检测的级联分类器
face_cascade = image.HaarCascade("frontalface", stages=25)

# 循环检测人脸并在LCD上显示
while (True):
    # 捕获一帧图像
    img = sensor.snapshot()
    # 在图像上检测人脸
    objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25)
    # 画出检测到的人脸区域
    for r in objects:
        img.draw_rectangle(r)
    # 在LCD上显示图像
    lcd.display(img)

要点解读:
该代码使用了sensor模块来控制摄像头,image模块来处理图像,lcd模块来驱动LCD显示屏。
该代码使用了image.HaarCascade类来加载一个预训练的人脸检测的级联分类器,该分类器可以在图像上找到人脸的特征。
该代码使用了image.find_features方法来在图像上应用分类器,并返回一个包含检测到的人脸区域的列表。
该代码使用了image.draw_rectangle方法来在图像上画出检测到的人脸区域,以便于可视化。
该代码使用了lcd.display方法来在LCD显示屏上显示图像,从而实现人脸识别的功能。

案例八:另一个案例是使用OpenMV Cam来实现二维码扫描,并在LCD显示屏上显示扫描结果。代码如下:

# 导入相关模块
import sensor, image, time, lcd

# 初始化摄像头和LCD
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
lcd.init()

# 循环扫描二维码并在LCD上显示
while(True):
    # 捕获一帧图像
    img = sensor.snapshot()
    # 在图像上扫描二维码
    res = img.find_qrcodes()
    # 如果扫描到二维码,就在LCD上显示其内容
    if len(res) > 0:
        lcd.clear()
        lcd.draw_string(10,10,res[0].payload())
        lcd.display(img)
        time.sleep(2000)
        lcd.clear()
    else:
        # 如果没有扫描到二维码,就在LCD上显示"No QRCode"
        lcd.clear()
        lcd.draw_string(10,10,"No QRCode")
        lcd.display(img)

要点解读:
该代码使用了image.find_qrcodes方法来在图像上扫描二维码,并返回一个包含扫描到的二维码对象的列表。
每个二维码对象都有一个payload属性,表示其内容。
该代码使用了lcd.draw_string方法来在LCD显示屏上显示文本,例如二维码的内容或"No QRCode"。
该代码使用了lcd.clear方法来清除LCD显示屏上的内容,以便于更新。

案例九:是使用OpenMV Cam来实现颜色追踪,并在LCD显示屏上显示追踪结果。代码如下:

# 导入相关模块
import sensor, image, time, lcd

# 定义一个颜色阈值,表示要追踪的颜色范围
# 这里是红色的阈值,可以根据需要修改
red_threshold = (0, 100, 43, 127, -25, 127)

# 初始化摄像头和LCD
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
lcd.init()

# 循环追踪颜色并在LCD上显示
while(True):
    # 捕获一帧图像
    img = sensor.snapshot()
    # 在图像上找到符合颜色阈值的区域
    blobs = img.find_blobs([red_threshold])
    # 如果找到了符合颜色阈值的区域,就在LCD上显示其位置和大小
    if blobs:
        for b in blobs:
            # 画出区域的边界框
            img.draw_rectangle(b[0:4])
            # 画出区域的中心点
            img.draw_cross(b[5], b[6])
            # 在LCD上显示区域的位置和大小
            lcd.clear()
            lcd.draw_string(10,10,"x:%d y:%d w:%d h:%d"%(b[0],b[1],b[2],b[3]))
            lcd.display(img)
    else:
        # 如果没有找到符合颜色阈值的区域,就在LCD上显示"No color"
        lcd.clear()
        lcd.draw_string(10,10,"No color")
        lcd.display(img)

要点解读:
该代码使用了image.find_blobs方法来在图像上找到符合颜色阈值的区域,并返回一个包含区域信息的列表。
每个区域信息都是一个元组,包含了区域的位置、大小、中心点等数据。
该代码使用了image.draw_rectangle和image.draw_cross方法来在图像上画出区域的边界框和中心点,以便于可视化。
该代码使用了lcd.draw_string方法来在LCD显示屏上显示区域的位置和大小,例如"x:10 y:20 w:30 h:40"。

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

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值