test_mapping.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import argparse
  2. import json
  3. def load_mapping(path: str):
  4. with open(path, 'r', encoding='utf-8') as f:
  5. data = json.load(f)
  6. pan_lookup = data['pan_lookup']
  7. tilt_lookup = data['tilt_lookup']
  8. def interp(lookup, ratio):
  9. if not lookup:
  10. return 0.0
  11. if len(lookup) == 1:
  12. return lookup[0][1]
  13. if ratio <= lookup[0][0]:
  14. return lookup[0][1]
  15. if ratio >= lookup[-1][0]:
  16. return lookup[-1][1]
  17. lo, hi = 0, len(lookup) - 1
  18. while lo < hi - 1:
  19. mid = (lo + hi) // 2
  20. if lookup[mid][0] <= ratio:
  21. lo = mid
  22. else:
  23. hi = mid
  24. x0, v0 = lookup[lo]
  25. x1, v1 = lookup[hi]
  26. if abs(x1 - x0) < 1e-10:
  27. return v0
  28. return v0 + (ratio - x0) / (x1 - x0) * (v1 - v0)
  29. def transform(x: int, y: int):
  30. x_ratio = x / 3840.0
  31. y_ratio = y / 1080.0
  32. pan = interp(pan_lookup, x_ratio) % 360
  33. tilt = max(-90, min(90, interp(tilt_lookup, y_ratio)))
  34. return pan, tilt
  35. return transform, data
  36. def main():
  37. parser = argparse.ArgumentParser()
  38. parser.add_argument('--mapping', default='calibration_group1.json')
  39. parser.add_argument('--x', type=int, default=1920)
  40. parser.add_argument('--y', type=int, default=540)
  41. args = parser.parse_args()
  42. transform, data = load_mapping(args.mapping)
  43. pan, tilt = transform(args.x, args.y)
  44. print(f'Input: ({args.x}, {args.y})')
  45. print(f'Output: pan={pan:.2f}°, tilt={tilt:.2f}°')
  46. print(f'RMS error: {data.get("rms_error", -1):.2f}°')
  47. if __name__ == '__main__':
  48. main()