本文将介绍使用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 = 0blue_black = 0orange_white = 0orange_black = 0# 计算每一列的黑白像素总和for i in range(width):for j in range(height):if mask_blue[j][i] == 255:blue_white += 1if mask_blue[j][i] == 0:blue_black += 1if mask_orange[j][i] == 255:orange_white += 1if mask_orange[j][i] == 0:orange_black += 1color_list = ['blue', 'orange']num_list = [blue_white, orange_white]ret = color_list[num_list.index(max(num_list))]return ret
调用上面的函数就可以输出当前识别到的颜色标签。
缺点是识别的颜色越多代码计算量越大,效率低。
参考链接:/Aiden_yan/article/details/118459034《opencv-python车牌颜色判断》-三个臭皮姜