import cv2 import numpy as np import serial from luma.core.interface.serial import i2c, spi from luma.core.render import canvas from luma.oled.device import ssd1306 from PIL import ImageFont

颜色阈值

lower_red = np.array([0, 178, 71]) # 红色阈值下界 higher_red = np.array([56, 255, 207]) # 红色阈值上界 lower_green = np.array([86,122,37]) # 绿色阈值下界 higher_green = np.array([96,255,191]) # 绿色阈值上界 lower_white = np.array([0,0,221]) # 白色阈值下界 higher_white = np.array([180,0,255])# 白色阈值上界

ss = i2c(port=1, address=0x3C) device = ssd1306(ss)

连接串口

ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=2)

def recognize_color(draw_frame): kernel = np.ones((5, 5), np.uint8) frame_hsv = cv2.cvtColor(draw_frame, cv2.COLOR_BGR2HSV)

# 颜色识别
red_mask = cv2.inRange(frame_hsv, lower_red, higher_red)
green_mask = cv2.inRange(frame_hsv, lower_green, higher_green)
white_mask = cv2.inRange(frame_hsv, lower_white, higher_white)

# 膨胀操作
dilation_red = cv2.dilate(red_mask, kernel, iterations=1)
dilation_green = cv2.dilate(green_mask, kernel, iterations=1)
dilation_white = cv2.dilate(white_mask, kernel, iterations=1)

# 闭操作
closing_red = cv2.morphologyEx(dilation_red, cv2.MORPH_CLOSE, kernel)
closing_green = cv2.morphologyEx(dilation_green, cv2.MORPH_CLOSE, kernel)
closing_white = cv2.morphologyEx(dilation_white, cv2.MORPH_CLOSE, kernel)

# 高斯滤波
gaussian_red = cv2.GaussianBlur(closing_red, (5, 5), 0)
gaussian_green = cv2.GaussianBlur(closing_green, (5, 5), 0)
gaussian_white = cv2.GaussianBlur(closing_white, (5, 5), 0)

# 边缘检测
edges_red = cv2.Canny(gaussian_red, 10, 20)
edges_green = cv2.Canny(gaussian_green, 10, 20)
edges_white = cv2.Canny(gaussian_white, 10, 20)

# 寻找轮廓
cnts_red, _ = cv2.findContours(edges_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts_green, _ = cv2.findContours(edges_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts_white, _ = cv2.findContours(edges_white, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 判断是否寻找到轮廓,如果没有找到轮廓就不继续进行操作
if len(cnts_red) > 0:
    # 存放轮廓面积的列表
    s = []
    # 存放最大轮廓的索引
    max_index = 0
    # 获得排序后的轮廓列表以及每个轮廓对应的外接矩形
    (cnts_red, boundingRects_red) = contours.sort_contours(cnts_red)
    # 寻找面积最大的轮廓的索引
    for cnt in cnts_red:
        s.append(cv2.contourArea(cnt))
    max_index = s.index(max(s))
    # 根据面积最大轮廓的索引找到它的外接矩形的信息
    (x, y, w, h) = boundingRects_red[max_index]
    # 画矩形
    draw_frame = cv2.rectangle(draw_frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
    center_x,center_y = (int(x + w / 2), int(y + h / 2))
    box_size = 10
    center_box = draw_frame[center_y - box_size:center_y + box_size, center_x - box_size:center_x + box_size]
    red_pixels = cv2.countNonZero(cv2.inRange(center_box, lower_red, higher_red))
    color_name = 'red'
elif len(cnts_green) > 0:
    # 存放轮廓面积的列表
    s = []
    # 存放最大轮廓的索引
    max_index = 0
    # 获得排序后的轮廓列表以及每个轮廓对应的外接矩形
    (cnts_green, boundingRects_green) = contours.sort_contours(cnts_green)
    # 寻找面积最大的轮廓的索引
    for cnt in cnts_green:
        s.append(cv2.contourArea(cnt))
    max_index = s.index(max(s))
    # 根据面积最大轮廓的索引找到它的外接矩形的信息
    (x, y, w, h) = boundingRects_green[max_index]
    # 画矩形
    draw_frame = cv2.rectangle(draw_frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    center_x,center_y = (int(x + w / 2), int(y + h / 2))
    box_size = 10
    center_box = draw_frame[center_y - box_size:center_y + box_size, center_x - box_size:center_x + box_size]
    green_pixels = cv2.countNonZero(cv2.inRange(center_box, lower_green, higher_green))
    color_name = 'green'
elif len(cnts_white) > 0:
    # 存放轮廓面积的列表
    s = []
    # 存放最大轮廓的索引
    max_index = 0
    # 获得排序后的轮廓列表以及每个轮廓对应的外接矩形
    (cnts_white, boundingRects_white) = contours.sort_contours(cnts_white)
    # 寻找面积最大的轮廓的索引
    for cnt in cnts_white:
        s.append(cv2.contourArea(cnt))
    max_index = s.index(max(s))
    # 根据面积最大轮廓的索引找到它的外接矩形的信息
    (x, y, w, h) = boundingRects_white[max_index]
    # 画矩形
    draw_frame = cv2.rectangle(draw_frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
    center_x,center_y = (int(x + w / 2), int(y + h / 2))
    box_size = 10
    center_box = draw_frame[center_y - box_size:center_y + box_size, center_x - box_size:center_x + box_size]
    white_pixels = cv2.countNonZero(cv2.inRange(center_box, lower_white, higher_white))
    color_name = 'white'
else:
    color_name = ''
return color_name, draw_frame

打开摄像头

vc = cv2.VideoCapture(0) received_signal = False while True: flag, frame = vc.read() draw_frame = frame.copy() data = ser.readline().decode('utf-8').strip() if data == 'g': print('received_signal') received_signal = True color_name, draw_frame = recognize_color(draw_frame) if received_signal: if color_name: ser.write(color_name.encode('utf-8')) received_signal = False else: print('Color not recognized!') cv2.imshow('frame',draw_frame) cv2.waitKey(1)

vc.release() cv2.destroyAllWindows() ser.close()

颜色识别与OLED显示 - Python实现

原文地址: https://www.cveoy.top/t/topic/nXRy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录