下面有多种颜色识别方法,可根据需要进行选择
①colorList.py(颜色库)
import numpy as np
import collectionsdef getColorList():dict = collections.defaultdict(list)# blacklower_black = np.array([0, 0, 0])upper_black = np.array([180, 255, 46])color_list_black = []color_list_black.append(lower_black)color_list_black.append(upper_black)dict['black'] = color_list_black# graylower_gray = np.array([0, 0, 46])upper_gray = np.array([180, 43, 220])color_list_gray= []color_list_gray.append(lower_gray)color_list_gray.append(upper_gray)dict['gray'] = color_list_gray# whitelower_white = np.array([0, 0, 221])upper_white = np.array([180, 30, 255])color_list_white = []color_list_white.append(lower_white)color_list_white.append(upper_white)dict['white'] = color_list_white# redlower_red = np.array([156, 43, 46])upper_red = np.array([180, 255, 255])color_list_red = []color_list_red.append(lower_red)color_list_red.append(upper_red)dict['red'] = color_list_red# red2lower_red = np.array([0, 43, 46])upper_red = np.array([10, 255, 255])color_list_red2 = []color_list_red2.append(lower_red)color_list_red2.append(upper_red)dict['red2'] = color_list_red2# orangelower_orange = np.array([11, 43, 46])upper_orange = np.array([25, 255, 255])color_list_orange = []color_list_orange.append(lower_orange)color_list_orange.append(upper_orange)dict['orange'] = color_list_orange# yellowlower_yellow = np.array([26, 43, 46])upper_yellow = np.array([34, 255, 255])color_list_yellow = []color_list_yellow.append(lower_yellow)color_list_yellow.append(upper_yellow)dict['yellow'] = color_list_yellow# greenlower_green = np.array([35, 43, 46])upper_green = np.array([77, 255, 255])color_list_green = []color_list_green.append(lower_green)color_list_green.append(upper_green)dict['green'] = color_list_green# cyanlower_cyan = np.array([78, 43, 46])upper_cyan = np.array([99, 255, 255])color_list_cyan = []color_list_cyan.append(lower_cyan)color_list_cyan.append(upper_cyan)dict['cyan'] = color_list_cyan# bluelower_blue = np.array([100, 43, 46])upper_blue = np.array([124, 255, 255])color_list_blue = []color_list_blue.append(lower_blue)color_list_blue.append(upper_blue)dict['blue'] = color_list_blue# purplelower_purple = np.array([125, 43, 46])upper_purple = np.array([155, 255, 255])color_list_purple = []color_list_purple.append(lower_purple)color_list_purple.append(upper_purple)dict['purple'] = color_list_purplereturn dictif __name__ == '__main__':color_dict = getColorList()print(color_dict)num = len(color_dict)print('num=', num)for d in color_dict:print('key=', d)print('value=', color_dict[d][1])
②xf_color.py(识别图片面积最大颜色)
import cv2
import colorListdef get_color(frame):print('go in get_color')hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)maxsum = 0color = Nonecolor_dict = colorList.getColorList()for d in color_dict:mask = cv2.inRange(hsv, color_dict[d][0], color_dict[d][1])binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1]binary = cv2.dilate(binary, None, iterations=2)cnts = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]sum = 0for c in cnts:sum += cv2.contourArea(c)# print("%s , %d" %(d, sum ))if sum > maxsum:maxsum = sumcolor = dreturn colorif __name__ == '__main__':filename = "/home/pi/color/yellow.jpg"frame = cv2.imread(filename)print(get_color(frame))
③xf_realize.py(识别摄像头面积最大颜色)
import cv2
import xf_colordef videox():vix = cv2.VideoCapture(0)while True:ret, tu = vix.read()cv2.imshow("take_photo", tu)cv2.waitKey(1)cv2.imwrite("color.png", tu)filename = cv2.imread("color.png")color = xf_color.get_color(filename)if color == "red" or color == "red2":print("red")result = "1"breakelif color == "green":print("green")result = "2"breakelif color == "blue":print("blue")result = "3"breakvix.release()cv2.destroyAllWindows()return resultif __name__ == '__main__':videox()
④xf_hsv.py(识别颜色并画框)
import numpy as np
import cv2font = cv2.FONT_HERSHEY_SIMPLEXlower_green = np.array([35, 43, 46]) # 绿色低阈值
upper_green = np.array([77, 255, 255]) # 绿色高阈值
lower_red = np.array([0, 127, 128]) # 红色低阈值
upper_red = np.array([10, 255, 255]) # 红色高阈值
lower_blue = np.array([100, 43, 46]) # 蓝色低阈值
upper_blue = np.array([124, 255, 255]) # 蓝色高阈值
lower_yellow = np.array([11, 43, 46]) # 黄色低阈值
upper_yellow = np.array([34, 255, 255]) # 黄色高阈值cap = cv2.VideoCapture(0)#打开USB摄像头
if (cap.isOpened()): # 视频打开成功flag = 1
else:flag = 0
num = 0
if (flag):while (True):ret, frame = cap.read() # 读取一帧if ret == False: # 读取帧失败breakhsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)mask_green = cv2.inRange(hsv_img, lower_green, upper_green) # 根据颜色范围删选mask_red = cv2.inRange(hsv_img, lower_red, upper_red)mask_blue = cv2.inRange(hsv_img, lower_blue, upper_blue)mask_yellow = cv2.inRange(hsv_img, lower_yellow, upper_yellow)mask_green = cv2.medianBlur(mask_green, 7) # 中值滤波mask_red = cv2.medianBlur(mask_red, 7)mask_blue = cv2.medianBlur(mask_blue, 7)mask_yellow = cv2.medianBlur(mask_yellow, 7)mask = cv2.bitwise_or(mask_green, mask_red, mask_blue, mask_yellow) # 检测轮廓mask_green, contours, hierarchy = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)mask_red, contours2, hierarchy2 = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)mask_blue, contours3, hierarchy3 = cv2.findContours(mask_blue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)mask_yellow, contours4, hierarchy4 = cv2.findContours(mask_yellow, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for cnt in contours:(x, y, w, h) = cv2.boundingRect(cnt)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.putText(frame, "Green", (x, y - 5), font, 0.7, (0, 255, 0), 2)for cnt2 in contours2:(x2, y2, w2, h2) = cv2.boundingRect(cnt2)cv2.rectangle(frame, (x2, y2), (x2 + w2, y2 + h2), (0, 0, 255), 2)cv2.putText(frame, "Red", (x2, y2 - 5), font, 0.7, (0, 0, 255), 2)for cnt3 in contours3:(x3, y3, w3, h3) = cv2.boundingRect(cnt3)cv2.rectangle(frame, (x3, y3), (x3 + w3, y3 + h3), (255, 0, 0), 2)cv2.putText(frame, "Blue", (x3, y3 - 5), font, 0.7, (255, 0, 0), 2)for cnt4 in contours4:(x4, y4, w4, h4) = cv2.boundingRect(cnt4)cv2.rectangle(frame, (x4, y4), (x4 + w4, y4 + h4), (0, 255, 255), 2)cv2.putText(frame, "Yellow", (x4, y4 - 5), font, 0.7, (0, 255, 255), 2)num = num + 1cv2.imshow("dection", frame)cv2.imwrite("imgs/%d.jpg"%num, frame)if cv2.waitKey(20) & 0xFF == 27:break
cv2.waitKey(0)
cv2.destroyAllWindows()
⑤gaussian.py(利用高斯等操作进行处理后的颜色识别)
import cv2
import numpy as npcolor_dist = {'red': {'Lower': np.array([0, 127, 128]), 'Upper': np.array([10, 255, 255])},'light_red': {'Lower': np.array([178, 100, 136]), 'Upper': np.array([255, 255, 255])},'blue': {'Lower': np.array([100, 80, 46]), 'Upper': np.array([124, 255, 255])},'green': {'Lower': np.array([35, 43, 35]), 'Upper': np.array([90, 255, 255])},'yellow': {'Lower': np.array([26, 43, 46]), 'Upper': np.array([34, 255, 255])},}cap = cv2.VideoCapture(0)
cv2.namedWindow('camera', cv2.WINDOW_AUTOSIZE)while True:ret, frame = cap.read()gs_frame = cv2.GaussianBlur(frame, (5, 5), 0) # 高斯hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV) # HSVinRange_hsv = cv2.inRange(hsv, color_dist['green']['Lower'], color_dist['green']['Upper']) # 二值化cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] # 检测轮廓c = max(cnts, key=cv2.contourArea)rect = cv2.minAreaRect(c) # 最小外接矩形box = cv2.boxPoints(rect) # 获取顶点坐标box_list = box.tolist()cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 0), 2)cv2.imshow('camera', frame)if cv2.waitKey(1) & 0xFF == 27:breakcv2.destroyAllWindows()
下面是HSV表与BGR表可根据需要修改自己的数据
HSV
BGR