OpenMv学习总结

2023-05-16

入门阶段

简单来说,OpenMv就是一个可编程的摄像头,通过使用python语言,专门用作嵌入式当中的视觉感光元件。下面将介绍Openmv使用过程中的常用知识。

感光元件

感光元件即sensor模块,与摄像头有关。看如下例子:

import sensor#引入感光元件的模块
​
# 设置摄像头
sensor.reset()#初始化感光元件
sensor.set_pixformat(sensor.RGB565)#设置为彩色,用到其它参数时再上官方文档里找,下同
sensor.set_framesize(sensor.QVGA)#设置图像的大小
sensor.skip_frames()#跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。
​
# 一直拍照
while(True):
    img = sensor.snapshot()#拍摄一张照片,img为一个image对象

ROI区域

sensor.set_framesize(sensor.VGA) # 高分辨率
sensor.set_windowing((640, 80)) #取中间的640*80区域

获取/设置像素点

img = sensor.snapshot()
img.get_pixel(10,10)
img.set_pixcel(10,10,(255,0,0))#设置坐标(10,10)的像素点为红色(255,0,0)

图像的运算

  • image.invert() 图像取反
  • image.nand(image) 图像之间进行与非运算
  • image.nor(image) 图像之间进行或非运算
  • image.xor(image)图像之间进行异或运算
  • image.difference(image) 此函数通常用来做移动检测

画图

image.draw_line(line_tuple, color=White) 在图像中画一条直线,其中line_tuple的格式为(x0, y0, x1, y1),即从某点到某点的直线

image.draw_rectangle(rect_tuple, color=White) 在图像中画一个矩形框,其中rect_tuple 的格式是 (x, y, w, h)。

这里只举如上两个例子,其它的用到再去查即可。


各种外设的学习

添加自定义模块

OpenMv存在一个文件系统,根目录下有一个main.py,把你需要导入的自定义模块复制到根目录下即可。

操作LED

from pyb import LED
​
led = LED(1) # 红led
led.toggle()
led.on()#亮
led.off()#灭

操作IO口

from pyb import Pin
​
p_out = Pin('P7', Pin.OUT_PP)#设置p_out为输出引脚
p_out.high()#设置p_out引脚为高
p_out.low()#设置p_out引脚为低
p_in = Pin('P7', Pin.IN, Pin.PULL_UP)#设置p_in为输入引脚,并开启上拉电阻
value = p_in.value() # get value, 0 or 1#读入p_in引脚的值

可以看出,pyb模块里各种外设的操作和32类似,易上手。

控制舵机

from pyb import Servo
​
s1 = Servo(1) # servo on position 1 (P7)
s1.angle(45) # move to 45 degrees
s1.angle(-60, 1500) # move to -60 degrees in 1500ms
s1.speed(50) # for continuous rotation servos

具体需要用到哪个舵机还是需要参照原理图的结构。

定时器

from pyb import Timer
​
tim = Timer(4, freq=1000)
tim.counter() # get counter value
tim.freq(0.5) # 0.5 Hz
tim.callback(lambda t: pyb.LED(1).toggle())  //类似于32的回调函数

IO中断

from pyb import Pin, ExtInt
​
callback = lambda e: print("intr")
ext = ExtInt(Pin('P7'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)

PWM输出

from pyb import Pin, Timer
​
p = Pin('P7') # P7 has TIM4, CH1
tim = Timer(4, freq=1000)
ch = tim.channel(1, Timer.PWM, pin=p)
ch.pulse_width_percent(50)

UART

from pyb import UART

uart = UART(3, 9600)
uart.write('hello')
uart.read(5) # read up to 5 bytes

OpenMv之寻找色块
image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, 
merge=False, margin=0, threshold_cb=None, merge_cb=None)
  • Thresholds是你想识别的颜色的阙值,注意它是一个列表对象。
  • roi即你感兴趣的区域。
  • x_stride 就是查找的色块的x方向上最小宽度的像素,y_stride 就是查找的色块的y方向上最小宽度的像素,默认为2。
  • invert反转阙值。
  • area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉。
  • pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉。
  • merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
  • margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。

颜色阙值的结构

red = (minL, maxL, minA, maxA, minB, maxB)

但是OpenMv如此强大,在IDE工具栏里的Machine Vision中有阙值调试工具

