Не записуются значения results в csv таблицу

Эта программа создана для обработки набора семечек в цикле и поиска их формы. Этот набор находится в папке white_png они с удалённым фоном(где фон r,g,b=255,255,255). В состав формы входят такие составляющие filename(название одного из обработанных файлов с изображениями), line_a(первая часть длинны), line_b(вторая часть длинны), line_c(первая часть ширины), line_d(вторая часть ширины),first_angle(первый угол), second_angle(второй угол),third_angle(третий угол),fourth_angle(четвёртый угол),square(площадь всей мемечки),s_dug1(площадь первой части семечки за пределами треугольника),s_dug2(площадь (площадь второй части семечки за пределами треугольника) части семечки за пределами треугольника),s_dug3(площадь третей части семечки за пределами треугольника),s_dug4(площадь четвёртой части семечки за пределами треугольника),zol_h(отношение всей ширины к первой части), zol_w(отношение всей длинны к первой части),height_seed(длинна семечки и ширина семечки),width_seed(Ширина семечки).Заголовки таблицы находятся в папке в переменной headers, а данные для заполнения столбцов в results- данные о формах семечек. Эти данные нужно занести в csv таблицу.

import os
import numpy as np
import cv2
import math
import csv
import time
from multiprocessing.pool import Pool


def main():
    directory = 'white_png'
    tp1 = time.time()

    images = [os.path.abspath(os.path.join(directory, filename))
              for filename in os.listdir(directory)
              if os.path.isfile(os.path.join(directory, filename))]

    p = Pool(processes=4)
    results = p.map(process_image, images)
    p.close()
    p.join()
    tp2 = time.time()
    print(f'*** Общее время: {tp2 - tp1} ***')

    # Проверка на пустоту результатов перед записью в файл
    if results:
        headers = ['Name', 'lineA', 'lineB', 'lineC', 'lineD', 'firstAngle', 'secondAngle', 'thirdAngle', 'fourthAngle',
                   'square', 'S_Dug1', 'S_Dug2', 'S_Dug3', 'S_Dug4', 'zolH', 'zolW', 'heightSeed', 'widthSeed']
        with open('white_seeds_of_sunflowers_rotated_NOBackground.csv', 'w', newline='') as f:
            write = csv.writer(f, delimiter=';')
            write.writerow(headers)
            write.writerows(results)
            print("CSV файл успешно записан!")
    else:
        print("Нет данных для записи в CSV.")


