对openmv色块查找的思考笔记
引言
要实现色块查找,首先我们是在RGB格式下对红,黄蓝三原色的值域进行规定,例如:red = (minL, maxL, minA, maxA, minB, maxB) 通常我们在程序中使用thresholds来定义域值,它的参数可以是多个颜色的列表,例如:thresholds = [(255,0,0,0),(255,255,0,0),(0,0,0,255)] 在定义好所需要查找的色块阈值后,需要对图像进行实例化:img = sensor.snapshot() #这里需要解释的是snapshot()是快照函数,可以截取下视频流中的一个画面 随后调用find_blobs()函数,它可以帮我们找到img这个画面中所有符合值域的像素点。
find_blobs()参数
-
roi(感兴趣区:
roi是一个元组, roi = (x, y, w, h),代表从左上顶点(x,y)开始的宽为w高为h的矩形区域,roi不设置的话默认为整个图像视野。
-
x_stride(查找x方向上最小宽度的像素,默认=2) y_stride(查找y方向上最小宽度的像素,默认=1) invert(反转值域,在值域以外的区域进行查找) area_threshold(面积值域,若色块面积小于这个值时,色块会被过滤掉) pixels_threshold(像素值域,当色块像素小于这个值时,色块会被滤掉) merge(当它为 True的时候,把所有色块合并为一个) margin(边界值,当两个blob的间距为一个像素点时,它们会被合并)
函数
当我们找到了色块所在位置后,现在则是把它们用圆圈或者矩形框围起来,这里引出了openmv画图的函数
-
画矩形:draw_rectange() 画圆形:draw_circle() 画十字:draw_cross()
以上函数的参数都可以引用blobs的参数[引用]
blobs参数
[0] 代表识别到的目标颜色区域左上顶点的x坐标, [1]代表左上顶点y坐标 [2]代表目标区域的宽 [3]代表目标区域的高 [4]代表目标区域像素点的个数 [5]代表目标区域的中心点x坐标 [6]代表目标区域中心点y坐标 [7]代表目标颜色区域的旋转角度(是弧度值,浮点型,列表其他元素是整型) [8]代表与此目标区域交叉的目标个数 [9]代表颜色的编号(它可以用来分辨这个区域是用哪个颜色阈值threshold识别出来的)
以上,我们就完成了识别色块并将其用矩形或圆圈框起来的功能了,以下是完整代码:
# 单颜色组合识别例程
#
# 这个例子显示了使用OpenMV的单色代码跟踪。
#
#颜色代码是由两种或更多颜色组成的色块。下面的例子只会跟踪同时具有以下两种颜色的彩色物体。
import sensor, image, time
# Color Tracking Thresholds (L Min, L Max, A Min, A Max, B Min, B Max)
# The below thresholds track in general red/green things. You may wish to tune them...
thresholds = [(30, 100, 15, 127, 15, 127), # generic_red_thresholds -> index is 0 so code == (1 << 0)
(30, 100, -64, -8, -32, 32)] # generic_green_thresholds -> index is 1 so code == (1 << 1)
# 当“find_blobs”的“merge = True”时,code代码被组合在一起。
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
clock = time.clock()
# 只有比“pixel_threshold”多的像素和多于“area_threshold”的区域才被
# 下面的“find_blobs”返回。 如果更改相机分辨率,
# 请更改“pixels_threshold”和“area_threshold”。 “merge = True”合并图像中所有重叠的色块。
while(True):
clock.tick()
img = sensor.snapshot()
for blob in img.find_blobs(thresholds, pixels_threshold=100, area_threshold=100, merge=True):
if blob.code() == 3: # r/g code == (1 << 1) | (1 << 0)
img.draw_rectangle(blob.rect())
img.draw_cross(blob.cx(), blob.cy())
print(clock.fps())
总结
主要是理解思路,代码在都有,对值域的选择以及最后逻辑的处理会影响你最后的效果(如果你在此之后也要做颜色跟踪)