BLOB色块对象

  • blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。
  • blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。
  • blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。
  • blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。
  • blob.h() 返回色块的外框的高度h(int),也可通过blob[3]来获取。
  • blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。
  • blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
  • blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。
  • blob.area() 返回色块的外框的面积。应该等于(w * h)

能看到这里的人真是不简单啊 !!!
最后一个!!!串口的使用

先来看如下一段代码:

在这里,我们用串口来不断发送blob数据,而寻找色块的过程跟opencv的思路相似,在前边也介绍过,只不过在openmv中更简便。

当用openmv的串口发送完数据后,接收端需要进行相应的解析才能得到想要的数据,前提是你需要知道发送数据的格式并撰写相应的函数。

学到这里,相信你对OpenMv已经掌握地差不多了,如果想更深入地进行学习,可以到它的官网里去看所有API的介绍。

~~~留赞的人今年心想事成

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMv学习总结 的相关文章

  • D435i标定摄像头和IMU笔记二(RGB摄像头标定篇)

    D435i标定摄像头和IMU教程二 xff08 RGB摄像头标定篇 xff09 一 文件准备二 录制摄像头标定rosbag三 开始标定四 标定结果 参考视频 D435i标定摄像头和IMU笔记一 xff08 配置环境篇 xff09 D435i
  • D435i标定摄像头和IMU笔记三(IMU标定篇)

    D435i标定摄像头和IMU笔记三 xff08 IMU标定篇 xff09 一 RealSense官网驱动标定IMUbias和三个轴的对齐1 1 驱动安装1 2 标定 二 港科大imu utils标定IMU随机游走2 1 环境及文件准备2 2
  • D435i标定摄像头和IMU笔记四(RGB摄像头和IMU联合标定篇)

    D435i标定摄像头和IMU教程四 xff08 RGB摄像头和IMU联合标定篇 xff09 一 前提二 准备标定文件 2 1 标定板yaml文件2 2 相机标定yaml文件2 3 imu标定yaml文件2 4 录制rosbag文件2 5 标
  • D435i标定摄像头和IMU笔记二-2(RGB+双目多摄像头标定篇)

    D435i标定摄像头和IMU笔记二 2 xff08 RGB 43 双目多摄像头标定篇 xff09 一 文件准备二 标定准备三 开始标定四 标定结果 参考视频 D435i标定摄像头和IMU笔记一 xff08 配置环境篇 xff09 D435i
  • D435i标定摄像头和IMU笔记四-2(双目摄像头与IMU联合标定篇)

    D435i标定摄像头和IMU笔记四 2 xff08 双目摄像头与IMU联合标定篇 xff09 一 前提二 文件准备2 1 标定板文件checkerboard yaml xff08 前面多次用到 xff09 xff1a 2 2 imu标定结果
  • px4+vins+ego单机鲁棒飞行一(px4+mavros篇)

    px4 43 vins 43 ego单机鲁棒飞行一 xff08 px4 43 mavros篇 xff09 一 mavors安装二 mavros中的重要插件Plugins三 mavros中的重要topic四 mavros中的tf树五 px4校
  • ardupilot在Linux上设置SITL(FlightGear)

    本页介绍如何在Linux上设置SITL xff08 软件在环路中 xff09 特定命令在Ubuntu上从12 10到16 04进行了测试 概观 SITL模拟器允许您在没有任何硬件的情况下运行Plane xff0c Copter或Rover
  • px4+vins+ego单机鲁棒飞行二(外部位姿估计篇)

    px4 43 vins 43 ego单机鲁棒飞行二 xff08 外部位姿估计篇 xff09 一 使用px4的EKF2 xff08 扩展卡尔曼 xff09 估计测试过程及结果 xff1a 二 使用px4的LPE估计测试过程及结果 xff1a
  • px4+vins+ego单机鲁棒飞行三(realsense_ros配置及经验篇)

    px4 43 vins 43 ego单机鲁棒飞行三 xff08 realsense ros配置及经验篇 xff09 一 驱动及realsense ros安装二 参数设置三 经验 一 驱动及realsense ros安装 D435i标定摄像头
  • px4+vins+ego单机鲁棒飞行四(PX4飞控日志分析篇)

    px4 43 vins 43 ego单机鲁棒飞行四 xff08 PX4飞控日志分析篇 xff09 一 FlightPlot安装二 记录日志二 取出日志三 分析日志 一 FlightPlot安装 参考博客 参考视频 二 记录日志 在QGC中参
  • px4+vins+ego单机鲁棒飞行二-1(更改px4外部视觉估计固件)

    px4 43 vins 43 ego单机鲁棒飞行二 1 xff08 更改px4外部视觉估计固件 xff09 一 EKF2源码 获取视觉里程计信息二 EKF2源码 设置外部视觉数据三 源码中对位置的发送四 测试 前提 xff1a 固件1 11
  • px4+vins+ego单机鲁棒飞行五(坐标系变换篇)

    px4 43 vins 43 ego单机鲁棒飞行五 xff08 坐标系变换篇 xff09 一 齐次矩阵变换原理二 无人机上利用旋转矩阵求飞机中心位置 一 齐次矩阵变换原理 参考一 参考二 二 无人机上利用旋转矩阵求飞机中心位置 首先写出相机
  • 编译多版本opencv,并在cmakelists中链接

    编译多版本opencv xff0c 并在cmakelists中链接 一 下载二 编译三 链接四 替代系统的 xff08 可选 xff0c 但不建议 xff09 五 链接了 xff0c 但无法找到 一 下载 github链接 自己选择版本 x
  • CMakeLists笔记

    CMakeLists笔记 一 路径名二 函数三 常用 一 路径名 PROJECT SOURCE DIR xff1a 一般为catkin ws src xff0c 是cmakelists的绝对路径PROJECT BINARY DIR xff1
  • 源码编译安装openvino

    源码编译安装openvino 1 原地升级cmake2 编译opencv4 5 33 下载openvino4 配置usb规则 参考博客 交叉编译方式 1 原地升级cmake 方法一 xff1a 下载3 19 0中的CMake 3 19 0
  • 【ros】读取串口数据

    文章目录 一 自定义 gnrmc msg二 代码三 结果四 注意点 有时候 有的设备是通过串口发送数据 xff0c 想要在 ros 中 xff0c 读取串口数据 xff0c 记录一下操作 xff1a 一 自定义 gnrmc msg 首先需要
  • Android守护进程

    守护进程 守护进程 一直在后台运行的进程 本文主要讲解一些android比较常用的守护进程的方法 实现思想 1 保活 xff0c 通过提高进程优先级 xff0c 降低进程被杀死的概率 2 拉起 xff0c 进程被杀死后 xff0c 进行拉起
  • ros package 由于依赖 msg 导致编译问题解决

    文章目录 1 问题2 解决 1 问题 经常我们会自定义一些 msg 给其他的 package 使用 如果正常写 CmakeLists txt 在编译的时候 就会提示没有找到依赖的 msg 需要先编译 msg 的 package 再编译其他的
  • 使用Docker部署软件运行环境

    什么是docker xff1f Docker是基于Go语言进行开发实现 xff0c 一个开源的应用容器引擎 采用Linux内核的cgroup xff0c namespace xff0c 以及AUFS类的Union FS等技术 xff0c 对
  • 【控制control】四足机器人运动学、动力学模型

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 四足机器人实际模型的物理难点二 四足机器人运动学模型1 方法一 xff1a DH法建

