电赛控制类e题:OPENMV识别红色激光、黑色胶带和黑色胶带上激光的一种方法

废话不多说,先上代码:

import sensor, image, time

red_threshold = (0, 255, 50, 12, -4, 27)
black_threshold = (0, 255, -81, -40, 40, 79)
red_color_code = 1
black_color_code = 2

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_vflip(True)
sensor.set_auto_exposure(False, 103000)
sensor.skip_frames(time=2000)
clock = time.clock()

def color_blob():
    sensor.reset()
    sensor.set_pixformat(sensor.RGB565)
    sensor.set_framesize(sensor.QVGA)
    sensor.set_auto_whitebal(False)
    sensor.set_vflip(True)
    sensor.skip_frames(time=2000)
    sensor.set_auto_gain(False)
    clock = time.clock()
    
    while True:
        clock.tick()
        img = sensor.snapshot().lens_corr(1.8)
        blobs = img.find_blobs([red_threshold, black_threshold], area_threshold=10, roi=(108, 35, 170, 165), merge=True)
        
        if blobs:
            for blob in blobs:
                # 处理识别到的色块...
                pass
        else:
            color_code = 0
            pass

def tuxing():
    rrr = img.find_rects(threshold=20000, roi=(108, 35, 170, 165))
    if rrr:
        for r in img.find_rects(threshold=20000, roi=(108, 35, 170, 165)):
            # 处理识别到的矩形...
            pass
            if aa1 != 0 and aa2 != 0:
                color_blob()

while True:
    clock.tick()
    img = sensor.snapshot().lens_corr(1.8)
    img.draw_rectangle(108, 35, 170, 165, color=(255, 255, 255))
    tuxing()

代码解析:

首先,导入了三个模块:sensorimagetime

接下来定义了两个颜色阈值变量:

  • red_threshold:表示红色的阈值范围。由一个六元组 (0, 255, 50, 12, -4, 27) 组成,分别表示红色在 RGB 色彩空间中的最小和最大取值范围。
  • black_threshold:表示黑色的阈值范围。由一个六元组 (0, 255, -81, -40, 40, 79) 组成,分别表示黑色在 RGB 色彩空间中的最小和最大取值范围。

然后定义了两个颜色代码变量:

  • red_color_code:表示红色的代码,赋值为 1。
  • black_color_code:表示黑色的代码,赋值为 2。

接下来进行了图像传感器的设置和初始化。步骤如下:

  • 调用 sensor.reset() 方法重置传感器设置。
  • 设置图像格式为 RGB565,使用 sensor.set_pixformat(sensor.RGB565)
  • 设置图像帧大小为 QVGA(320x240 分辨率),使用 sensor.set_framesize(sensor.QVGA)
  • 使用 sensor.set_vflip(True) 方法进行图像的垂直翻转。
  • 关闭自动曝光,设置曝光时间为 103000 微秒,使用 sensor.set_auto_exposure(False, 103000)
  • 使用 sensor.skip_frames(time=2000) 跳过前两秒的帧。

接下来创建了一个 clock 对象用于计时。

紧接着是 color_blob() 函数的定义,用于处理识别到的色块。函数内部的操作如下:

  • 再次进行了图像传感器的设置和初始化,与之前相同。
  • 进入一个无限循环,不断进行图像处理。
  • 使用 sensor.snapshot().lens_corr(1.8) 获取当前图像并进行镜头校正。
  • 调用 img.find_blobs() 方法来识别图像中的色块。传入了颜色阈值列表 [red_threshold, black_threshold],并设置最小面积阈值为 10,感兴趣区域为 (108, 35, 170, 165)
  • 如果找到了色块,则遍历每个色块并进行相应的处理。在代码中省略了处理色块的部分(通过注释标识),您需要根据实际需求添加适当的处理代码。
  • 如果没有找到色块,则将 color_code 设为 0,并执行一个空语句(pass)。

然后定义了 tuxing() 函数,用于处理识别到的矩形。函数内部的操作如下:

  • 调用 img.find_rects() 方法来识别图像中的矩形。传入了阈值为 20000,感兴趣区域为 (108, 35, 170, 165)
  • 如果找到了矩形,则遍历每个矩形并进行相应的处理。在代码中省略了处理矩形的部分(通过注释标识),您需要根据实际需求添加适当的处理代码。
  • 如果 aa1 和 aa2 都不等于 0,则调用 color_blob() 函数。

最后,在主循环中,进行以下操作:

  • 调用 sensor.snapshot().lens_corr(1.8) 获取当前图像并进行镜头校正。
  • 使用 img.draw_rectangle(108, 35, 170, 165, color=(255, 255, 255)) 在图像上绘制一个白色的矩形框,这是感兴趣区域。
  • 调用 tuxing() 函数来处理识别到的矩形。

你可能感兴趣的:(算法,图像处理)