Не выводит значение массива results в поля csv файла
В программе используем метод распознания квадрата по цветовым составляющим контура в конвертированном в монохром изображений и листика по фильтрации цвета. Площадь квадрата 1 см квадратный. Рассчитываем площадь в см квадратных листика, поделив количество пикселей в листике на количество пикселей в квадратике.
import cv2
import numpy as np
import os
import csv
path = '221-1.jpg'
# Загрузите изображение
image = cv2.imread(path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# Определение нижней и верхней границы красного цвета в HSV
lower_red = np.array([45, 58, 34])
upper_red = np.array([145, 138, 108])
# Создание маски для красного цвета
mask_leave = cv2.inRange(hsv_image, lower_red, upper_red)
# Применение размытия для уменьшения шума
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# Обнаружение краев с использованием алгоритма Canny
edges_quadrat = cv2.Canny(blurred, 57, 88)
# Найти контуры квадрата
contours_quadrat, _ = cv2.findContours(edges_quadrat, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Подготовка списка для результатов
results = []
# Перебрать найденные контуры для квадрата
for contour_quadrat in contours_quadrat:
epsilon_quadrat = 0.063 * cv2.arcLength(contour_quadrat, True)
approx_quadrat = cv2.approxPolyDP(contour_quadrat, epsilon_quadrat, True)
# Создать маску для квадрата
mask_quadrat = np.zeros_like(gray)
cv2.drawContours(mask_quadrat, [approx_quadrat], -1, 255, thickness=cv2.FILLED)
# Применить маску к маске красного листа
mask_quadrat = cv2.bitwise_and(mask_leave, mask_quadrat)
# Вычислить площадь квадрата
s_quadrat = cv2.countNonZero(mask_quadrat)
if 900 < s_quadrat < 1000:
# Вычислить площадь контура квадрата
num_red_pixels = cv2.contourArea(contour_quadrat)
num_red_sm_q = num_red_pixels / s_quadrat
results.append([path, num_red_pixels, s_quadrat, num_red_sm_q])
# Рисование контуров на изображении
cv2.drawContours(image, [approx_quadrat], -1, (255, 0, 0), 1)
headers = ['Название', 'Площадь листика (пиксели)', 'Площадь квадрата', 'Площадь листика (см^2)']
with open('resultsALL.csv', 'w', newline='') as f:
writer = csv.writer(f, delimiter=';')
writer.writerow(headers)
writer.writerows(results)
# Вывод изображения с контурами
cv2.imshow('Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()