Spaces:
Sleeping
Sleeping
| import cv2 | |
| import numpy as np | |
| import math | |
| class ContourAnalyzer: | |
| def __init__(self, min_area_threshold=5): | |
| self.min_area_threshold = min_area_threshold | |
| def find_thickest_contour(self, contours, binary_image): | |
| max_width = 0 | |
| thickest_section = None | |
| thickest_points = None | |
| distance_transforms = [] | |
| for contour in contours: | |
| if cv2.contourArea(contour) > self.min_area_threshold: | |
| mask = np.zeros_like(binary_image) | |
| cv2.drawContours(mask, [contour], 0, 255, thickness=cv2.FILLED) | |
| distance_transform = cv2.distanceTransform(mask, cv2.DIST_L2, cv2.DIST_MASK_PRECISE) | |
| distance_transforms.append(distance_transform) | |
| _, _, _, max_loc = cv2.minMaxLoc(distance_transform) | |
| width = 2 * distance_transform[max_loc[1], max_loc[0]] | |
| if width > max_width: | |
| max_width = width | |
| thickest_section = contour | |
| thickest_points = max_loc | |
| return max_width, thickest_section, thickest_points, distance_transforms | |
| def find_contours(self, binary_image): | |
| contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) | |
| # for debugging | |
| print("Number of contours:", len(contours)) | |
| max_width, thickest_section, thickest_points, distance_transforms = self.find_thickest_contour(contours, binary_image) | |
| return max_width, thickest_section, thickest_points, distance_transforms | |
| def calculate_width(y, x, pixel_width, calibration_factor, distance): | |
| # angle = math.atan2(y, x) | |
| angle=1 | |
| width = angle * pixel_width * distance * calibration_factor | |
| return width | |
| def draw_circle_on_image(self, image, center, radius, color=(57, 255, 20), thickness=-1): | |
| cv2.circle(image, center, radius, color, thickness) | |