mlbench123 commited on
Commit
eb2ee96
·
verified ·
1 Parent(s): 51be391

Update scalingtestupdated.py

Browse files
Files changed (1) hide show
  1. scalingtestupdated.py +74 -1
scalingtestupdated.py CHANGED
@@ -271,7 +271,80 @@ def calculate_paper_scaling_factor(
271
  print(f"Final scaling factor: {scaling_factor:.6f} {unit_string}")
272
 
273
  return scaling_factor, unit_string
274
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
 
276
  # Example usage:
277
  if __name__ == "__main__":
 
271
  print(f"Final scaling factor: {scaling_factor:.6f} {unit_string}")
272
 
273
  return scaling_factor, unit_string
274
+
275
+ def calculate_paper_scaling_factor_corrected(
276
+ paper_contour: np.ndarray,
277
+ paper_size: str,
278
+ output_unit: str = "mm",
279
+ correction_factor: float = 0.79,
280
+ method: str = "average"
281
+ ) -> Tuple[float, str]:
282
+ """
283
+ Calculate scaling factor with configurable correction and method.
284
+
285
+ :param paper_contour: Detected paper contour
286
+ :param paper_size: Paper size identifier ("A4", "A3", "US Letter")
287
+ :param output_unit: Desired unit for scaling factor ("mm" or "inches")
288
+ :param correction_factor: Empirical correction factor (default 0.79)
289
+ :param method: Calculation method ("min", "max", "average", "auto")
290
+ :return: Tuple of (scaling_factor, unit_string)
291
+ """
292
+ # Get paper dimensions in the desired unit
293
+ if output_unit == "inches":
294
+ expected_width = PAPER_SIZES[paper_size]["width_inches"]
295
+ expected_height = PAPER_SIZES[paper_size]["height_inches"]
296
+ unit_string = "inches per pixel"
297
+ else:
298
+ expected_width = PAPER_SIZES[paper_size]["width_mm"]
299
+ expected_height = PAPER_SIZES[paper_size]["height_mm"]
300
+ unit_string = "mm per pixel"
301
+
302
+ # Calculate bounding rectangle of paper contour
303
+ rect = cv2.boundingRect(paper_contour)
304
+ detected_width_px = rect[2]
305
+ detected_height_px = rect[3]
306
+
307
+ # Calculate scaling factors for both dimensions
308
+ scale_x = expected_width / detected_width_px
309
+ scale_y = expected_height / detected_height_px
310
+
311
+ # Choose scaling method
312
+ if method == "min":
313
+ base_scaling_factor = min(scale_x, scale_y)
314
+ elif method == "max":
315
+ base_scaling_factor = max(scale_x, scale_y)
316
+ elif method == "average":
317
+ base_scaling_factor = (scale_x + scale_y) / 2
318
+ elif method == "auto":
319
+ # Auto-select based on aspect ratio similarity
320
+ detected_aspect = detected_width_px / detected_height_px
321
+ expected_aspect = expected_width / expected_height
322
+
323
+ # If aspect ratios are similar, use average; otherwise use method that matches better
324
+ aspect_diff = abs(detected_aspect - expected_aspect)
325
+ aspect_diff_inv = abs(detected_aspect - (1/expected_aspect))
326
+
327
+ if aspect_diff < aspect_diff_inv:
328
+ base_scaling_factor = (scale_x + scale_y) / 2 # Same orientation
329
+ else:
330
+ # Different orientation - swap and recalculate
331
+ scale_x_swap = expected_height / detected_width_px
332
+ scale_y_swap = expected_width / detected_height_px
333
+ base_scaling_factor = (scale_x_swap + scale_y_swap) / 2
334
+ else:
335
+ raise ValueError(f"Unknown method: {method}")
336
+
337
+ # Apply correction factor
338
+ scaling_factor = base_scaling_factor * correction_factor
339
+
340
+ print(f"Paper detection: {detected_width_px}x{detected_height_px} px")
341
+ print(f"Expected paper size: {expected_width}x{expected_height} {output_unit}")
342
+ print(f"Scale X: {scale_x:.6f}, Scale Y: {scale_y:.6f}")
343
+ print(f"Method: {method}, Base scaling: {base_scaling_factor:.6f}")
344
+ print(f"Correction factor: {correction_factor}")
345
+ print(f"Final scaling factor: {scaling_factor:.6f} {unit_string}")
346
+
347
+ return scaling_factor, unit_string
348
 
349
  # Example usage:
350
  if __name__ == "__main__":