随机推荐

  • 【项目解读】fast_planner工程解读

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 规划系统运行逻辑 业务部分 1 Fast planner node cpp 程序入口
  • IMU方向位姿估计

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 方法一 xff1a IMU方向位姿可以直接从IMU本身提供的专有算法中获得 xff0
  • 【autoware的仿真平台】

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 仿真的必要性及常见的仿真工具介绍二 gazebo仿真插件介绍及源码解析1 gazeb
  • 【机械臂、无人机规控篇】(8)机械臂轨迹规划、跟踪控制方向

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 机械臂的规划控制和无人的规划控制的异同点分析1 规划的异同分析2 控制的异同分析 二
  • 微信支付——支付签名验证失败的坑

    只讲几个微信支付开发中的签名问题 xff08 JAVA版的公众号支付 xff09 第一个是获取订单数据时生成 xff0c 然后通过这些数据生成预支付订单 xff08 通过 统一下单 方法取得 xff09 xff0c 微信官方返回一串xml数
  • c++的多重继承

    一 前言 每个类只继承一个父辈 xff0c 在现实世界中事情通常是这样的 xff0c 但是有一些类却代表两个类的合成 例如两用沙发 xff0c 它是一张床 xff0c 也是一个沙发 二 示例代码 xff0c 用作下面提出问题使用 span
  • 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据

    由于个人应用到3轴传感器 xff0c 所以买了直接买了一个9轴的 xff0c 用于学习STM32Core平台串口2连接维特智能串口Normal协议 xff0c 然后通过串口1直接打印数据 xff0c 接收传感器数据和与传感器进行通信 xff
  • 用遗传算法求解旅行商问题

    以下是用遗传算法解决旅行商问题的实验报告 1 问题描述 旅行商问题 xff08 Travelling Salesman Problem 简记TSP xff0c 亦称货郎担问题 xff1a 设有n个城市和距离矩阵D 61 dij xff0c
  • 学习LLC谐振变换电路的工作原理

    五 学习LLC谐振变换电路的工作原理 在具有电阻R 电感L和电容C元件的交流电路中 xff0c 电路两端的电压与其中电流相位一般是不同的 如果调节电路元件 xff08 L或C xff09 的参数或电源频率 xff0c 可以使它们相位相同 x
  • 关于电赛应该了解的事

    2021年1月31日 xff0c 全国大学生电子设计竞赛组委会向各赛区组委会 各有关高校下发 关于组织2021年全国大学生电子设计竞赛的通知 xff0c 正式启动2021年全国竞赛组织工作 电赛越来越近 xff0c 很多大一大二的同学还没有
  • stm32的基本学习路径---新手指南

    心得 xff1a 本人学习STM32的时候有一些跟风的因素 xff0c 自以为学的芯片越多就越厉害 61 61 其实 xff0c 学习嵌入式重要的是整体的工程思想和项目经验积累 xff0c 说到底这些芯片 xff0c 我感觉学习起来都差不多
  • 初学stm32建议的---实用开发板推荐

    STM32编程作为一项实操性很强的技能 xff0c 所以要多实操 初学的话 xff0c 我觉得书籍就暂时先不买吧 xff0c 先考虑入手一块STM32开发板 xff0c 然后跟着开发板的教程走 几年前 xff0c 做STM32的教程有很多家
  • 嵌入式操作系统-ucos是什么?

    一句话概括ucos系统 xff1a 一款源代码开放的 xff0c 抢占式多任务实时操作系统 其在整个嵌入式产品的架构中的角色和主要功能代码如下图所示 xff1a ucos 系统建立了用户程序和底层硬件之间沟通的渠道 通过ucos系统的管理和
  • 自学stm32,需要会到什么程度能找到一份工作?

    我是从大一就开始接触单片机 xff0c 学过很多类型的单片机 从最简单的51单片机 xff08 stc xff0c atmel intel等类型都用过 xff09 到国内现在最火的stm32 xff08 推荐正点原子 xff0c 后期很多项
  • 学习STM32的寄存器版本好还是库函数版本好

    我个人认为 xff0c 在回答这个问题之前 xff0c 你得先问清楚自己 xff0c 我学习stm32 或者再往更深的地方走 xff0c 我学习单片机 xff0c 究竟是为了什么 xff1f 你现在是处于什么状态 xff1f 你是学生还是已
  • proteus 8 打开proteus 7版本仿真文件的两个方法

    Proteus版本一直在更新 xff0c 其中常见的大版本Proteus 7 和Proteus 8兼容是有问题的 xff0c Proteus是向上兼容的 xff0c 高版本可以打开低版本的仿真 xff0c 低版本打不开高版本的 Proteu
  • stm32 单片机主要优点有哪些?

    51单片机之所以成为经典 xff0c 成为易上手的单片机主要有以下特点 xff1a 特性 xff1a 1 从内部的硬件到软件有一套完整的按位操作系统 xff0c 称作位处理器 xff0c 处理对象不是字或字节而是位 不但能对片内某些特殊功能
  • openmv入门之路

    如果你发现OpenCV函数繁多 xff01 xff01 xff01 如果你发现OpenCV配置繁琐 xff01 xff01 xff01 如果你发现自己买不起miniPC xff01 xff01 xff01 请选择OpenMV来完成你的项目吧
  • GMM(高斯混合模型)的动态背景分割

    以下是GMM xff08 高斯混合模型 xff09 的动态背景分割的实验报告以及源码 xff0c 另外用到了形态学操作与多通道的处理 xff0c 提升了实验结果的性能 一 实验名称 基于混合高斯模型的动态背景分割 二 实验目的 探索如何对W
  • OpenMv学习总结

    入门阶段 简单来说 xff0c OpenMv就是一个可编程的摄像头 xff0c 通过使用python语言 xff0c 专门用作嵌入式当中的视觉感光元件 下面将介绍Openmv使用过程中的常用知识 感光元件 感光元件即sensor模块 xff