OPENMV笔记(还在更

本文详细介绍了如何在OpenMV中进行图像处理,包括感光模块设置、图像参数获取修改、统计信息计算、绘图功能、色块检测、以及操控外设如LED、IO口、定时器和UART等。此外,还涉及了如何使用中断和PWM功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

库函数查找:https://docs.singtown.com/micropython/zh/latest/openmvcam/library/index.html

一、OPENMV图像处理的方法

感光模块

在使用OPENMV之前,我们需要对其进行一些初始化设定,其中感光模块是必不可少的

 ①导入对应库

import sensor

②感光模块初始化

sensor.reset()

③对拍摄图像进行一些设定

#图像颜色设定
sensor.set_pixformat(sensor.GRAYSCALE/sensor.RGB565)#分别对应灰度图像和彩色图像
#图像分辨率设定
sensor.set_framesize(sensor.parameter)#这里参数有很多,具体去官网看,一般用QVGA
#跳帧设定
sensor.skip_frames(n=x)#x为跳过的帧数,也就是跳过的图片数
#设置窗口ROI
sensor.set_windowing(roi)#roi是矩形区域元组 (x, y, w, h).可以只传递(w,h)而roi 将会在图像中居中。注意:在设置ROI区域前应设置好相机分辨率。
#翻转设置
sensor.set_hmirror(True)#水平方向翻转
sensor.set_vflip(True)#垂直方向翻转

二、图像相关

①图像参数的获取和修改

#获取对应点像素值
image.get_pixel(x,y)
#修改对应点的像素值
image.set_pixal(x,y,pixel)#对于灰度图只要设置灰度值,对于彩色图则应设置对应图像的(r,g,b)三个值
#图像高度宽度等参数的获取
image.width()
image.height()
image.format()#色度值
image.size()

②统计信息的使用

统计信息一般用于统计一个区域块内的平均值或者最大值

#统计信息的利用
image.get_statistics(roi=Auto)
image.get_statistics(roi=(x,y,w,h))
#获取统计信息的函数的一些补充

statistics.mean()返回灰度的平均数(0-255) (int)

statistics.median() 返回灰度的中位数(0-255) (int)

statistics.mode() 返回灰度的众数(0-255) (int)

statistics.stdev() 返回灰度的标准差(0-255) (int)

statistics.min() 返回灰度的最小值(0-255) (int)

statistics.max() 返回灰度的最大值(0-255) (int)

statistics.lq() 返回灰度的第一四分数(0-255) (int)

statistics.uq() 返回灰度的第三四分数(0-255) (int)


上面是有关灰度值的一些补充,接下来的是lab通道

l_mean,l_median,l_mode,l_stdev,l_min,l_max,l_lq,l_uq,

a_mean,a_median,a_mode,a_stdev,a_min,a_max,a_lq,a_uq,

b_mean,b_median,b_mode,b_stdev,b_min,b_max,b_lq,b_uq,

是LAB三个通道的平均数,中位数,众数,标准差,最小值,最大值,第一四分数,第三四分数。

③画图

#画线
image.draw_line((x0,y0,x1,y1), color=White)#画条从(x0,y0)到(x1,y1)的线,默认颜色为白色,也可以用rgb通道或者灰度值来设置画的颜色吗,之后同理。
#画矩形框
image.draw_rectangle((x,y,w,h), color=White)#从(x,y)点开始画长为w,宽为h的矩形框。
#画圆
image.draw_circle(x, y, radius, color=White)#(x,y)为圆心坐标,r为半径
#画十字
image.draw_cross(x, y, size=5, color=White)#(x,y)为中心坐标,size为长度单位
#写字
image.draw_string(x, y, text, color=White)#x,y是坐标。使用\n,\r和\r,\n,会使光标移动到下一行。

④寻找色块

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为颜色的阈值,是一个列表,可以传入多个颜色阈值。示例代码如下:

thresholds=[(xx,xx,xx,xx,xx,xx),
            (xx,xx,xx,xx,xx,xx),
            (xx,xx,xx,xx,xx,xx)]

img=sensor.snapshot()
red_blobs = img.find_blobs([red])

color_blobs = img.find_blobs([red,blue, yellow])

 在代码中可以看出:对于thresholds变量我们传入了三个颜色阈值,以识别三个颜色;当然也可以传入一个阈值以识别一个颜色

roi就是自己框选的感兴趣区

x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你想查找宽度10个像素以上的色块,那么就设置这个参数为10

y_stride同理

invert 反转阈值,把阈值以外的颜色作为阈值进行查找。

area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤

pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤

merge 合并,如果设置为True,那么合并所有重叠的blob为一个

对于阈值有更详细的解释:

阈值 = (minL, maxL, minA, maxA, minB, maxB)

用到了LAB色域,其中min和max分别对应LAB三个色域的最大&最小值

在工具里面有阈值编辑器(threshold editor),使用时拖动LAB使我们要的颜色变为白色,不要的颜色变为黑色

但是通常来说可以直接框选一个颜色,在IDE的右侧看到LAB三个通道的色值分布,直接看分布取最大值和最小值即可

返回值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.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过blob[7]来获取。

blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:

blobs = img.find_blobs([red, blue, yellow], merge=True)

如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。

blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。

blob.area() 返回色块的外框的面积。应该等于(w * h)

blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。
比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。

⑤April标记跟踪功能

不常用 以后写

⑥模板匹配功能

没SD卡 可以用机器学习代替 以后写

三、操控OPENMV的外设

openmv的外设完全基于pyb库中的函数来操作,所以在使用openmv的外设前应写导入库

from pyb import 对应外设库

①LED

from pyb import LED
#定义LED名称
led1=LED(1)#红色
led2=LED(2)#绿色
led3=LED(3)黄色
led1.toggle()#翻转LED1的电平
led1.on()#点亮LED1
led2.off()#点亮LED2

②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引脚的值

在这里将P7口作为了输入引脚,并且开启上拉电阻。用value变量来保存P7口的电平值,当按钮按下时为0,未按下时为1,如此一来P7口便可连接开关作为开关来使用了。

③Servo控制舵机

暂时用不到 等用到了再写

④IO口中断

# 导入模块
from pyb import Pin, ExtInt

# 定义回调函数,当外部中断触发时执行的操作
#lambda e是Python中的一个lambda表达式,用于创建匿名函数。在这里,lambda e创建了一个以参数e为输入的匿名函数。在这个例子中,该匿名函数被用作外部中断的回调函数,即当外部中断触发时执行的操作。
callback = lambda e: print("intr")

# 创建外部中断对象
# 参数1:指定外部中断的引脚,这里使用引脚'P7'
# 参数2:指定触发方式,这里是上升沿触发→RISING;下降沿→FALLING
# 参数3:指定是否启用上拉或下拉电阻,这里不启用
# 参数4:指定触发时调用的回调函数
ext = ExtInt(Pin('P7'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)

⑤定时器

每个计时器都包含一个以特定速率递增的计数器。它的计数速率是外设时钟频率(以 Hz 为单位)除以定时器预分频器。当计数器达到定时器周期时,它会触发一个事件,并且计数器会重置回零。通过使用回调方法,定时器事件可以调用 Python 函数。

from pyb import Timer,LED

#使用定时器4
tim = Timer(4)

#初始化定时器4
tim.init(freq=1,prescale=1,period=5)

# 设置定时器的回调函数,当定时器触发时切换LED状态
tim.callback(lambda t: pyb.LED(1).toggle())

定时器对应channel输出引脚:

Timer 1 Channel 3 Negative -> P0
Timer 1 Channel 2 Negative -> P1
Timer 1 Channel 1 Negative -> P2
Timer 2 Channel 3 Positive -> P4
Timer 2 Channel 4 Positive -> P5
Timer 2 Channel 1 Positive -> P6
Timer 4 Channel 1 Negative -> P7
Timer 4 Channel 2 Negative -> P8

⑥PWM

from pyb import Pin, Timer

# 初始化引脚P7
p = Pin('P7')  # P7 对应 TIM4,CH1

# 创建定时器对象,使用定时器4,设置频率为1000Hz,也就是PWM波的频率
tim = Timer(4, freq=1000)

#通道1,使用PWM模式,输出引脚为P7
ch = tim.channel(1, Timer.PWM, pin=p)

# 设置PWM的占空比为50%
ch.pulse_width_percent(50)

⑦ADC/DAC

先不写,在这里没什么用

⑧UART

from pyb import UART

# 初始化UART对象,使用UART3,波特率为9600
uart = UART(3, 9600)

# 发送字符串 'hello'
uart.write('hello')

# 读取最多5个字节的数据
uart.read(5)

⑨SPI/I2C

以后写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

锟0409

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

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

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

打赏作者

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

抵扣说明:

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

余额充值