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 = (1,1,2,3))
#然后列表[red] 与 (1,1,2,3)将会被作为实参分别传给thresholds与roi,其他参数就会被赋默认值,如果不传(1,1,2,3),那么roi会被OpenMV自己设置的方法进行赋值
find_blobs函数返回值:
-
find_blobs函数根据传入的颜色列表thresholds,然后对保存在一帧照片数据的图像对象img进行查找,
-
如果查找到颜色列表thresholds = [colour_1,colour_2,colour_3]中的colour_1颜色的色块就会返回该色块的信息给列表blobs,
-
那么检测到三个色块,那么列表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))
-
我通过阈值选择工具获取到一个颜色阈值green = (51, 17, -4, -65, 45, -53)
-
然后拍了一帧照片并将该照片的信息赋值给img1 = sensor.snapshot()#拍摄一张照片,img为一个image对象
-
然后对img1照片进行色块寻找,要寻找的色块的颜色阈值就是thresholds = [red],我只传入了一个颜色阈值也可以传入多个thresholds = [red,blue,green],
-
然后find_blobs函数就在这一帧照片img1中查找是否出现颜色列表thresholds中的元素的颜色,如果出现将出现的色块的信息返回赋值给列表blobs,如果一帧图片中出现三个色块,那么列表blobs就会有三个元素,分别代表那三个色块的信息
-
而通过for循环,blob会依次赋三个色块的值,第一次循环就是色块1
-
然后对blob使用.rect方法,返回色块1的外框——矩形元组(x, y, w, h)并赋值给rect元组rect_tuple = blob.rect()
-
img1.draw_rectangle(rect_tuple, color=(255,0,0)),然后在图像数据img1中使用.draw_rectangle的方法,在img1中根据矩形元组(x, y, w, h)和颜色color=(255,0,0)画出一个红色的矩形框
注意:
IDE中的帧缓冲区是缓冲拍到的帧图像,如果只拍了一次那就只有一帧图像,如果一直拍,那么前一帧的图像就会被新拍的覆盖,所以其实是在前一帧的照片上画出色块,然后才显示下一帧,但是如果你只拍1帧又很难识别到色块,我拍10帧就会有帧缓冲区显示我程序中要画的矩形