def process_image(path):
    directory, filename = os.path.split(path)
    image = cv2.imread(path)
    if image is None:
        print(f"Не удалось загрузить изображение: {path}")
        return None

    print(f"Успешно загружено изображение: {filename}")
    r, g, b = cv2.split(image)

    # Проверка на диапазон значений каналов
    print(f"Диапазон значений R: {r.min()} - {r.max()}, G: {g.min()} - {g.max()}, B: {b.min()} - {b.max()}")

    # Игнорируем пиксели белого фона (255, 255, 255)
    bit_matrix = np.logical_not(np.logical_and(r == 255, g == 255, b == 255))
    numb_matrix = bit_matrix.astype(int)

    # Выводим сумму всех единиц (то есть пикселей, которые не белые)
    print(f"Количество не белых пикселей: {np.sum(numb_matrix)}")

    # Найдем координаты крайних точек
    max_row_coordinates, max_col_coordinates = find_coordinates(numb_matrix)

    # Отладка крайних точек
    if not max_row_coordinates or not max_col_coordinates:
        print(f"Не удалось найти крайние точки для {filename}")
        return None

    print(f"Координаты строк: {max_row_coordinates}")
    print(f"Координаты столбцов: {max_col_coordinates}")

    # Пример вывода промежуточных результатов для ключевых переменных
    print(
        f"min_r: {min(max_row_coordinates)}, max_r: {max(max_row_coordinates)}, min_c: {min(max_col_coordinates)}, max_c: {max(max_col_coordinates)}")

    min_r = min(max_row_coordinates)
    max_r = max(max_row_coordinates)
    min_c = min(max_col_coordinates)
    max_c = max(max_col_coordinates)

    print(f"Размер изображения: {image.shape}")
    print(f"Диапазон значений R-канала: {r.min()} - {r.max()}")
    print(f"Диапазон значений G-канала: {g.min()} - {g.max()}")
    print(f"Диапазон значений B-канала: {b.min()} - {b.max()}")

    #Координаты концов отрезков
    x_min_r_coordinate = min_r[0]
    y_min_r_coordinate = min_r[1]
    x_max_r_coordinate = max_r[0]
    y_max_r_coordinate = max_r[1]
    x_min_c_coordinate = min_c[0]
    y_min_c_coordinate = min_c[1]
    x_max_c_coordinate = max_c[0]
    y_max_c_coordinate = max_c[1]

    # Линии по координатам
    l_1 = [[x_min_r_coordinate, y_min_r_coordinate], [x_max_r_coordinate, y_max_r_coordinate]]
    l_2 = [[x_min_c_coordinate, y_min_c_coordinate], [x_max_c_coordinate, y_max_c_coordinate]]

    # Разница координат
    xd = (l_1[0][0] - l_1[1][0], l_2[0][0] - l_2[1][0])
    yd = (l_1[0][1] - l_1[1][1], l_2[0][1] - l_2[1][1])
    div = xd[0] * yd[1] - xd[1] * yd[0]

    if div == 0:
        return None  # Линии не пересекаются, пропускаем изображение

    d = (l_1[0][0] * l_1[1][1] - l_1[0][1] * l_1[1][0], l_2[0][0] * l_2[1][1] - l_2[0][1] * l_2[1][0])
    x = (d[0] * xd[1] - d[1] * xd[0]) / div
    y = (d[0] * yd[1] - d[1] * yd[0]) / div

    # Рассчитываем площади и другие параметры
    square = np.sum(numb_matrix)
    # Рассчитываем длины линий
    line_a = abs(y - y_min_r_coordinate)
    line_b = abs(y_max_r_coordinate - y)
    line_c = abs(x - x_min_c_coordinate)
    line_d = abs(x_max_c_coordinate - x)
    # Если линии равны нулю, пропускаем
    if not (line_a and line_b and line_c and line_d):
        return None

    # Рассчет углов
    hip1 = math.sqrt(line_a ** 2 + line_c ** 2)
    hip2 = math.sqrt(line_c ** 2 + line_d ** 2)
    hip3 = math.sqrt(line_b ** 2 + line_d ** 2)
    hip4 = math.sqrt(line_a ** 2 + line_d ** 2)
    beta1 = math.asin(line_c / hip1) * (180 / math.pi) if hip1 != 0 else 0  #Первая часть первого угла
    beta2 = math.asin(line_c / hip2) * (180 / math.pi) if hip2 != 0 else 0  #Первая часть третего угла
    beta3 = math.asin(line_d / hip3) * (180 / math.pi) if hip3 != 0 else 0  #Вторая часть третего угла
    beta4 = math.asin(line_d / hip4) * (180 / math.pi) if hip4 != 0 else 0  #Вторая часть первого угла

    alpha1 = 90 - beta1  # Первая половина 2 угла
    alpha2 = 90 - beta2  # Первал половина 4 угла
    alpha3 = 90 - beta3  # Вторая половина 4 угла
    alpha4 = 90 - beta4  # Вторая половина 2 угла

    first_angle = beta1 + beta4  # Первый угол
    second_angle = alpha1 + alpha2  # Второй угол
    third_angle = beta2 + beta3  # Третий угол
    fourth_angle = alpha3 + alpha4  # Четвёртый угол
    rs1 = line_a * line_c / 2  # Площа 1 трикутника
    rs2 = line_c * line_b / 2  # Площа 2 трикутника
    rs3 = line_b * line_d / 2  # Площа 3 трикутника
    rs4 = line_a * line_d / 2  # Площа 4 трикутника

    rmb = rs1 + rs2 + rs3 + rs4
    #Пропорциональности частей семечки
    r_proportion1 = rmb / rs1 if rs1 != 0 else 0
    r_proportion2 = rmb / rs2 if rs2 != 0 else 0
    r_proportion3 = rmb / rs3 if rs3 != 0 else 0
    r_proportion4 = rmb / rs4 if rs4 != 0 else 0

    square1 = square / r_proportion1 if r_proportion1 != 0 else 0  #Первая часть площади семечки
    square2 = square / r_proportion2 if r_proportion2 != 0 else 0  #Вторая часть площади семечки
    square3 = square / r_proportion3 if r_proportion3 != 0 else 0  #Третья часть площади семечки
    square4 = square / r_proportion4 if r_proportion4 != 0 else 0  #Первая часть площади семечки
    s_dug1 = square1 - rs1  #Первая часть площади семечки за пределами треугольника
    s_dug2 = square2 - rs2  #Вторая часть площади семечки за пределами треугольника
    s_dug3 = square3 - rs3  #Третья часть площади семечки за пределами треугольника
    s_dug4 = square4 - rs4  #Четвёртая часть площади семечки за пределами треугольника

    # Рассчет других параметров
    zol_h = (line_c + line_d) / line_c if line_c != 0 else 0
    zol_w = (line_a + line_b) / line_a if line_a != 0 else 0
    width_seed = line_a + line_b
    height_seed = line_c + line_d

    return [filename, line_a, line_b, line_c, line_d, first_angle, second_angle, third_angle, fourth_angle,
            square, s_dug1, s_dug2, s_dug3, s_dug4, zol_h, zol_w, height_seed, width_seed]


