openmv4系列7

您所在的位置:网站首页 找不同色块图 openmv4系列7

openmv4系列7

2024-07-16 05:23| 来源: 网络整理| 查看: 265

openmv4系列7----寻找色块

1、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)

参数解释:

thresholds是颜色的阈值,注意:这个参数是一个列表,可以包含多个颜色。如果你只需要一个颜色,那么在这个列表中只需要有一个颜色值,如果你想要多个颜色阈值,那这个列表就需要多个颜色阈值。注意:在返回的色块对象blob可以调用code方法,来判断是什么颜色的色块。 示例 red = (xxx,xxx,xxx,xxx,xxx,xxx) blue = (xxx,xxx,xxx,xxx,xxx,xxx) yellow = (xxx,xxx,xxx,xxx,xxx,xxx) img=sensor.snapshot() red_blobs = img.find_blobs([red]) color_blobs = img.find_blobs([red,blue, yellow])

roi是“感兴趣区”。示例: left_roi = [0,0,160,240] blobs = img.find_blobs([red],roi=left_roi)

x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10: blobs = img.find_blobs([red],x_stride=10)

y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5: blobs = img.find_blobs([red],y_stride=5)

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

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

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

merge 合并,如果设置为True,那么合并所有重叠的blob为一个。 注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。

示例 all_blobs = img.find_blobs([red,blue,yellow],merge=True) red_blobs = img.find_blobs([red],merge=True) blue_blobs = img.find_blobs([blue],merge=True) yellow_blobs =img.find_blobs([yellow],merge=True) margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。 2、阈值

一个颜色阈值的结构是这样的:

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

元组里面的数值分别是L A B 的最大值和最小值。

获取阈值步骤:工具 → 机器视觉 → 阈值编辑器 → 帧缓冲区 然后拖动六个滑块,可以实时的看到阈值的结果,我们想要的结果就是,将我们的目标颜色变成白色,其他颜色全变为黑色。

3、blob色块对象

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)。如果色块类似一个铅笔,那么这个值为0180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0360°,也可以通过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()是圆的外接正方形的面积。

4、blobs

find_blobs对象返回的是多个blob的列表。(注意区分blobs和blob,这只是一个名字,用来区分多个色块,和一个色块)。 列表类似与C语言的数组,一个blobs列表里包含很多blob对象,blobs对象就是色块,每个blobs对象包含一个色块的信息。

blobs = img.find_blobs([red])

blobs就是很多色块。

可以用for循环把所有的色块找一遍。

for blob in blobs: print(blob.cx()) 5、参考代码 1. 寻找同种颜色的色块 import sensor, image, time threshold = [(4, 48, 28, -128, 28, 87)] #暗黄色的阈值 sensor.reset() #初始化传感器 sensor.set_pixformat(sensor.RGB565) #传感器色彩 sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 2000 ) #开机跳过一些时间 sensor.set_auto_whitebal(False) #关闭白平衡 clock = time.clock() #获取时钟 while(True): clock.tick() img = sensor.snapshot() #拍照 blob = img.find_blobs(threshold, area_threshold=300, margin=10) #寻找对应阈值的色块,阈值小于300像素的色块过滤掉,合并相邻像素在10个像素内的色块 if blob: #如果找到了目标颜色 FH = bytearray([0xb3,0xb4]) for b in blob: #迭代找到的目标颜色区域 img.draw_cross(b[5], b[6]) #画十字 cx,cy # blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。 # blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。 img.draw_edges(b.min_corners(), color=(0,255,0))#画框

blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。 blob.cy()返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。

2. 多颜色跟踪示例 # 寻找不同颜色的色块 import sensor, image, time # 颜色跟踪阈值(L Min, L Max, A Min, A Max, B Min, B Max) # 下面的阈值跟踪一般红色/绿色的东西。你不妨调整他们... thresholds = [(47, 68, 55, 103, 25, 63), # red_thresholds (60, 75, -80, -40, 30, 50), # green_thresholds (29, 49, -5, 25, -63, -35)] # blue_thresholds sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 2000) sensor.set_auto_gain(False) # must be turned off for color tracking sensor.set_auto_whitebal(False) # must be turned off for color tracking sensor.set_vflip(True) sensor.set_hmirror(True) clock = time.clock() # 只有比“pixel_threshold”多的像素和多于“area_threshold”的区域才被 # 下面的“find_blobs”返回。 如果更改相机分辨率, # 请更改“pixels_threshold”和“area_threshold”。 “merge = True”合并图像中所有重叠的色块。 while(True): clock.tick() img = sensor.snapshot().lens_corr(1.8) for blob in img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200): img.draw_rectangle(blob.rect()) img.draw_cross(blob.cx(), blob.cy()) print(clock.fps())


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3