Spaces:
Sleeping
Sleeping
Update scalingtestupdated.py
Browse files- scalingtestupdated.py +23 -21
scalingtestupdated.py
CHANGED
|
@@ -30,7 +30,7 @@ class ScalingSquareDetector:
|
|
| 30 |
raise ValueError("Invalid feature detector. Choose 'ORB' or 'SIFT'.")
|
| 31 |
|
| 32 |
def find_scaling_square(
|
| 33 |
-
self, target_image, known_size_mm, roi_margin=30
|
| 34 |
):
|
| 35 |
"""
|
| 36 |
Detect the scaling square in the target image based on the reference image.
|
|
@@ -50,23 +50,22 @@ class ScalingSquareDetector:
|
|
| 50 |
|
| 51 |
# # Select the largest square-like contour
|
| 52 |
largest_square = None
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
|
| 66 |
# if largest_square is None:
|
| 67 |
# raise ValueError("No square-like contour found in the ROI.")
|
| 68 |
-
|
| 69 |
-
largest_square=contour
|
| 70 |
# Draw the largest contour on the original image
|
| 71 |
target_image_color = cv2.cvtColor(target_image, cv2.COLOR_GRAY2BGR)
|
| 72 |
cv2.drawContours(
|
|
@@ -83,7 +82,7 @@ class ScalingSquareDetector:
|
|
| 83 |
|
| 84 |
# Calculate the scaling factor
|
| 85 |
avg_square_size_px = (square_width_px + square_height_px) / 2
|
| 86 |
-
scaling_factor =
|
| 87 |
|
| 88 |
return scaling_factor #, square_height_px, square_width_px, roi_binary
|
| 89 |
|
|
@@ -102,8 +101,9 @@ class ScalingSquareDetector:
|
|
| 102 |
|
| 103 |
|
| 104 |
def calculate_scaling_factor(
|
|
|
|
| 105 |
target_image,
|
| 106 |
-
|
| 107 |
feature_detector="ORB",
|
| 108 |
debug=False,
|
| 109 |
roi_margin=30,
|
|
@@ -113,8 +113,9 @@ def calculate_scaling_factor(
|
|
| 113 |
|
| 114 |
# Find scaling square and calculate scaling factor
|
| 115 |
scaling_factor = detector.find_scaling_square(
|
|
|
|
| 116 |
target_image=target_image,
|
| 117 |
-
known_size_mm=
|
| 118 |
roi_margin=roi_margin,
|
| 119 |
)
|
| 120 |
|
|
@@ -147,8 +148,9 @@ if __name__ == "__main__":
|
|
| 147 |
try:
|
| 148 |
|
| 149 |
scaling_factor = calculate_scaling_factor(
|
|
|
|
| 150 |
target_image=box_img,
|
| 151 |
-
known_square_size_mm=
|
| 152 |
feature_detector="ORB",
|
| 153 |
debug=False,
|
| 154 |
roi_margin=90,
|
|
@@ -156,7 +158,7 @@ if __name__ == "__main__":
|
|
| 156 |
# cv2.imwrite(f"./outputs/{idx}_binary_{file}", roi_binary)
|
| 157 |
|
| 158 |
# Square size in mm
|
| 159 |
-
# square_size_mm =
|
| 160 |
|
| 161 |
# # Compute the calculated scaling factors and compare
|
| 162 |
# calculated_scaling_factor = square_size_mm / height_px
|
|
@@ -175,4 +177,4 @@ if __name__ == "__main__":
|
|
| 175 |
except Exception as e:
|
| 176 |
from traceback import print_exc
|
| 177 |
print(print_exc())
|
| 178 |
-
print(f"Error: {e}")
|
|
|
|
| 30 |
raise ValueError("Invalid feature detector. Choose 'ORB' or 'SIFT'.")
|
| 31 |
|
| 32 |
def find_scaling_square(
|
| 33 |
+
self, reference_image_path, target_image, known_size_mm, roi_margin=30
|
| 34 |
):
|
| 35 |
"""
|
| 36 |
Detect the scaling square in the target image based on the reference image.
|
|
|
|
| 50 |
|
| 51 |
# # Select the largest square-like contour
|
| 52 |
largest_square = None
|
| 53 |
+
largest_square_area = 0
|
| 54 |
+
for contour in contours:
|
| 55 |
+
x_c, y_c, w_c, h_c = cv2.boundingRect(contour)
|
| 56 |
+
aspect_ratio = w_c / float(h_c)
|
| 57 |
+
if 0.9 <= aspect_ratio <= 1.1:
|
| 58 |
+
peri = cv2.arcLength(contour, True)
|
| 59 |
+
approx = cv2.approxPolyDP(contour, 0.02 * peri, True)
|
| 60 |
+
if len(approx) == 4:
|
| 61 |
+
area = cv2.contourArea(contour)
|
| 62 |
+
if area > largest_square_area:
|
| 63 |
+
largest_square = contour
|
| 64 |
+
largest_square_area = area
|
| 65 |
|
| 66 |
# if largest_square is None:
|
| 67 |
# raise ValueError("No square-like contour found in the ROI.")
|
| 68 |
+
|
|
|
|
| 69 |
# Draw the largest contour on the original image
|
| 70 |
target_image_color = cv2.cvtColor(target_image, cv2.COLOR_GRAY2BGR)
|
| 71 |
cv2.drawContours(
|
|
|
|
| 82 |
|
| 83 |
# Calculate the scaling factor
|
| 84 |
avg_square_size_px = (square_width_px + square_height_px) / 2
|
| 85 |
+
scaling_factor = 0.5 / avg_square_size_px # mm per pixel
|
| 86 |
|
| 87 |
return scaling_factor #, square_height_px, square_width_px, roi_binary
|
| 88 |
|
|
|
|
| 101 |
|
| 102 |
|
| 103 |
def calculate_scaling_factor(
|
| 104 |
+
reference_image_path,
|
| 105 |
target_image,
|
| 106 |
+
known_square_size_mm=12.7,
|
| 107 |
feature_detector="ORB",
|
| 108 |
debug=False,
|
| 109 |
roi_margin=30,
|
|
|
|
| 113 |
|
| 114 |
# Find scaling square and calculate scaling factor
|
| 115 |
scaling_factor = detector.find_scaling_square(
|
| 116 |
+
reference_image_path=reference_image_path,
|
| 117 |
target_image=target_image,
|
| 118 |
+
known_size_mm=known_square_size_mm,
|
| 119 |
roi_margin=roi_margin,
|
| 120 |
)
|
| 121 |
|
|
|
|
| 148 |
try:
|
| 149 |
|
| 150 |
scaling_factor = calculate_scaling_factor(
|
| 151 |
+
reference_image_path="./Reference_ScalingBox.jpg",
|
| 152 |
target_image=box_img,
|
| 153 |
+
known_square_size_mm=12.7,
|
| 154 |
feature_detector="ORB",
|
| 155 |
debug=False,
|
| 156 |
roi_margin=90,
|
|
|
|
| 158 |
# cv2.imwrite(f"./outputs/{idx}_binary_{file}", roi_binary)
|
| 159 |
|
| 160 |
# Square size in mm
|
| 161 |
+
# square_size_mm = 12.7
|
| 162 |
|
| 163 |
# # Compute the calculated scaling factors and compare
|
| 164 |
# calculated_scaling_factor = square_size_mm / height_px
|
|
|
|
| 177 |
except Exception as e:
|
| 178 |
from traceback import print_exc
|
| 179 |
print(print_exc())
|
| 180 |
+
print(f"Error: {e}")
|