对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())

总结

主要是理解思路,代码在官网都有,对值域的选择以及最后逻辑的处理会影响你最后的效果(如果你在此之后也要做颜色跟踪)

你可能感兴趣的:(笔记,openmv,python,色块查找)