Untitled

 avatar
unknown
python
13 days ago
6.0 kB
3
Indexable
import cv2
import numpy as np

# Загружаем изображение
image = cv2.imread('image.jpg')

# Преобразуем изображение в пространство цветов HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# Определим диапазон для зелёного цвета в HSV
lower_green = np.array([35, 50, 50])   # Нижний порог для зелёного цвета
upper_green = np.array([85, 255, 255]) # Верхний порог для зелёного цвета

# Маска для выделения зелёного цвета
mask = cv2.inRange(hsv, lower_green, upper_green)

# Применяем морфологические операции для очистки изображения от шума
kernel = np.ones((5, 5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

# Находим контуры
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Функция для проверки, является ли контур квадратом
def is_square(approx):
    if len(approx) == 4:
            side_lengths = [cv2.norm(approx[i] - approx[(i + 1) % 4]) for i in range(4)]
                    return max(side_lengths) - min(side_lengths) < 10  # Точность, можно изменить
                        return False

                        # Переменная для последнего квадрата
                        last_square = None

                        # Перебираем контуры и ищем последний зелёный квадрат
                        for contour in contours:
                            epsilon = 0.04 * cv2.arcLength(contour, True)
                                approx = cv2.approxPolyDP(contour, epsilon, True)
                                    
                                        if is_square(approx):
                                                last_square = approx  # Сохраняем последний найденный квадрат

                                                # Если квадрат найден, рисуем его и находим координаты середины
                                                if last_square is not None:
                                                    # Рисуем последний найденный зелёный квадрат
                                                        cv2.drawContours(image, [last_square], -1, (0, 255, 0), 2)
                                                            
                                                                # Вычисляем центр квадрата
                                                                    M = cv2.moments(last_square)
                                                                        if M["m00"] != 0:  # Проверка на деление на 0
                                                                                cx = int(M["m10"] / M["m00"])
                                                                                        cy = int(M["m01"] / M["m00"])
                                                                                            else:
                                                                                                    cx, cy = 0, 0  # Если момент равен 0, значит, квадрат не найден корректно

                                                                                                        # Отображаем координаты середины
                                                                                                            print(f"Координаты центра последнего квадрата: ({cx}, {cy})")

                                                                                                                # Отображаем точку центра
                                                                                                                    cv2.circle(image, (cx, cy), 5, (0, 0, 255), -1)

                                                                                                                        # Сохраняем изображение с последним квадратом и его центром
                                                                                                                            cv2.imwrite('output_last_square.jpg', image)
                                                                                                                                print("Последний зелёный квадрат найден и сохранён!")
                                                                                                                                else:
                                                                                                                                    print("Зелёный квадрат не найден.")

                                                                                                                                    # Показываем результат
                                                                                                                                    cv2.imshow('Detected Last Green Square', image)
                                                                                                                                    cv2.waitKey(0)
                                                                                                                                    cv2.destroyAllWindows()
                                                                                                                                    
Editor is loading...
Leave a Comment