def find_coordinates(numb_matrix):
    max_row_index = find_max_row(numb_matrix)
    max_col_index = find_max_column(numb_matrix)

    max_row = numb_matrix[max_row_index]
    max_col = [numb_matrix[i][max_col_index] for i in range(len(numb_matrix))]

    max_row_ones = [i for i, val in enumerate(max_row) if val == 1]
    max_col_ones = [i for i, val in enumerate(max_col) if val == 1]

    return [(max_row_index, col) for col in max_row_ones], [(row, max_col_index) for row in max_col_ones]


#Поиск длинны
def find_max_row(numb_matrix):
    max_sum = 0
    max_row_index = -1
    for i, row in enumerate(numb_matrix):
        row_sum = sum(row)
        if row_sum > max_sum:
            max_sum = row_sum
            max_row_index = i
    return max_row_index


#Поиск ширины
def find_max_column(numb_matrix):
    max_sum = 0
    max_col_index = -1
    for j in range(len(numb_matrix[0])):
        col_sum = sum(numb_matrix[i][j] for i in range(len(numb_matrix)))
        if col_sum > max_sum:
            max_sum = col_sum
            max_col_index = j
    return max_col_index


if __name__ == '__main__':
    main()
Ошибка выглядит так:
Traceback (most recent call last):
  File "D:\Git2024\horizontalSeed\main.py", line 206, in <module>
    main()
  File "D:\Git2024\horizontalSeed\main.py", line 32, in main
    write.writerows(results)
_csv.Error: iterable expected, not NoneType

Ссылки на изображения семечек:
https://drive.google.com/file/d/1ZsGntxa4UVT_R_ij4Sk0a5A6T9gtqnqC/view?usp=sharing
https://drive.google.com/file/d/1moT2dk4eD04dB7frQBlcwSmk-HofYlTD/view?usp=sharing
https://drive.google.com/file/d/1p4eLBZGQ7u7GreX15jo6LvfismcE3ZHL/view?usp=sharing
https://drive.google.com/file/d/1JIGiZE407-UAHHF6MwMpka8TJtdr9Eii/view?usp=sharing
https://drive.google.com/file/d/1zlMaYTkyKvd5yzIiQ0hPkSSuH36T0Y6_/view?usp=sharing
https://drive.google.com/file/d/1WZkRLNWiTtGNhtT2KdU3U7arYFhEXgJA/view?usp=sharing
https://drive.google.com/file/d/1d4kDC7rymmlOK_0ccyWOL-giivQCpV9H/view?usp=sharing
https://drive.google.com/file/d/148yAmzc-I3fqsQs4QDjBNgPEqoWS7Akc/view?usp=sharing

Вид формы семечки:
https://drive.google.com/file/d/105IQpYCPL5x5serhJQ54nGSsG4wXf5jJ/view?usp=sharing

Ответы (0 шт):