Не записуются значения 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