OpenMV——色块追踪

Python知识:

1.给Python的列表赋值:

定义一个元组时就是 元组a = (1,2,…)
元组中可以只有一个元素,但是就必须要加一个 “ , ”
如 a = (2,)

而列表的定义和元组类似,只是把()换成[]:

#那么下面的colour_1 ~ 3属于元组,只能进行一次赋值就是初始化的时候,之后不允许修改
colour_1 = (51, 17, -4, -65, 45, -53)
cplour_2 = (51, 17, -4, -65, 41, -51)
cplour_3 = (2, 17, -4, -65, 41, -51)
#而thresholds是一个列表,这时候这个列表就有了三个颜色的阈值信息,与元组不同列表后续能够进行添加和删除
thresholds = [cplour_1,cplour_2,cplour_3]

thresholds = [cplour_1,cplour_2]

阈值:

一个颜色的阈值是这样的:
red = (minL, maxL, minA, maxA, minB, maxB)

阈值选择工具:

下面是官方手册的内容:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

find_blobs函数:

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)

函数参数介绍(来自星瞳科技官方手册):
注意:
1.上面给的是函数的声明,参数从x_stride 到 merge_cb都是默认参数,如果不进行更改,实参的值就是上面的默认值,使用时最基本的就是传入一个颜色阈值赋值给普通形参thresholds,thresholds是一个列表,如果你只给他一个颜色的阈值他就只返回一个颜色的色块信息,如果你给他传入一个包含多个颜色的阈值元组,他就能识别多个颜色并返回对应列表中的颜色的色块信息。
2.ROI=Auto在图像处理或机器视觉的上下文中,通常表示感兴趣区域(Region of Interest, ROI)被设置为自动选择或自动检测。这里的“Auto”意味着不需要手动指定ROI的具体位置(如左上角的坐标、宽度和高度),而是由算法或软件自动根据一定的规则或条件来确定ROI。 但是注意在传入实参时并不能出现 roi = Auto
例如:

blobs = img1.find_blobs([red],roi = auto)
#只能
blobs = img1.find_blobs([red],)
#或者
blobs = img1.find_blobs([red],roi = (1123))

#然后列表[red] 与 (1,1,2,3)将会被作为实参分别传给thresholds与roi,其他参数就会被赋默认值,如果不传(1,1,2,3),那么roi会被OpenMV自己设置的方法进行赋值

在这里插入图片描述

find_blobs函数返回值:

来自星瞳科技官方手册

  1. find_blobs函数根据传入的颜色列表thresholds,然后对保存在一帧照片数据的图像对象img进行查找,

  2. 如果查找到颜色列表thresholds = [colour_1,colour_2,colour_3]中的colour_1颜色的色块就会返回该色块的信息给列表blobs,

  3. 那么检测到三个色块,那么列表blobs就会有三个元素
    如:blobs = [blob_1,blob_2,blob_3],然后每个元素blob就会包含色块的信息(x坐标,中心坐标,色块的矩形的大小等等)

有了色块信息之后:

来自星瞳科技官方手册

根据色块信息进行色块追踪:

举例:
在这里插入图片描述

import sensor#引入感光元件的模块

# 设置摄像头
sensor.reset()#初始化感光元件
sensor.set_pixformat(sensor.RGB565)#设置为彩色
sensor.set_framesize(sensor.QVGA)#设置图像的大小
sensor.skip_frames(n = 10)#跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
green = (51, 17, -4, -65, 45, -53)
# 一直拍照
while(True):
    img1 = sensor.snapshot()#拍摄一张照片,img为一个image对象
    blobs = img1.find_blobs([green])
    for blob in blobs:
        print(blob.cx())
        rect_tuple = blob.rect()
        img1.draw_rectangle(rect_tuple, color=(255,0,0))
  1. 我通过阈值选择工具获取到一个颜色阈值green = (51, 17, -4, -65, 45, -53)

  2. 然后拍了一帧照片并将该照片的信息赋值给img1 = sensor.snapshot()#拍摄一张照片,img为一个image对象

  3. 然后对img1照片进行色块寻找,要寻找的色块的颜色阈值就是thresholds = [red],我只传入了一个颜色阈值也可以传入多个thresholds = [red,blue,green],

  4. 然后find_blobs函数就在这一帧照片img1中查找是否出现颜色列表thresholds中的元素的颜色,如果出现将出现的色块的信息返回赋值给列表blobs,如果一帧图片中出现三个色块,那么列表blobs就会有三个元素,分别代表那三个色块的信息

  5. 而通过for循环,blob会依次赋三个色块的值,第一次循环就是色块1

  6. 然后对blob使用.rect方法,返回色块1的外框——矩形元组(x, y, w, h)并赋值给rect元组rect_tuple = blob.rect()

  7. img1.draw_rectangle(rect_tuple, color=(255,0,0)),然后在图像数据img1中使用.draw_rectangle的方法,在img1中根据矩形元组(x, y, w, h)和颜色color=(255,0,0)画出一个红色的矩形框

注意:
IDE中的帧缓冲区是缓冲拍到的帧图像,如果只拍了一次那就只有一帧图像,如果一直拍,那么前一帧的图像就会被新拍的覆盖,所以其实是在前一帧的照片上画出色块,然后才显示下一帧,但是如果你只拍1帧又很难识别到色块,我拍10帧就会有帧缓冲区显示我程序中要画的矩形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无极帝国C++工程师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值