温馨提示,本文的代码是采用多种方法集成的最优方法
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
-
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将被忽略。
- 这是一个for循环,遍历
-
pixels_stats = img.get_statistics(roi=blob.rect())
:- 这行代码调用
img.get_statistics
方法来获取blob区域的像素统计数据。roi
参数定义了感兴趣区域(Region of Interest),这里使用blob.rect()
来获取blob的边界框。
- 这行代码调用
-
接下来的几个
if
和elif
语句是条件判断,用于根据像素统计数据来分类blob的颜色:pixels_stats.l_mode()
,pixels_stats.a_mode()
,pixels_stats.b_mode()
: 这些方法分别返回ROI区域在Lab颜色空间中的亮度(L)、从红色到绿色的色度(A)、从蓝色到黄色的色度(B)的众数(mode,即出现次数最多的值)。
-
条件判断和颜色赋值:
- 如果第一个条件满足(亮度、A和B的值在特定范围内),则将
color
变量设置为1,代表红色。 - 如果第一个条件不满足但第二个条件满足,则将
color
设置为2,代表蓝色。 - 如果前两个条件都不满足但第三个条件满足,则将
color
设置为3,代表绿色。 - 如果前三个条件都不满足但第四个条件满足,则将
color
设置为4,代表黄色。
- 如果第一个条件满足(亮度、A和B的值在特定范围内),则将
三、总体代码
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