openmv图像识别(颜色篇)

 

温馨提示,本文的代码是采用多种方法集成的最优方法

Hello,亲爱的读者们!在这个充满挑战与创新的时代,我们总是不断探索新的技术边界。今天,我非常激动地与大家分享我最近在OpenMV4领域的一次有趣尝试。

作为一名热衷于机器视觉和智能识别的开发者,我一直在寻找能够提升项目性能和准确性的新工具和方法。OpenMV4以其强大的图像处理能力和灵活的编程接口,成为了我探索之旅中的得力助手。

在这篇博客中,我将带领大家一起走进基于色块识别的图形、颜色以及坐标识别的世界。通过一段精心编写的代码,我们可以实现对特定颜色和形状的物体进行快速而准确的识别,而且据我的实际测试,其准确率能够达到90%以上!

不过,请注意,为了获得最佳识别效果,我们需要确保环境光线适宜,并且物体与摄像头保持适当的距离。如果遇到识别效果不佳的情况,您还可以根据实际情况调整代码中的颜色阈值和物体距离参数。

不多说了,让我们直接进入正题,看看这段神奇的代码是如何工作的吧!(友情提示:为了运行这段代码,您需要使用OpenMV IDE。

一、代码初始化: 

import sensor, image, time
thresholds = [(30, 100, 15, 127, 15, 127), # red
              (0, 42, -98, 55, 16, 57),  # green大小
               (7, 44, -15, 16, -38, 5),(9, 35, -15, 16, -38, 5),#(44, 72, -21, 9, -14, 24),#(17, 34, -26, 19, -29, -11) , # blue
              (51, 66, -27, 10, 18, 73),(54, 61, -26, -5, 22, 80),(56, 64, -29, 2, 35, 79),#(54, 61, -21, 2, 39, 97),(42, 71, -40, 9, -128, 18),# yellow
             (45, 100, -41, 127, -10, 120) ]# black
sensor.reset() #初始化设置
sensor.set_pixformat(sensor.RGB565) #设置为彩色
sensor.set_framesize(sensor.QVGA) #设置清晰度
sensor.set_windowing(150,200)
sensor.skip_frames(time = 2000) #跳过前2000ms的图像
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() #创建一个clock便于计算FPS,看看到底卡不卡
sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的。
sensor.set_auto_whitebal(False) #关闭白平衡。

二、颜色部分: 

for blob in img.find_blobs(thresholds, area_threshold = 200, pixels_threshold=200):   
        pixels_stats = img.get_statistics(roi=blob.rect())
        if 0 < pixels_stats.l_mode() < 40 and 10 < pixels_stats.a_mode() < 40 and -10 < pixels_stats.b_mode() < 31:
          color = 1#red
        elif 7 < pixels_stats.l_mode() < 34 and -26 < pixels_stats.a_mode() < 19 and -29 < pixels_stats.b_mode() < 5:
          color = 2#blue
        elif 0 < pixels_stats.l_mode() < 42 and -98 < pixels_stats.a_mode() < 55 and 16 < pixels_stats.b_mode() < 57:
          color = 3#green
        elif 54 < pixels_stats.l_mode() < 61 and -21 < pixels_stats.a_mode() < 2 and 39 < pixels_stats.b_mode() < 97:
          color = 4#yellow

  1. for blob in img.find_blobs(thresholds, area_threshold = 200,  pixels_threshold=200):

    • 这是一个for循环,遍历img.find_blobs函数返回的blob列表。img.find_blobs是OpenMV用来检测图像中连通区域的函数。
    • thresholds: 一个用于图像阈值处理的参数,通常是一个元组,定义了不同的阈值级别来分割图像。
    • area_threshold: 一个参数,用于设置blob的最小面积,小于这个面积的blob将被忽略。
    • pixels_threshold: 一个参数,用于设置blob的最小像素数,小于这个像素数的blob将被忽略。
  2. pixels_stats = img.get_statistics(roi=blob.rect()):

    • 这行代码调用img.get_statistics方法来获取blob区域的像素统计数据。roi参数定义了感兴趣区域(Region of Interest),这里使用blob.rect()来获取blob的边界框。
  3. 接下来的几个ifelif语句是条件判断,用于根据像素统计数据来分类blob的颜色:

    • pixels_stats.l_mode()pixels_stats.a_mode()pixels_stats.b_mode(): 这些方法分别返回ROI区域在Lab颜色空间中的亮度(L)、从红色到绿色的色度(A)、从蓝色到黄色的色度(B)的众数(mode,即出现次数最多的值)。
  4. 条件判断和颜色赋值:

    • 如果第一个条件满足(亮度、A和B的值在特定范围内),则将color变量设置为1,代表红色。
    • 如果第一个条件不满足但第二个条件满足,则将color设置为2,代表蓝色。
    • 如果前两个条件都不满足但第三个条件满足,则将color设置为3,代表绿色。
    • 如果前三个条件都不满足但第四个条件满足,则将color设置为4,代表黄色。

三、总体代码

import sensor, image, time#, math, os, tf, uos, gc
#thresholds是指颜色阈值,把你想要检测的颜色阈值写成一个元组放进这个list
import pyb
# 从pyb模块导入UART类,该类用于创建串口连接
from pyb import UART
# 导入json模块,该模块用于处理JSON数据格式
import json

thresholds = [(30, 100, 15, 127, 15, 127), # red
              (0, 42, -98, 55, 16, 57),  # green大小
               (7, 44, -15, 16, -38, 5),(9, 35, -15, 16, -38, 5),#(44, 72, -21, 9, -14, 24),#(17, 34, -26, 19, -29, -11) , # blue
              (51, 66, -27, 10, 18, 73),(54, 61, -26, -5, 22, 80),(56, 64, -29, 2, 35, 79),#(54, 61, -21, 2, 39, 97),(42, 71, -40, 9, -128, 18),# yellow
             (45, 100, -41, 127, -10, 120) ]# black
sensor.reset() #初始化设置
sensor.set_pixformat(sensor.RGB565) #设置为彩色
sensor.set_framesize(sensor.QVGA) #设置清晰度
sensor.set_windowing(150,200)
sensor.skip_frames(time = 2000) #跳过前2000ms的图像
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() #创建一个clock便于计算FPS,看看到底卡不卡
sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的。
sensor.set_auto_whitebal(False) #关闭白平衡。在颜色识别中,一定要关闭白平衡。

colors = [ # Add more colors if you are detecting more than 7 types of classes at once.
    (255,   0,   0),
    (  0, 255,   0),
    (255, 255,   0),
    (  0,   0, 255),
    (255,   0, 255),
    (  0, 255, 255),
    (255, 255, 255)]

color = 0

while(True):
    clock.tick()
    img = sensor.snapshot()#可以畸形也可以不用
    for blob in img.find_blobs(thresholds, area_threshold = 200, pixels_threshold=200):   
        pixels_stats = img.get_statistics(roi=blob.rect())
        if 0 < pixels_stats.l_mode() < 40 and 10 < pixels_stats.a_mode() < 40 and -10 < pixels_stats.b_mode() < 31:
          color = 1#red
        elif 7 < pixels_stats.l_mode() < 34 and -26 < pixels_stats.a_mode() < 19 and -29 < pixels_stats.b_mode() < 5:
          color = 2#blue
        elif 0 < pixels_stats.l_mode() < 42 and -98 < pixels_stats.a_mode() < 55 and 16 < pixels_stats.b_mode() < 57:
          color = 3#green
        elif 54 < pixels_stats.l_mode() < 61 and -21 < pixels_stats.a_mode() < 2 and 39 < pixels_stats.b_mode() < 97:
          color = 4#yellow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值