本文将介绍使用OpenCV实现颜色识别的详细步骤 + 代码。
背景介绍
在截取出模板匹配到的logo区域之后,需要判断logo是什么颜色。本案例中要识别的对象是纯色的所以适用下面的颜色识别方法,有不同需求的请斟酌借鉴。
原理介绍
数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。所以我们在颜色检测时,选用HSV图像。

例如主要区分2种颜色:蓝色和橘色。
得到的阈值如下:
lower_blue = np.array([100, 43, 46])
upper_blue = np.array([124, 255, 255])
lower_orange = np.array([11, 43, 46])
upper_orange = np.array([25, 255, 255])
实现代码
颜色识别代码如下:
def recognize(frame):
width = frame.shape[1]
height = frame.shape[0]
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# 根据阈值构建掩膜
mask_blue = cv.inRange(hsv, lower_blue, upper_blue)
mask_orange = cv.inRange(hsv, lower_orange, upper_orange)
# 对mask进行操作--黑白像素点统计 因为不同颜色的掩膜面积不一样
# 记录黑白像素总和
blue_white = 0
blue_black = 0
orange_white = 0
orange_black = 0
# 计算每一列的黑白像素总和
for i in range(width):
for j in range(height):
if mask_blue[j][i] == 255:
blue_white += 1
if mask_blue[j][i] == 0:
blue_black += 1
if mask_orange[j][i] == 255:
orange_white += 1
if mask_orange[j][i] == 0:
orange_black += 1
color_list = ['blue', 'orange']
num_list = [blue_white, orange_white]
ret = color_list[num_list.index(max(num_list))]
return ret
调用上面的函数就可以输出当前识别到的颜色标签。
缺点是识别的颜色越多代码计算量越大,效率低。
参考链接:https://blog.csdn.net/Aiden_yan/article/details/118459034《opencv-python车牌颜色判断》-三个臭皮姜