Этот упрощенный фрагмент кода должен представлять наш процесс измерения:
Код: Выделить всё
def contrast_stretch(image, multiplier=1.0):
min_val = np.min(image)
max_val = np.max(image)
stretched = (image - min_val) * (255 / (max_val - min_val) * multiplier)
stretched = np.clip(stretched, 0, 255).astype(np.uint8)
return stretched
def distance(pt1, pt2):
return math.sqrt((pt2[0] - pt1[0]) ** 2 + (pt2[1] - pt1[1]) ** 2)
def measure_diagonals(image, contours, px_to_mm):
refined_corners = []
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
corners = cv2.cornerSubPix(image, np.float32(box), (5, 5), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1))
refined_corners.append(corners)
if len(refined_corners) >= 2:
d1 = distance(refined_corners[0][0], refined_corners[0][2])
d2 = distance(refined_corners[1][0], refined_corners[1][2])
m1 = d1 * px_to_mm
m2 = d2 * px_to_mm
diff = abs(m2 - m1)
return m1, m2, diff
return None, None, None
# Load calibration data
calibration_data = load_calibration_data(calibration_data_path)
mtx = calibration_data["mtx"]
dist = calibration_data["dist"]
# Load image
frame = cv2.imread(img_path)
# Undistort image
frame_undistorted = cv2.undistort(frame, mtx, dist, None, mtx)
# Convert to grayscale
gray = cv2.cvtColor(frame_undistorted, cv2.COLOR_BGR2GRAY)
# Apply bilateral filter
filtered_image = cv2.bilateralFilter(gray, 9, 125, 25)
# Enhance contrast
enhanced_image = contrast_stretch(filtered_image)
# Detect contours
_, edges = cv2.threshold(enhanced_image, 140, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Measure diagonals
px_to_mm = 0.1 # Example conversion factor
m1, m2, diff = measure_diagonals(enhanced_image, contours, px_to_mm)
Порог генерации ROI (белая точка), затем закругленный субпиксель (черная точка)
Это пример неправильно выбранного угла:
Красным мы знаем, что это истинный угол.
Я знаю, что нам следует улучшить освещение. Мы измеряем большую площадь (>4 метра), и чрезвычайно сложно иметь систему освещения, которая генерирует яркое, однородное изображение, поэтому мы применяем массу программных корректировок, таких как двусторонний фильтр, усиление и усиление контраста.
Подробнее здесь: https://stackoverflow.com/questions/786 ... rty-object