传统cv识别颜色

发布时间 2023-04-26 14:05:58作者: 哦哟这个怎么搞
import cv2
import numpy as np


class FindConTours:
    def __init__(self, path):
        self.img = cv2.imread(path)
        self.box_list = []

    def common_contours(self):
        img = self.img
        hsv_image = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        Bch, Gch, Rch = cv2.split(hsv_image)
        _, Gch = cv2.threshold(Gch, 155, 255, cv2.THRESH_BINARY)
        kernel = cv2.getStructuringElement(1, (5, 5))
        Gch = cv2.erode(Gch, kernel, iterations=1)
        kernel = cv2.getStructuringElement(1, (5, 5))
        Gch = cv2.dilate(Gch, kernel, iterations=1)
        cv2.imshow('dilate', Gch)
        cv2.waitKey(0)
        contours, hierarchy = cv2.findContours(Gch, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        for c in contours:
            area = cv2.contourArea(c)
            if area < 3000:
                continue
            x, y, w, h = cv2.boundingRect(c)  # 计算点集最外面的矩形边界
            self.box_list.append([x, y, w, h])

    def find_blue(self):
        img = self.img
        lower = np.array([101, 43, 46])
        upper = np.array([112, 255, 255])
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv, lower, upper)
        s = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
        openI = cv2.morphologyEx(mask, cv2.MORPH_OPEN, s, iterations=1)
        closeI = cv2.morphologyEx(openI, cv2.MORPH_CLOSE, s, iterations=1)
        contours, hierarchy = cv2.findContours(closeI, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        cv2.imshow("closeI", closeI)
        cv2.waitKey(0)
        for c in contours:
            area = cv2.contourArea(c)
            if area < 800:
                continue
            x, y, w, h = cv2.boundingRect(c)  # 计算点集最外面的矩形边界
            self.box_list.append([x, y, w, h, "blue"])

    def identify_colors(self):
        sorted(self.box_list, key=lambda x: x[0])
        print(self.box_list)
        img = self.img
        color_dist = {'red': {'Lower': np.array([156, 43, 46]), 'Upper': np.array([180, 255, 255])},
                      'yellow': {'Lower': np.array([20, 43, 46]), 'Upper': np.array([25, 255, 255])},
                      'green': {'Lower': np.array([50, 50, 50]), 'Upper': np.array([130, 255, 255])},
                      }
        for box in self.box_list:
            if len(box) == 5:
                continue
            x, y, w, h = box[:4]
            roi = img[y:y + h, x:x + w]
            hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
            for key in color_dist:
                if len(box) == 5:
                    continue
                lower_range = color_dist[key]['Lower']
                upper_range = color_dist[key]['Upper']
                mask = cv2.inRange(hsv, lower_range, upper_range)
                pixel_count = cv2.countNonZero(mask)
                total_pixels = w * h
                white_pixel_ratio = pixel_count / total_pixels
                if white_pixel_ratio > 0.2:
                    box.append(key)

    def draw_text(self):
        img = self.img
        for box in self.box_list:
            x, y, w, h = box[:4]
            cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
            if len(box) == 5:
                text = box[4]
            else:
                text = None
            text_size, _ = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2)
            text_x = x + int((w - text_size[0]) / 2)
            text_y = y + int((h + text_size[1]) / 2)
            cv2.putText(img, text, (text_x, text_y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)


find_contours = FindConTours("img_2.png")
find_contours.common_contours()
find_contours.find_blue()
find_contours.identify_colors()
find_contours.draw_text()
cv2.imshow("Image", find_contours.img)
cv2.waitKey(0)
View Code