diff --git a/pipeline/1_detect_aruco_observations.py b/pipeline/1_detect_aruco_observations.py index 90f9405..e9d591d 100644 --- a/pipeline/1_detect_aruco_observations.py +++ b/pipeline/1_detect_aruco_observations.py @@ -16,6 +16,17 @@ import numpy as np # Utilities # ------------------------------------------------------------ + +def resolve_path(path): + path = os.path.expanduser(path) + + # Absoluter Pfad → direkt verwenden + if os.path.isabs(path): + return path + + # Relativer Pfad → absolut machen (auf Basis aktuellem cwd) + return os.path.abspath(path) + def load_intrinsics_npz(npz_path: str): data = np.load(npz_path) @@ -40,6 +51,9 @@ def load_intrinsics_npz(npz_path: str): def load_robot_vision_config(robot_json_path: str): + + + robot_json_path = resolve_path(robot_json_path) with open(robot_json_path, 'r', encoding='utf-8') as f: robot = json.load(f) @@ -338,8 +352,10 @@ def main(): ) args = parser.parse_args() + + out_dir = resolve_path(args.outDir) + os.makedirs(out_dir, exist_ok=True) - os.makedirs(args.outDir, exist_ok=True) # -------------------------------------------------------- # Load robot vision config @@ -354,7 +370,10 @@ def main(): # Load image # -------------------------------------------------------- - image = cv2.imread(args.image) + + image_path = resolve_path(args.image) + image = cv2.imread(image_path) + if image is None: raise RuntimeError(f'Cannot read image: {args.image}') @@ -370,7 +389,9 @@ def main(): # Intrinsics # -------------------------------------------------------- - K, D = load_intrinsics_npz(args.intrinsics) + + intrinsics_path = resolve_path(args.intrinsics) + K, D = load_intrinsics_npz(intrinsics_path) # -------------------------------------------------------- # Detection @@ -562,7 +583,7 @@ def main(): input_base = os.path.splitext(input_filename)[0] out_json = os.path.join( - args.outDir, + out_dir, f'{input_base}_aruco_detection.json' ) diff --git a/pipeline/2_Multiview.py b/pipeline/2_Multiview.py index 84ea3b5..24433e6 100644 --- a/pipeline/2_Multiview.py +++ b/pipeline/2_Multiview.py @@ -170,7 +170,7 @@ class ObservationQualityConfig: def _load_nested_quality_config(src: Dict[str, Any]) -> Dict[str, Any]: if not isinstance(src, dict): return {} - for key in ("multiview_quality", "multiviewQuality", "quality_config", "multiview"): + for key in ("multiview_quality","multiview_calculation", "multiviewQuality", "quality_config", "multiview"): v = src.get(key) if isinstance(v, dict): return v diff --git a/pipeline/2_Multiview_Trial/multiview_pose.json b/pipeline/2_Multiview_Trial/multiview_pose.json new file mode 100644 index 0000000..fba7e38 --- /dev/null +++ b/pipeline/2_Multiview_Trial/multiview_pose.json @@ -0,0 +1,2471 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-28T21:58:12.453984Z", + "source_robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json", + "source_detections": [ + "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json" + ], + "robot_pose": { + "state": { + "x": 6.55912456537666, + "y": 4.460952073670867, + "z": 30.7175200969605, + "a": 11.566185446462232, + "b": 1.999999999999993, + "c": 8.999999999999904, + "e": 0.9999999999999776 + }, + "uncertainty": { + "x_mm": 3481.5587672468964, + "y_mm": 1721.1687436205234, + "z_mm": 230.0328185419544, + "a_deg": 559.8212894814748, + "b_deg": 10506.72751291286, + "c_deg": 10506.727245747321, + "e_mm": 105067.37089893252 + }, + "confidence": { + "x": 6.278037366676565e-152, + "y": 1.7807019001431863e-75, + "z": 1.0228256841704706e-10, + "a": 4.8671004844006695e-25, + "b": 0.0, + "c": 0.0, + "e": 0.36787944117144233 + } + }, + "camera_poses": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "camera_id": "cam1", + "camera_position_world_m": [ + -0.48713303571291616, + -0.7715360575930439, + 0.14953088354489824 + ], + "rvec": [ + 1.9541362695264402, + 0.8822677917940757, + 1.5766838362137556 + ], + "tvec": [ + 0.061087566675323, + -0.1719235401502643, + 0.906441709831749 + ], + "intrinsics": { + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "observation_count": 14 + }, + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "camera_id": "cam1", + "camera_position_world_m": [ + -1.6303219880576203, + 3.51287453308301, + 3.2153725079243105 + ], + "rvec": [ + -4.922763361494977, + -1.9372228726605645, + -0.8634745374702567 + ], + "tvec": [ + 0.40274693422709124, + 0.40259001405514877, + -5.001257224158397 + ], + "intrinsics": { + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "observation_count": 11 + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "camera_id": "cam1", + "camera_position_world_m": [ + 9.875554551448467, + -19.520795422275746, + 4.064291036134082 + ], + "rvec": [ + -3.070508302109151, + -3.013701571556592, + -1.023299829029131 + ], + "tvec": [ + 0.7571981809096362, + -0.24288397753597846, + 22.23677475560832 + ], + "intrinsics": { + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "observation_count": 9 + }, + { + "view_index": 3, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json", + "camera_id": "cam1", + "camera_position_world_m": [ + -0.07894709786604179, + -0.5930070260577565, + 1.0455215751225158 + ], + "rvec": [ + -3.1591117140290805, + -1.5673895105365265, + -0.5417451235673743 + ], + "tvec": [ + -0.008681949901032555, + -0.008067751015250885, + 1.2045185247232495 + ], + "intrinsics": { + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "observation_count": 6 + } + ], + "marker_positions": [ + { + "marker_id": 210, + "link_name": "Board", + "position_world_m": [ + 0.02, + -0.02, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.3483281753274218, + "mean_detector_confidence": 0.4416265006808409, + "mean_reprojection_error_px": 758.8503648611904, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.4416265006808409, + "confidence_weighted": 0.3483281753274218, + "quality": { + "detector_confidence": 0.4416265006808409, + "weighted_confidence": 0.3483281753274218, + "q": { + "size": 0.7631931686401368, + "aspect": 0.6720365161330434, + "border": 0.8083333333333333, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7652561321016037, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.928957950592041, + "aspect": 0.9016109548399129, + "border": 0.9980833333333333, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9530512264203208, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7887392961935387, + "raw": { + "mean_edge_px": 38.159658432006836, + "edge_ratio": 1.9760287603241775, + "distance_to_border_px": 97.0, + "distance_to_center_norm": 0.7171543836593628, + "laplacian_var": 2874.586081340775 + } + }, + "mean_reprojection_error_px": 758.8503648611904, + "corner_reprojection_errors_px": [ + 775.0797309842314, + 711.6798482787276, + 742.306747358212, + 806.3351328235907 + ] + } + ] + }, + { + "marker_id": 211, + "link_name": "Board", + "position_world_m": [ + 0.25, + -0.01, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 2, + "mean_confidence": 0.3056927898732239, + "mean_detector_confidence": 0.23870369098208438, + "mean_reprojection_error_px": 290.9103483736556, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.38796888201791047, + "confidence_weighted": 0.3113855797464478, + "quality": { + "detector_confidence": 0.38796888201791047, + "weighted_confidence": 0.3113855797464478, + "q": { + "size": 0.6876940250396728, + "aspect": 0.7318081135752206, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.8639457741983584, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9063082075119018, + "aspect": 0.9195424340725661, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9727891548396718, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.802604523658866, + "raw": { + "mean_edge_px": 34.38470125198364, + "edge_ratio": 1.7329568542620777, + "distance_to_border_px": 189.0, + "distance_to_center_norm": 0.2186174839735031, + "laplacian_var": 2547.242275529489 + } + }, + "mean_reprojection_error_px": 231.49921712096614, + "corner_reprojection_errors_px": [ + 253.96262518024184, + 197.12106867844943, + 208.62553060741286, + 266.28764401776033 + ] + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.08943849994625828, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.08943849994625828, + "weighted_confidence": 0.3, + "q": { + "size": 0.5929935836791992, + "aspect": 0.641292884319935, + "border": 0.36666666666666664, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.4919377746218241, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8778980751037597, + "aspect": 0.8923878652959805, + "border": 0.9936666666666667, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.8983875549243648, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.6923686513984841, + "raw": { + "mean_edge_px": 29.64967918395996, + "edge_ratio": 2.1186998154843373, + "distance_to_border_px": 44.0, + "distance_to_center_norm": 0.43983229994773865, + "laplacian_var": 7191.154587636113 + } + }, + "mean_reprojection_error_px": 350.3214796263451, + "corner_reprojection_errors_px": [ + 361.5605798200321, + 340.28246470409385, + 339.65343207799674, + 359.7894419032577 + ] + } + ] + }, + { + "marker_id": 215, + "link_name": "Board", + "position_world_m": [ + 0.25, + -0.09, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 4, + "mean_confidence": 0.3381343382862138, + "mean_detector_confidence": 0.2588769864840585, + "mean_reprojection_error_px": 211.6131423011121, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.5037197881520409, + "confidence_weighted": 0.40900734291454277, + "quality": { + "detector_confidence": 0.5037197881520409, + "weighted_confidence": 0.40900734291454277, + "q": { + "size": 0.7528261661529541, + "aspect": 0.7547948155461992, + "border": 0.9166666666666666, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7850091712814492, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9258478498458862, + "aspect": 0.9264384446638597, + "border": 0.9991666666666666, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9570018342562899, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8119739437178702, + "raw": { + "mean_edge_px": 37.641308307647705, + "edge_ratio": 1.6497267320956905, + "distance_to_border_px": 110.0, + "distance_to_center_norm": 0.3189203441143036, + "laplacian_var": 2749.1520781451327 + } + }, + "mean_reprojection_error_px": 177.0749543610811, + "corner_reprojection_errors_px": [ + 196.79106893919663, + 134.57080406896335, + 158.9416166501152, + 217.99632778604916 + ] + }, + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.41107712357601517, + "confidence_weighted": 0.34353001023031243, + "quality": { + "detector_confidence": 0.41107712357601517, + "weighted_confidence": 0.34353001023031243, + "q": { + "size": 0.5317800521850586, + "aspect": 0.9402383522012984, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8595340156555176, + "aspect": 0.9820715056603895, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8356826262719236, + "raw": { + "mean_edge_px": 26.58900260925293, + "edge_ratio": 1.1271202087402343, + "distance_to_border_px": 187.0, + "distance_to_center_norm": 0.26774296164512634, + "laplacian_var": 4369.211595731346 + } + }, + "mean_reprojection_error_px": 294.4307433838752, + "corner_reprojection_errors_px": [ + 312.85906471652027, + 283.9333828806244, + 275.7875334060306, + 305.1429925323255 + ] + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.05141840543087185, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.05141840543087185, + "weighted_confidence": 0.3, + "q": { + "size": 0.6390896797180176, + "aspect": 0.7047233856633357, + "border": 0.13333333333333333, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.556960545394987, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8917269039154052, + "aspect": 0.9114170156990007, + "border": 0.9913333333333333, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9113921090789975, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7269577490530728, + "raw": { + "mean_edge_px": 31.95448398590088, + "edge_ratio": 1.837992949698211, + "distance_to_border_px": 16.0, + "distance_to_center_norm": 0.46000775694847107, + "laplacian_var": 3883.9669476486242 + } + }, + "mean_reprojection_error_px": 352.49848890962363, + "corner_reprojection_errors_px": [ + 357.5883238270857, + 342.95973079735023, + 348.24035080992854, + 361.20555020413 + ] + }, + { + "view_index": 3, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d.png", + "confidence_detector": 0.06929262877730606, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.06929262877730606, + "weighted_confidence": 0.3, + "q": { + "size": 0.5661466503143311, + "aspect": 0.5482316201322766, + "border": 0.23333333333333334, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.8568993181056268, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8698439950942993, + "aspect": 0.8644694860396829, + "border": 0.9923333333333333, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9713798636211254, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7175842680080672, + "raw": { + "mean_edge_px": 28.307332515716553, + "edge_ratio": 2.6480931171344015, + "distance_to_border_px": 28.0, + "distance_to_center_norm": 0.4717576801776886, + "laplacian_var": 3397.867051357801 + } + }, + "mean_reprojection_error_px": 22.448382549868548, + "corner_reprojection_errors_px": [ + 13.096788001497826, + 21.068385676111582, + 22.352352816340563, + 33.27600370552422 + ] + } + ] + }, + { + "marker_id": 214, + "link_name": "Board", + "position_world_m": [ + 0.35000000000000003, + -0.01, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.3303326815243811, + "mean_detector_confidence": 0.3960258687743258, + "mean_reprojection_error_px": 42.930103667947954, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.3960258687743258, + "confidence_weighted": 0.3303326815243811, + "quality": { + "detector_confidence": 0.3960258687743258, + "weighted_confidence": 0.3303326815243811, + "q": { + "size": 0.66856689453125, + "aspect": 0.7852261315707791, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9005700683593749, + "aspect": 0.9355678394712337, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8341189492159672, + "raw": { + "mean_edge_px": 33.4283447265625, + "edge_ratio": 1.5470369866565286, + "distance_to_border_px": 221.0, + "distance_to_center_norm": 0.24952663481235504, + "laplacian_var": 3101.8661949456414 + } + }, + "mean_reprojection_error_px": 42.930103667947954, + "corner_reprojection_errors_px": [ + 63.65457097198778, + 37.633153664497435, + 10.01804487064627, + 60.41464516466032 + ] + } + ] + }, + { + "marker_id": 208, + "link_name": "Board", + "position_world_m": [ + 0.35000000000000003, + -0.09, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.43393738276215404, + "mean_detector_confidence": 0.5319424141712054, + "mean_reprojection_error_px": 54.47389832687715, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.5319424141712054, + "confidence_weighted": 0.43393738276215404, + "quality": { + "detector_confidence": 0.5319424141712054, + "weighted_confidence": 0.43393738276215404, + "q": { + "size": 0.7370357513427734, + "aspect": 0.821357792263213, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7261479943917021, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.921110725402832, + "aspect": 0.9464073376789639, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9452295988783405, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8157600732745698, + "raw": { + "mean_edge_px": 36.85178756713867, + "edge_ratio": 1.4349924221076584, + "distance_to_border_px": 146.0, + "distance_to_center_norm": 0.3784599006175995, + "laplacian_var": 2772.7042557487066 + } + }, + "mean_reprojection_error_px": 54.47389832687715, + "corner_reprojection_errors_px": [ + 15.312847171665988, + 73.26667971352667, + 81.02001712051374, + 48.2960493018022 + ] + } + ] + }, + { + "marker_id": 206, + "link_name": "Board", + "position_world_m": [ + 0.65, + -0.01, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.3, + "mean_detector_confidence": 0.19038167007366058, + "mean_reprojection_error_px": 498.47380379992535, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.19038167007366058, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.19038167007366058, + "weighted_confidence": 0.3, + "q": { + "size": 0.6357332134246826, + "aspect": 0.8842177870012652, + "border": 0.21666666666666667, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7058844598483994, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8907199640274047, + "aspect": 0.9652653361003796, + "border": 0.9921666666666666, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9411768919696799, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7948386541418282, + "raw": { + "mean_edge_px": 31.78666067123413, + "edge_ratio": 1.261886188450016, + "distance_to_border_px": 26.0, + "distance_to_center_norm": 0.7981697916984558, + "laplacian_var": 3871.735724826389 + } + }, + "mean_reprojection_error_px": 498.47380379992535, + "corner_reprojection_errors_px": [ + 474.78294975945636, + 521.9194241659483, + 522.7026505712303, + 474.49019070306656 + ] + } + ] + }, + { + "marker_id": 205, + "link_name": "Board", + "position_world_m": [ + 0.75, + -0.09, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.3, + "mean_detector_confidence": 0.18785835826030667, + "mean_reprojection_error_px": 44.03730420295543, + "observations": [ + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.18785835826030667, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.18785835826030667, + "weighted_confidence": 0.3, + "q": { + "size": 0.4230596446990967, + "aspect": 0.8088191084639168, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.6781522001878938, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.826917893409729, + "aspect": 0.942645732539175, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9356304400375788, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7220220034113609, + "raw": { + "mean_edge_px": 21.152982234954834, + "edge_ratio": 1.4727407884790649, + "distance_to_border_px": 154.0, + "distance_to_center_norm": 0.592435896396637, + "laplacian_var": 6429.502369959987 + } + }, + "mean_reprojection_error_px": 44.03730420295543, + "corner_reprojection_errors_px": [ + 29.717980896050413, + 52.601082625668774, + 56.712389073392295, + 37.117764216710235 + ] + } + ] + }, + { + "marker_id": 207, + "link_name": "Board", + "position_world_m": [ + 0.75, + -0.01, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 0, + "mean_confidence": null, + "mean_detector_confidence": null, + "mean_reprojection_error_px": null, + "observations": [] + }, + { + "marker_id": 217, + "link_name": "Board", + "position_world_m": [ + 0.65, + -0.09, + 0.0003 + ], + "size_m": 0.025, + "observation_count": 2, + "mean_confidence": 0.3, + "mean_detector_confidence": 0.1821140355600835, + "mean_reprojection_error_px": 269.61737021659803, + "observations": [ + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.2249742899551776, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.2249742899551776, + "weighted_confidence": 0.3, + "q": { + "size": 0.4368094825744629, + "aspect": 0.851679135556665, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.9999910921361927, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8310428447723388, + "aspect": 0.9555037406669995, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9999982184272386, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7861225008292394, + "raw": { + "mean_edge_px": 21.840474128723145, + "edge_ratio": 1.3483022144164452, + "distance_to_border_px": 214.0, + "distance_to_center_norm": 0.4999745190143585, + "laplacian_var": 5430.93808109255 + } + }, + "mean_reprojection_error_px": 18.467711212281156, + "corner_reprojection_errors_px": [ + 29.811371960327854, + 14.557590472830523, + 4.912020202911001, + 24.589862213055245 + ] + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.1392537811649894, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.1392537811649894, + "weighted_confidence": 0.3, + "q": { + "size": 0.577611255645752, + "aspect": 0.9064414480888865, + "border": 0.6666666666666666, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7084579232514983, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8732833766937256, + "aspect": 0.9719324344266659, + "border": 0.9966666666666667, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9416915846502997, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7886514136174146, + "raw": { + "mean_edge_px": 28.880562782287598, + "edge_ratio": 1.2064304365348024, + "distance_to_border_px": 80.0, + "distance_to_center_norm": 0.8127716183662415, + "laplacian_var": 8107.970519250205 + } + }, + "mean_reprojection_error_px": 520.7670292209149, + "corner_reprojection_errors_px": [ + 493.6454225228156, + 517.4266083215757, + 547.140071058734, + 524.8560149805343 + ] + } + ] + }, + { + "marker_id": 198, + "link_name": "Arm1", + "position_world_m": [ + 0.00655912456537666, + -0.1567930034961029, + 0.04733871623387214 + ], + "size_m": 0.025, + "observation_count": 2, + "mean_confidence": 0.3108963478935583, + "mean_detector_confidence": 0.25863499196293854, + "mean_reprojection_error_px": 337.9639546433526, + "observations": [ + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.46624605291299914, + "confidence_weighted": 0.3217926957871166, + "quality": { + "detector_confidence": 0.46624605291299914, + "weighted_confidence": 0.3217926957871166, + "q": { + "size": 0.5882470607757568, + "aspect": 0.9248656150270715, + "border": 1.0, + "center": 0.0, + "sharpness": 0.6901534994976499, + "homography": 0.8146167254413033, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.876474118232727, + "aspect": 0.9774596845081214, + "border": 1.0, + "center": 0.99, + "sharpness": 0.845076749748825, + "homography": 0.9629233450882607, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.6901778444592274, + "raw": { + "mean_edge_px": 29.412353038787842, + "edge_ratio": 1.162476328997763, + "distance_to_border_px": 269.0, + "distance_to_center_norm": 0.3762875199317932, + "laplacian_var": 1725.383748744125 + } + }, + "mean_reprojection_error_px": 189.61449895020723, + "corner_reprojection_errors_px": [ + 209.07974833689318, + 197.47038181575954, + 170.5342701953749, + 181.37359545280128 + ] + }, + { + "view_index": 3, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d.png", + "confidence_detector": 0.0510239310128779, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.0510239310128779, + "weighted_confidence": 0.3, + "q": { + "size": 0.5385300350189209, + "aspect": 0.3295155319224475, + "border": 1.0, + "center": 0.0, + "sharpness": 0.9865076867937258, + "homography": 0.8166856608858617, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8615590105056763, + "aspect": 0.7988546595767342, + "border": 1.0, + "center": 0.99, + "sharpness": 0.993253843396863, + "homography": 0.9633371321771724, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.6519684065883232, + "raw": { + "mean_edge_px": 26.926501750946045, + "edge_ratio": 5.069516627430802, + "distance_to_border_px": 297.0, + "distance_to_center_norm": 0.44209620356559753, + "laplacian_var": 2466.2692169843144 + } + }, + "mean_reprojection_error_px": 486.313410336498, + "corner_reprojection_errors_px": [ + 476.6404764624922, + 499.69201975496856, + 495.83109637342665, + 473.09004875510465 + ] + } + ] + }, + { + "marker_id": 229, + "link_name": "Arm1", + "position_world_m": [ + 0.00655912456537666, + -0.24652035508904152, + 0.05433888595446989 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.3, + "mean_detector_confidence": 0.5379225891327144, + "mean_reprojection_error_px": 62.23826715113174, + "observations": [ + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.5379225891327144, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.5379225891327144, + "weighted_confidence": 0.3, + "q": { + "size": 0.6362713241577148, + "aspect": 0.910763838558745, + "border": 1.0, + "center": 0.0, + "sharpness": 0.385498056932966, + "homography": 0.6309997127057123, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8908813972473144, + "aspect": 0.9732291515676235, + "border": 1.0, + "center": 0.99, + "sharpness": 0.692749028466483, + "homography": 0.9261999425411425, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.5507453882032249, + "raw": { + "mean_edge_px": 31.813566207885742, + "edge_ratio": 1.1959589471239185, + "distance_to_border_px": 304.0, + "distance_to_center_norm": 0.2734455466270447, + "laplacian_var": 963.7451423324151 + } + }, + "mean_reprojection_error_px": 62.23826715113174, + "corner_reprojection_errors_px": [ + 75.71678749251116, + 72.32884223844043, + 54.87790878688635, + 46.02953008668901 + ] + } + ] + }, + { + "marker_id": 242, + "link_name": "Arm1", + "position_world_m": [ + 0.00655912456537666, + -0.25196493153839533, + -0.015449054173371272 + ], + "size_m": 0.025, + "observation_count": 2, + "mean_confidence": 0.47658680981829316, + "mean_detector_confidence": 0.5996291439934041, + "mean_reprojection_error_px": 133.941280858906, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.3671963426996153, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.3671963426996153, + "weighted_confidence": 0.3, + "q": { + "size": 0.782774429321289, + "aspect": 0.6616966951791282, + "border": 1.0, + "center": 0.0, + "sharpness": 0.782467783261912, + "homography": 0.7293645830886961, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9348323287963867, + "aspect": 0.8985090085537384, + "border": 1.0, + "center": 0.99, + "sharpness": 0.891233891630956, + "homography": 0.9458729166177393, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7009964798277402, + "raw": { + "mean_edge_px": 39.13872146606445, + "edge_ratio": 2.022532853150459, + "distance_to_border_px": 178.0, + "distance_to_center_norm": 0.22833341360092163, + "laplacian_var": 1956.16945815478 + } + }, + "mean_reprojection_error_px": 176.26940851805202, + "corner_reprojection_errors_px": [ + 230.71759796451812, + 168.97223592521607, + 124.1425176361621, + 181.2452825463118 + ] + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.8320619452871927, + "confidence_weighted": 0.6531736196365863, + "quality": { + "detector_confidence": 0.8320619452871927, + "weighted_confidence": 0.6531736196365863, + "q": { + "size": 0.7786919784545898, + "aspect": 0.9508942783744123, + "border": 1.0, + "center": 0.0, + "sharpness": 0.7671467614713517, + "homography": 0.8780504143885439, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9336075935363769, + "aspect": 0.9852682835123237, + "border": 1.0, + "center": 0.99, + "sharpness": 0.8835733807356758, + "homography": 0.9756100828777088, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7850060002577552, + "raw": { + "mean_edge_px": 38.93459892272949, + "edge_ratio": 1.1032832413494709, + "distance_to_border_px": 268.0, + "distance_to_center_norm": 0.10511811822652817, + "laplacian_var": 1917.8669036783792 + } + }, + "mean_reprojection_error_px": 91.61315319975998, + "corner_reprojection_errors_px": [ + 83.02552272606934, + 70.18153140516513, + 104.90093390194606, + 108.34462476585934 + ] + } + ] + }, + { + "marker_id": 243, + "link_name": "Arm1", + "position_world_m": [ + 0.00655912456537666, + -0.284136613377639, + 0.022167204115226213 + ], + "size_m": 0.025, + "observation_count": 3, + "mean_confidence": 0.5494769405321164, + "mean_detector_confidence": 0.5950188217987598, + "mean_reprojection_error_px": 172.85132253754796, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.9552009083270357, + "confidence_weighted": 0.7823442101407496, + "quality": { + "detector_confidence": 0.9552009083270357, + "weighted_confidence": 0.7823442101407496, + "q": { + "size": 1.0, + "aspect": 0.9770872182586614, + "border": 0.49166666666666664, + "center": 0.0, + "sharpness": 0.7173229521664098, + "homography": 0.8755638328929586, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 1.0, + "aspect": 0.9931261654775984, + "border": 0.9949166666666667, + "center": 0.99, + "sharpness": 0.858661476083205, + "homography": 0.9751127665785918, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8190362920728039, + "raw": { + "mean_edge_px": 51.38640213012695, + "edge_ratio": 1.046900177001953, + "distance_to_border_px": 59.0, + "distance_to_center_norm": 0.37420061230659485, + "laplacian_var": 1793.3073804160247 + } + }, + "mean_reprojection_error_px": 339.0279661340851, + "corner_reprojection_errors_px": [ + 354.9874161526314, + 383.6647344074076, + 328.75812755165987, + 288.7015864246414 + ] + }, + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.17650066593904493, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.17650066593904493, + "weighted_confidence": 0.3, + "q": { + "size": 0.48494279861450196, + "aspect": 0.890291901634177, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8454828395843506, + "aspect": 0.9670875704902531, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8094793857725817, + "raw": { + "mean_edge_px": 24.247139930725098, + "edge_ratio": 1.246454220608877, + "distance_to_border_px": 287.0, + "distance_to_center_norm": 0.20457716286182404, + "laplacian_var": 4812.180202920881 + } + }, + "mean_reprojection_error_px": 13.281317448967565, + "corner_reprojection_errors_px": [ + 2.2968086981840976, + 18.554156096455, + 10.480663614727677, + 21.793641386503488 + ] + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.6533548911301985, + "confidence_weighted": 0.5660866114555992, + "quality": { + "detector_confidence": 0.6533548911301985, + "weighted_confidence": 0.5660866114555992, + "q": { + "size": 0.7578911209106445, + "aspect": 0.8941768972010622, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.8733529848599262, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9273673362731933, + "aspect": 0.9682530691603186, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9746705969719853, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.866430509881637, + "raw": { + "mean_edge_px": 37.89455604553223, + "edge_ratio": 1.2366938871495865, + "distance_to_border_px": 173.0, + "distance_to_center_norm": 0.23434503376483917, + "laplacian_var": 2979.227522027412 + } + }, + "mean_reprojection_error_px": 166.24468402959118, + "corner_reprojection_errors_px": [ + 192.60170316925314, + 173.93985397191574, + 140.07285354979507, + 158.3643254274008 + ] + } + ] + }, + { + "marker_id": 244, + "link_name": "Ellbow", + "position_world_m": [ + 0.13155912456537666, + 0.0, + 0.0 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.5777174098392668, + "mean_detector_confidence": 0.9814590862656559, + "mean_reprojection_error_px": 200.7700126680694, + "observations": [ + { + "view_index": 3, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d.png", + "confidence_detector": 0.9814590862656559, + "confidence_weighted": 0.5777174098392668, + "quality": { + "detector_confidence": 0.9814590862656559, + "weighted_confidence": 0.5777174098392668, + "q": { + "size": 0.9861616897583008, + "aspect": 0.9906427975915026, + "border": 1.0, + "center": 0.0, + "sharpness": 0.19747272078644865, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9958485069274902, + "aspect": 0.9971928392774507, + "border": 1.0, + "center": 0.99, + "sharpness": 0.5987363603932243, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.5886311695757162, + "raw": { + "mean_edge_px": 49.30808448791504, + "edge_ratio": 1.0188911733497625, + "distance_to_border_px": 248.0, + "distance_to_center_norm": 0.17079654335975647, + "laplacian_var": 493.6818019661216 + } + }, + "mean_reprojection_error_px": 200.7700126680694, + "corner_reprojection_errors_px": [ + 231.5048407933512, + 174.19610084701335, + 169.58139960519856, + 227.79770942671436 + ] + } + ] + }, + { + "marker_id": 245, + "link_name": "Ellbow", + "position_world_m": [ + 0.09655912456537666, + -0.020164383694254998, + -0.02860764985508008 + ], + "size_m": 0.025, + "observation_count": 0, + "mean_confidence": null, + "mean_detector_confidence": null, + "mean_reprojection_error_px": null, + "observations": [] + }, + { + "marker_id": 246, + "link_name": "Ellbow", + "position_world_m": [ + 0.09655912456537666, + 0.020164383694254998, + 0.02860764985508008 + ], + "size_m": 0.025, + "observation_count": 2, + "mean_confidence": 0.3266808779628478, + "mean_detector_confidence": 0.37938104817156426, + "mean_reprojection_error_px": 89.7074210088771, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.40276248577722906, + "confidence_weighted": 0.3533617559256956, + "quality": { + "detector_confidence": 0.40276248577722906, + "weighted_confidence": 0.3533617559256956, + "q": { + "size": 0.8747386932373047, + "aspect": 0.8729494143620027, + "border": 0.21666666666666667, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.8242773912149799, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9624216079711914, + "aspect": 0.9618848243086007, + "border": 0.9921666666666666, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.964855478242996, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8773452553402469, + "raw": { + "mean_edge_px": 43.736934661865234, + "edge_ratio": 1.2910835004817602, + "distance_to_border_px": 26.0, + "distance_to_center_norm": 0.503339409828186, + "laplacian_var": 2659.0007176668505 + } + }, + "mean_reprojection_error_px": 141.1982350776677, + "corner_reprojection_errors_px": [ + 161.84778884756437, + 184.36682162845338, + 122.13151168709555, + 96.44681814755751 + ] + }, + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.35599961056589946, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.35599961056589946, + "weighted_confidence": 0.3, + "q": { + "size": 0.5299201774597168, + "aspect": 0.9682678126132868, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.6911398425620117, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8589760532379149, + "aspect": 0.990480343783986, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9382279685124024, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7902608870853858, + "raw": { + "mean_edge_px": 26.49600887298584, + "edge_ratio": 1.0655442367769516, + "distance_to_border_px": 212.0, + "distance_to_center_norm": 0.34622156620025635, + "laplacian_var": 4516.469387755102 + } + }, + "mean_reprojection_error_px": 38.216606940086514, + "corner_reprojection_errors_px": [ + 36.73636519034462, + 56.47519683546902, + 42.10141119720161, + 17.553454537330833 + ] + } + ] + }, + { + "marker_id": 247, + "link_name": "Ellbow", + "position_world_m": [ + 0.05905912456537666, + 0.020164383694254998, + 0.02860764985508008 + ], + "size_m": 0.025, + "observation_count": 3, + "mean_confidence": 0.3522257293798605, + "mean_detector_confidence": 0.3742802941449748, + "mean_reprojection_error_px": 103.25126252128358, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.5141836563018536, + "confidence_weighted": 0.4356210669043562, + "quality": { + "detector_confidence": 0.5141836563018536, + "weighted_confidence": 0.4356210669043562, + "q": { + "size": 0.8847895622253418, + "aspect": 0.8611466981455379, + "border": 0.2833333333333333, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.6580457942878655, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9654368686676025, + "aspect": 0.9583440094436613, + "border": 0.9928333333333333, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9316091588575731, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8472090887475099, + "raw": { + "mean_edge_px": 44.23947811126709, + "edge_ratio": 1.3224846641193186, + "distance_to_border_px": 34.0, + "distance_to_center_norm": 0.4482710361480713, + "laplacian_var": 3479.254611502003 + } + }, + "mean_reprojection_error_px": 111.14827539030856, + "corner_reprojection_errors_px": [ + 141.07196492933875, + 144.93548527557257, + 77.17592337830838, + 81.40972797801456 + ] + }, + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.37968459567149576, + "confidence_weighted": 0.3210561212352254, + "quality": { + "detector_confidence": 0.37968459567149576, + "weighted_confidence": 0.3210561212352254, + "q": { + "size": 0.5440906524658203, + "aspect": 0.9648689862798947, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.9999898763101295, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.863227195739746, + "aspect": 0.9894606958839683, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9999979752620259, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8455863758902774, + "raw": { + "mean_edge_px": 27.204532623291016, + "edge_ratio": 1.0728202776121034, + "distance_to_border_px": 242.0, + "distance_to_center_norm": 0.29484474658966064, + "laplacian_var": 5059.009879204021 + } + }, + "mean_reprojection_error_px": 32.08863696877227, + "corner_reprojection_errors_px": [ + 40.794956917573984, + 39.55902690886335, + 19.307658301310468, + 28.692905747341275 + ] + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.22897263046157504, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.22897263046157504, + "weighted_confidence": 0.3, + "q": { + "size": 0.639554100036621, + "aspect": 0.7806249311372698, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.8518453866610392, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8918662300109863, + "aspect": 0.9341874793411808, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9703690773322079, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8003978350063553, + "raw": { + "mean_edge_px": 31.977705001831055, + "edge_ratio": 1.5620498657226562, + "distance_to_border_px": 173.0, + "distance_to_center_norm": 0.25528469681739807, + "laplacian_var": 7445.596902165736 + } + }, + "mean_reprojection_error_px": 166.51687520476986, + "corner_reprojection_errors_px": [ + 178.4418290117887, + 171.69771390624726, + 156.90805404933934, + 159.01990385170407 + ] + } + ] + }, + { + "marker_id": 124, + "link_name": "Arm2", + "position_world_m": [ + 0.03576891406824046, + -0.10265508441074277, + 0.048763170957410715 + ], + "size_m": 0.025, + "observation_count": 3, + "mean_confidence": 0.508005832755296, + "mean_detector_confidence": 0.5414320779100015, + "mean_reprojection_error_px": 126.20680418269927, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.949313584995683, + "confidence_weighted": 0.8776452587539926, + "quality": { + "detector_confidence": 0.949313584995683, + "weighted_confidence": 0.8776452587539926, + "q": { + "size": 0.9221641159057617, + "aspect": 0.9739978136947991, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.8184413286291213, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9766492347717285, + "aspect": 0.9921993441084397, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9636882657258243, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.9245051083494014, + "raw": { + "mean_edge_px": 46.108205795288086, + "edge_ratio": 1.0533926995309433, + "distance_to_border_px": 192.0, + "distance_to_center_norm": 0.46835172176361084, + "laplacian_var": 3204.524815886671 + } + }, + "mean_reprojection_error_px": 120.30138979489449, + "corner_reprojection_errors_px": [ + 68.6641540938893, + 119.57642481440183, + 182.36304274188473, + 110.6019375294021 + ] + }, + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.1718675510228501, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.1718675510228501, + "weighted_confidence": 0.3, + "q": { + "size": 0.4610629081726074, + "aspect": 0.9137009410117576, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.8115418858720415, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8383188724517822, + "aspect": 0.9741102823035273, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9623083771744083, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7779771327911469, + "raw": { + "mean_edge_px": 23.05314540863037, + "edge_ratio": 1.1889000111845829, + "distance_to_border_px": 199.0, + "distance_to_center_norm": 0.25007718801498413, + "laplacian_var": 6205.9189333333325 + } + }, + "mean_reprojection_error_px": 87.24937833798808, + "corner_reprojection_errors_px": [ + 85.639799951079, + 75.52765471058183, + 88.09600853255034, + 99.73405015774115 + ] + }, + { + "view_index": 3, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d.png", + "confidence_detector": 0.5031150977114714, + "confidence_weighted": 0.34637223951189533, + "quality": { + "detector_confidence": 0.5031150977114714, + "weighted_confidence": 0.34637223951189533, + "q": { + "size": 0.7118920612335206, + "aspect": 0.8930124956169071, + "border": 1.0, + "center": 0.0, + "sharpness": 0.668197315288503, + "homography": 0.7143328883594936, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9135676183700561, + "aspect": 0.9679037486850721, + "border": 1.0, + "center": 0.99, + "sharpness": 0.8340986576442515, + "homography": 0.9428665776718987, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.6884552681631795, + "raw": { + "mean_edge_px": 35.594603061676025, + "edge_ratio": 1.2396103187989196, + "distance_to_border_px": 220.0, + "distance_to_center_norm": 0.34923961758613586, + "laplacian_var": 1670.4932882212574 + } + }, + "mean_reprojection_error_px": 171.06964441521524, + "corner_reprojection_errors_px": [ + 175.4620748933857, + 164.33947412904803, + 168.26300213513358, + 176.2140265032936 + ] + } + ] + }, + { + "marker_id": 122, + "link_name": "Arm2", + "position_world_m": [ + -0.027730156692230813, + -0.09558743372932975, + 0.058790200747043546 + ], + "size_m": 0.025, + "observation_count": 2, + "mean_confidence": 0.3665139891686267, + "mean_detector_confidence": 0.5013688483782409, + "mean_reprojection_error_px": 129.62465549450752, + "observations": [ + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.5176344554282131, + "confidence_weighted": 0.4330279783372534, + "quality": { + "detector_confidence": 0.5176344554282131, + "weighted_confidence": 0.4330279783372534, + "q": { + "size": 0.7740301132202149, + "aspect": 0.935511185087607, + "border": 1.0, + "center": 0.0, + "sharpness": 0.9453895875930711, + "homography": 0.75140634242195, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9322090339660645, + "aspect": 0.980653355526282, + "border": 1.0, + "center": 0.99, + "sharpness": 0.9726947937965356, + "homography": 0.9502812684843901, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8365516897035593, + "raw": { + "mean_edge_px": 38.70150566101074, + "edge_ratio": 1.1378686133108156, + "distance_to_border_px": 272.0, + "distance_to_center_norm": 0.3326369822025299, + "laplacian_var": 2363.473968982678 + } + }, + "mean_reprojection_error_px": 193.7189192299188, + "corner_reprojection_errors_px": [ + 186.60564074738417, + 163.92003814194825, + 199.21736971509952, + 225.1326283152433 + ] + }, + { + "view_index": 3, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d.png", + "confidence_detector": 0.4851032413282688, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.4851032413282688, + "weighted_confidence": 0.3, + "q": { + "size": 0.731085205078125, + "aspect": 0.8115917675776136, + "border": 1.0, + "center": 0.0, + "sharpness": 0.43024965706447194, + "homography": 0.8532569682196773, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9193255615234375, + "aspect": 0.9434775302732841, + "border": 1.0, + "center": 0.99, + "sharpness": 0.715124828532236, + "homography": 0.9706513936439355, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.5960479942620975, + "raw": { + "mean_edge_px": 36.55426025390625, + "edge_ratio": 1.4642931087996, + "distance_to_border_px": 288.0, + "distance_to_center_norm": 0.10956916958093643, + "laplacian_var": 1075.6241426611798 + } + }, + "mean_reprojection_error_px": 65.53039175909623, + "corner_reprojection_errors_px": [ + 56.3313256510254, + 88.66183178012872, + 73.38984512838569, + 43.738564476845106 + ] + } + ] + }, + { + "marker_id": 218, + "link_name": "Arm2", + "position_world_m": [ + 0.040848405822984137, + -0.08750152534318272, + 0.07026185489618844 + ], + "size_m": 0.025, + "observation_count": 3, + "mean_confidence": 0.5110340044402899, + "mean_detector_confidence": 0.5936696116143609, + "mean_reprojection_error_px": 96.05694849428976, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.7757269773484377, + "confidence_weighted": 0.7078236253434986, + "quality": { + "detector_confidence": 0.7757269773484377, + "weighted_confidence": 0.7078236253434986, + "q": { + "size": 1.0, + "aspect": 0.8737007290465043, + "border": 1.0, + "center": 0.0, + "sharpness": 0.9763658072737966, + "homography": 0.8471761820367973, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 1.0, + "aspect": 0.9621102187139512, + "border": 1.0, + "center": 0.99, + "sharpness": 0.9881829036368983, + "homography": 0.9694352364073595, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.9124648826355842, + "raw": { + "mean_edge_px": 52.5723762512207, + "edge_ratio": 1.2891133468352027, + "distance_to_border_px": 195.0, + "distance_to_center_norm": 0.38755714893341064, + "laplacian_var": 2440.9145181844915 + } + }, + "mean_reprojection_error_px": 44.91785116758648, + "corner_reprojection_errors_px": [ + 66.87429861859424, + 12.190233677115463, + 80.08712218921164, + 20.519750185424577 + ] + }, + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.3795150916059117, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.3795150916059117, + "weighted_confidence": 0.3, + "q": { + "size": 0.5467662620544433, + "aspect": 0.881723380356295, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7396448703253513, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.864029878616333, + "aspect": 0.9645170141068884, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9479289740650703, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.7820772385759307, + "raw": { + "mean_edge_px": 27.338313102722168, + "edge_ratio": 1.268285093213499, + "distance_to_border_px": 214.0, + "distance_to_center_norm": 0.2097853124141693, + "laplacian_var": 3255.6417126981264 + } + }, + "mean_reprojection_error_px": 91.7569250374452, + "corner_reprojection_errors_px": [ + 80.88336699585861, + 81.61043257212798, + 101.23095848802082, + 103.30294209377344 + ] + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.6257667658887336, + "confidence_weighted": 0.5252783879773711, + "quality": { + "detector_confidence": 0.6257667658887336, + "weighted_confidence": 0.5252783879773711, + "q": { + "size": 0.7814669418334961, + "aspect": 0.8309763291456598, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7792544896682729, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9344400825500487, + "aspect": 0.9492928987436979, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9558508979336546, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8394156043607626, + "raw": { + "mean_edge_px": 39.073347091674805, + "edge_ratio": 1.4068074262190264, + "distance_to_border_px": 250.0, + "distance_to_center_norm": 0.2944759428501129, + "laplacian_var": 3741.3332631392955 + } + }, + "mean_reprojection_error_px": 151.4960692778376, + "corner_reprojection_errors_px": [ + 120.36647848191342, + 166.08141545213763, + 182.85404384432152, + 136.68233933297773 + ] + } + ] + }, + { + "marker_id": 101, + "link_name": "Arm2", + "position_world_m": [ + 0.03576891406824046, + -0.1598703841209029, + 0.0890919383459207 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.8057513093090067, + "mean_detector_confidence": 0.8813633216493416, + "mean_reprojection_error_px": 117.09491401755673, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.8813633216493416, + "confidence_weighted": 0.8057513093090067, + "quality": { + "detector_confidence": 0.8813633216493416, + "weighted_confidence": 0.8057513093090067, + "q": { + "size": 0.9953423118591309, + "aspect": 0.9369411123383373, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7128396965315116, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9986026935577392, + "aspect": 0.9810823337015011, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9425679393063023, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.9142101668142507, + "raw": { + "mean_edge_px": 49.76711559295654, + "edge_ratio": 1.1346058718765915, + "distance_to_border_px": 220.0, + "distance_to_center_norm": 0.5226065516471863, + "laplacian_var": 3202.8515731516018 + } + }, + "mean_reprojection_error_px": 117.09491401755673, + "corner_reprojection_errors_px": [ + 36.749475960774944, + 116.60160350172696, + 197.48435962535123, + 117.5442169823738 + ] + } + ] + }, + { + "marker_id": 102, + "link_name": "Arm2", + "position_world_m": [ + -0.012725926567518675, + -0.1655882764796783, + 0.08097984005473967 + ], + "size_m": 0.025, + "observation_count": 1, + "mean_confidence": 0.5464398489744339, + "mean_detector_confidence": 0.8780095339638752, + "mean_reprojection_error_px": 46.322532807762514, + "observations": [ + { + "view_index": 3, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d.png", + "confidence_detector": 0.8780095339638752, + "confidence_weighted": 0.5464398489744339, + "quality": { + "detector_confidence": 0.8780095339638752, + "weighted_confidence": 0.5464398489744339, + "q": { + "size": 0.8713243103027344, + "aspect": 0.935042680119604, + "border": 1.0, + "center": 0.0, + "sharpness": 0.3757800021687216, + "homography": 0.8473321501260159, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9613972930908203, + "aspect": 0.9805128040358811, + "border": 1.0, + "center": 0.99, + "sharpness": 0.6878900010843608, + "homography": 0.9694664300252033, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.6223620904290962, + "raw": { + "mean_edge_px": 43.56621551513672, + "edge_ratio": 1.1389397965707557, + "distance_to_border_px": 263.0, + "distance_to_center_norm": 0.28565987944602966, + "laplacian_var": 939.450005421804 + } + }, + "mean_reprojection_error_px": 46.322532807762514, + "corner_reprojection_errors_px": [ + 39.581776111879826, + 18.372400341650202, + 42.31755436802137, + 85.01840040949868 + ] + } + ] + }, + { + "marker_id": 219, + "link_name": "Arm2", + "position_world_m": [ + 0.040848405822984137, + -0.17495919775728466, + 0.131907256475768 + ], + "size_m": 0.025, + "observation_count": 3, + "mean_confidence": 0.5853107194775254, + "mean_detector_confidence": 0.6412178071588511, + "mean_reprojection_error_px": 194.98910245783077, + "observations": [ + { + "view_index": 0, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "confidence_detector": 0.8358889661871642, + "confidence_weighted": 0.7701368598104626, + "quality": { + "detector_confidence": 0.8358889661871642, + "weighted_confidence": 0.7701368598104626, + "q": { + "size": 1.0, + "aspect": 0.9106094993567793, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.7814506769425815, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 1.0, + "aspect": 0.9731828498070337, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9562901353885164, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.921338707607753, + "raw": { + "mean_edge_px": 60.07131290435791, + "edge_ratio": 1.19633114020085, + "distance_to_border_px": 236.0, + "distance_to_center_norm": 0.4989948868751526, + "laplacian_var": 2646.188583315621 + } + }, + "mean_reprojection_error_px": 114.58137222485009, + "corner_reprojection_errors_px": [ + 127.0161481461074, + 85.63182394086405, + 132.73544748499216, + 112.94206932743673 + ] + }, + { + "view_index": 1, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "confidence_detector": 0.3166850406038321, + "confidence_weighted": 0.3, + "quality": { + "detector_confidence": 0.3166850406038321, + "weighted_confidence": 0.3, + "q": { + "size": 0.5055121994018554, + "aspect": 0.873993591312329, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.8516536598205566, + "aspect": 0.9621980773936987, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 1.0, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.8112649189438002, + "raw": { + "mean_edge_px": 25.275609970092773, + "edge_ratio": 1.2883462989664909, + "distance_to_border_px": 204.0, + "distance_to_center_norm": 0.19512085616588593, + "laplacian_var": 4263.320071621976 + } + }, + "mean_reprojection_error_px": 209.8031366594512, + "corner_reprojection_errors_px": [ + 201.1325272907623, + 199.52875540949051, + 218.08240555226467, + 220.46885838528726 + ] + }, + { + "view_index": 2, + "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "confidence_detector": 0.7710794146855571, + "confidence_weighted": 0.685795298622114, + "quality": { + "detector_confidence": 0.7710794146855571, + "weighted_confidence": 0.685795298622114, + "q": { + "size": 0.8995811653137207, + "aspect": 0.8707451605973943, + "border": 1.0, + "center": 0.0, + "sharpness": 1.0, + "homography": 0.8182610819768354, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "factor": { + "size": 0.9698743495941162, + "aspect": 0.9612235481792182, + "border": 1.0, + "center": 0.99, + "sharpness": 1.0, + "homography": 0.9636522163953671, + "normal_visibility": 1.0, + "spin": 1.0 + }, + "weight_multiplier": 0.889396455878385, + "raw": { + "mean_edge_px": 44.979058265686035, + "edge_ratio": 1.296883279406176, + "distance_to_border_px": 277.0, + "distance_to_center_norm": 0.4422629475593567, + "laplacian_var": 4223.2572960469215 + } + }, + "mean_reprojection_error_px": 260.58279848919113, + "corner_reprojection_errors_px": [ + 221.59643545872726, + 263.5092208355744, + 298.93330284221634, + 258.2922348202465 + ] + } + ] + } + ], + "statistics": { + "observation_count": 40, + "camera_count": 4, + "marker_count": 23, + "observed_marker_count": 21, + "mean_detector_confidence": 0.46546541612214093, + "mean_weighted_confidence": 0.42464863675174713, + "mean_reprojection_error_px": 189.61546736162268, + "quality_means": { + "size": 0.7059842696189881, + "aspect": 0.8417551598015706, + "border": 0.8583333333333334, + "homography": 0.8064378287982054 + }, + "quality_config": { + "size_ref_px": 50.0, + "border_ref_px": 120.0, + "center_ref_norm": 0.01, + "sharpness_ref": 2500.0, + "homography_ref": 0.18, + "size_factor": 0.3, + "aspect_factor": 0.3, + "border_factor": 0.01, + "center_factor": 0.01, + "sharpness_factor": 0.5, + "homography_factor": 0.2 + } + }, + "solver": { + "final_cost": 22931.22178571188, + "status": 0, + "message": "The maximum number of function evaluations is exceeded." + } +} \ No newline at end of file diff --git a/pipeline/2_Multiview_Trial/multiview_pose_summary.json b/pipeline/2_Multiview_Trial/multiview_pose_summary.json new file mode 100644 index 0000000..46937c5 --- /dev/null +++ b/pipeline/2_Multiview_Trial/multiview_pose_summary.json @@ -0,0 +1,73 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-28T21:58:12.453984Z", + "source_robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json", + "source_detections": [ + "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a_aruco_detection.json", + "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b_aruco_detection.json", + "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c_aruco_detection.json", + "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d_aruco_detection.json" + ], + "solver": { + "final_cost": 22931.22178571188, + "status": 0, + "message": "The maximum number of function evaluations is exceeded." + }, + "robot_pose": { + "state": { + "x": 6.55912456537666, + "y": 4.460952073670867, + "z": 30.7175200969605, + "a": 11.566185446462232, + "b": 1.999999999999993, + "c": 8.999999999999904, + "e": 0.9999999999999776 + }, + "uncertainty": { + "x_mm": 3481.5587672468964, + "y_mm": 1721.1687436205234, + "z_mm": 230.0328185419544, + "a_deg": 559.8212894814748, + "b_deg": 10506.72751291286, + "c_deg": 10506.727245747321, + "e_mm": 105067.37089893252 + }, + "confidence": { + "x": 6.278037366676565e-152, + "y": 1.7807019001431863e-75, + "z": 1.0228256841704706e-10, + "a": 4.8671004844006695e-25, + "b": 0.0, + "c": 0.0, + "e": 0.36787944117144233 + } + }, + "statistics": { + "observation_count": 40, + "camera_count": 4, + "marker_count": 23, + "observed_marker_count": 21, + "mean_detector_confidence": 0.46546541612214093, + "mean_weighted_confidence": 0.42464863675174713, + "mean_reprojection_error_px": 189.61546736162268, + "quality_means": { + "size": 0.7059842696189881, + "aspect": 0.8417551598015706, + "border": 0.8583333333333334, + "homography": 0.8064378287982054 + }, + "quality_config": { + "size_ref_px": 50.0, + "border_ref_px": 120.0, + "center_ref_norm": 0.01, + "sharpness_ref": 2500.0, + "homography_ref": 0.18, + "size_factor": 0.3, + "aspect_factor": 0.3, + "border_factor": 0.01, + "center_factor": 0.01, + "sharpness_factor": 0.5, + "homography_factor": 0.2 + } + } +} \ No newline at end of file diff --git a/pipeline/render_1a.png b/pipeline/2_Multiview_Trial/render_1a.png similarity index 100% rename from pipeline/render_1a.png rename to pipeline/2_Multiview_Trial/render_1a.png diff --git a/pipeline/render_1a_aruco_detection.json b/pipeline/2_Multiview_Trial/render_1a_aruco_detection.json similarity index 99% rename from pipeline/render_1a_aruco_detection.json rename to pipeline/2_Multiview_Trial/render_1a_aruco_detection.json index 109cc21..eaa9cab 100644 --- a/pipeline/render_1a_aruco_detection.json +++ b/pipeline/2_Multiview_Trial/render_1a_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-28T21:28:20Z", + "created_utc": "2026-05-28T21:44:42Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "492f34d0-5512-4bf1-9f5c-2e70826f2e71", + "observation_id": "4d04662e-5080-4098-8fc4-46dce4e705f5", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.9494437061622057 }, { - "observation_id": "f517029a-9c63-4593-a583-51bbc9991930", + "observation_id": "449cb42f-7615-4568-b338-d2f044c6ec16", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -154,7 +154,7 @@ "confidence": 0.8899728634608616 }, { - "observation_id": "7f05752e-d8d5-48c1-a9de-1d9fe78d34fc", + "observation_id": "fc29ae3d-bcba-4cca-9d8b-e23fbe32ead8", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -208,7 +208,7 @@ "confidence": 0.5673043275049208 }, { - "observation_id": "0f6019cf-ae79-4c58-b42f-454ad8a49b2c", + "observation_id": "2c78068c-dce5-4783-af57-f452515adda2", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -262,7 +262,7 @@ "confidence": 0.8796777163094818 }, { - "observation_id": "b6afa073-1316-4e40-b067-4ae58fa88bca", + "observation_id": "bab2a129-54ce-4ea2-b1d7-23977a28b351", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.8015179238063419 }, { - "observation_id": "5b95720f-f38f-4b70-b5a7-2a8407410850", + "observation_id": "bb69b260-1543-4e95-80af-b6fee95585aa", "type": "aruco", "marker_id": 101, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.3325004465415643 }, { - "observation_id": "7dc93dc7-2686-48f6-bae4-c32d18d8a7a8", + "observation_id": "e5ba9b93-f275-43e5-ab66-382210ce90d8", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -424,7 +424,7 @@ "confidence": 0.7952557920267838 }, { - "observation_id": "94d6d6ac-b481-4d2d-a193-1451736ecf89", + "observation_id": "4ad2b53e-2dbe-450c-92c7-d06b071cd796", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -478,7 +478,7 @@ "confidence": 0.34091855704160245 }, { - "observation_id": "7da58bb6-8abb-4cb8-b93a-f19e3b30bab5", + "observation_id": "7989f10c-2d6a-44b7-b16d-e721db2e585e", "type": "aruco", "marker_id": 229, "marker_size_m": 0.025, @@ -532,7 +532,7 @@ "confidence": 0.26810902547334975 }, { - "observation_id": "c1447225-65f9-4e8e-ac4a-9913fbd3fa4a", + "observation_id": "e2db913d-c818-4637-af5e-253d617ca04e", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -586,7 +586,7 @@ "confidence": 0.18665602922528673 }, { - "observation_id": "c6bf9790-b7cd-4781-addf-593b43be010a", + "observation_id": "76503575-cf6f-4ee8-9b3a-311ed41780be", "type": "aruco", "marker_id": 198, "marker_size_m": 0.025, @@ -640,7 +640,7 @@ "confidence": 0.20150745250271476 }, { - "observation_id": "ea51fd97-3cc1-450e-8f88-341da29d24fd", + "observation_id": "5458000b-97dc-419e-bc20-2cace8792227", "type": "aruco", "marker_id": 211, "marker_size_m": 0.025, @@ -694,7 +694,7 @@ "confidence": 0.6412317666518965 }, { - "observation_id": "0f91cfb9-9382-456b-9fe7-2cc966a1fc59", + "observation_id": "27ef8edf-4bf1-45cc-80d2-4ae6afc967c8", "type": "aruco", "marker_id": 208, "marker_size_m": 0.025, @@ -748,7 +748,7 @@ "confidence": 0.6280424706698967 }, { - "observation_id": "bc4bcbaf-41ff-477e-a495-f1682dcf7c10", + "observation_id": "26da9259-8af1-4dc7-b0dc-9f0bf85958c9", "type": "aruco", "marker_id": 217, "marker_size_m": 0.025, @@ -802,7 +802,7 @@ "confidence": 0.35596573288593486 }, { - "observation_id": "a11c0669-5498-40dd-ab5d-944be3d29f37", + "observation_id": "0caa0146-c0f8-4aaf-b394-95b32436dd0d", "type": "aruco", "marker_id": 206, "marker_size_m": 0.025, @@ -856,7 +856,7 @@ "confidence": 0.33820423087105295 }, { - "observation_id": "d0910683-77ca-4ce7-9533-6cffa7f371ab", + "observation_id": "0b3c110f-307c-48f6-9012-656bbc3cd9bf", "type": "aruco", "marker_id": 205, "marker_size_m": 0.025, @@ -910,7 +910,7 @@ "confidence": 0.28724459014346065 }, { - "observation_id": "4b7bdee0-6a52-452c-b260-7eea65ad36c2", + "observation_id": "698b3a77-1475-47ff-a9e7-c14d8240d428", "type": "aruco", "marker_id": 207, "marker_size_m": 0.025, diff --git a/pipeline/render_1b.png b/pipeline/2_Multiview_Trial/render_1b.png similarity index 100% rename from pipeline/render_1b.png rename to pipeline/2_Multiview_Trial/render_1b.png diff --git a/pipeline/render_1b_aruco_detection.json b/pipeline/2_Multiview_Trial/render_1b_aruco_detection.json similarity index 99% rename from pipeline/render_1b_aruco_detection.json rename to pipeline/2_Multiview_Trial/render_1b_aruco_detection.json index 672b1b3..14458a2 100644 --- a/pipeline/render_1b_aruco_detection.json +++ b/pipeline/2_Multiview_Trial/render_1b_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-28T21:28:21Z", + "created_utc": "2026-05-28T21:44:43Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "0c8f6caa-0447-4f7c-99c4-2d30e31d30d6", + "observation_id": "0ebc83d9-bb33-40a7-943b-78666c577574", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.8913851020933449 }, { - "observation_id": "2df4a132-33c5-4ebf-b29f-dcc52478335b", + "observation_id": "3e2026ef-788c-4f2c-9d0e-3bb4a4098c49", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -154,7 +154,7 @@ "confidence": 0.4804167810936165 }, { - "observation_id": "ba6b5ed9-6a18-47e7-a843-af281c19c30f", + "observation_id": "ebb20469-1b13-413a-8ea1-a35701ba2bd4", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -208,7 +208,7 @@ "confidence": 0.9132502955127223 }, { - "observation_id": "f27e2575-2b8b-497b-be0a-b993197fd894", + "observation_id": "211ff361-5d5c-4822-88b6-c5cec573090d", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -262,7 +262,7 @@ "confidence": 0.9456847621099602 }, { - "observation_id": "a2356407-9a0c-460e-a2af-812ffddaddbf", + "observation_id": "45c8a29e-1471-4fb7-bffc-27bdeb579be1", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.7448005120854795 }, { - "observation_id": "e37d03aa-9079-465a-8278-e568958327fc", + "observation_id": "16d87417-4ffe-4ce0-b51f-1e3fe5c9695e", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.7581700566520715 }, { - "observation_id": "64462f28-959c-436f-9e7a-7b7e2c180bb7", + "observation_id": "8c33c157-e141-4212-9279-69ad56760f53", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -424,7 +424,7 @@ "confidence": 0.826449608683203 }, { - "observation_id": "23c3a60a-e454-4ac1-9ba7-13505aa8ffb7", + "observation_id": "fe48446c-7538-4bd8-8cec-e96c3e5148b9", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -478,7 +478,7 @@ "confidence": 0.7813266383036261 }, { - "observation_id": "977958d8-7446-4234-ab37-604bb459f146", + "observation_id": "31c12fb9-cb8b-4677-89dc-b24351a14990", "type": "aruco", "marker_id": 229, "marker_size_m": 0.025, @@ -532,7 +532,7 @@ "confidence": 0.18684041285479083 }, { - "observation_id": "28ae43e2-3bd3-4829-87d0-e9cb9526e304", + "observation_id": "a059901a-85cf-42e8-870f-c88813554c08", "type": "aruco", "marker_id": 198, "marker_size_m": 0.025, diff --git a/pipeline/render_1c.png b/pipeline/2_Multiview_Trial/render_1c.png similarity index 100% rename from pipeline/render_1c.png rename to pipeline/2_Multiview_Trial/render_1c.png diff --git a/pipeline/render_1c_aruco_detection.json b/pipeline/2_Multiview_Trial/render_1c_aruco_detection.json similarity index 99% rename from pipeline/render_1c_aruco_detection.json rename to pipeline/2_Multiview_Trial/render_1c_aruco_detection.json index 8c47c7b..d504039 100644 --- a/pipeline/render_1c_aruco_detection.json +++ b/pipeline/2_Multiview_Trial/render_1c_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-28T21:28:21Z", + "created_utc": "2026-05-28T21:44:43Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "56c7970c-3fdc-437a-82dd-918ef861ac60", + "observation_id": "b2febb1e-6f84-4da7-b222-dad6bb306cfc", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.7012635429952238 }, { - "observation_id": "4166196c-2e75-4461-97c1-378b70b0754f", + "observation_id": "faabcc45-d069-4b1e-bbf4-a12019902b8a", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -154,7 +154,7 @@ "confidence": 0.5749326438029929 }, { - "observation_id": "1e515a3c-1477-4fc5-b2e9-4a5c759201dc", + "observation_id": "0773bfb1-9c4f-4add-9a74-bca81c38b2e8", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -208,7 +208,7 @@ "confidence": 0.9491420540234864 }, { - "observation_id": "1549938d-da8e-4883-9239-92b88fc508c9", + "observation_id": "abf720ab-c1d5-40c7-ad4f-9f58f8bd6ee1", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -262,7 +262,7 @@ "confidence": 0.4780463267147134 }, { - "observation_id": "634d2ef2-2e64-4009-8d92-c16368d1b20a", + "observation_id": "13752012-4478-43b7-b2f9-eab237d61864", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.5106218488640142 }, { - "observation_id": "e96b7926-73c9-42c3-9c6e-e7bd66a0b4b7", + "observation_id": "823b9adb-31fb-414d-aaaa-552432206d5c", "type": "aruco", "marker_id": 214, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.6041252446922665 }, { - "observation_id": "c57683ff-d5c4-412c-b893-95d36298186f", + "observation_id": "a33bdbe4-4e7d-42da-9c9e-6b5eaf4b5d8f", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, diff --git a/pipeline/2_Multiview_Trial/render_1d.png b/pipeline/2_Multiview_Trial/render_1d.png new file mode 100644 index 0000000..26aefc7 Binary files /dev/null and b/pipeline/2_Multiview_Trial/render_1d.png differ diff --git a/pipeline/2_Multiview_Trial/render_1d_aruco_detection.json b/pipeline/2_Multiview_Trial/render_1d_aruco_detection.json new file mode 100644 index 0000000..445e912 --- /dev/null +++ b/pipeline/2_Multiview_Trial/render_1d_aruco_detection.json @@ -0,0 +1,2316 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-28T21:44:44Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1d.png", + "image_sha256": "3c460a3850a720386c03bbd7011d1666df3bcc7a2766ef118815bccd53c88cee", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 10, + "num_rejected_candidates": 69 + }, + "detections": [ + { + "observation_id": "6d3815e5-05ac-4893-82d1-c7f86556bf27", + "type": "aruco", + "marker_id": 101, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 869.0, + 397.0 + ], + [ + 858.0, + 343.0 + ], + [ + 893.0, + 344.0 + ], + [ + 904.0, + 399.0 + ] + ], + "center_px": [ + 881.0, + 370.75 + ], + "quality": { + "area_px": 1891.0, + "perimeter_px": 181.26957321166992, + "sharpness": { + "laplacian_var": 2279.71740831458 + }, + "contrast": { + "p05": 27.0, + "p95": 170.0, + "dynamic_range": 143.0, + "mean_gray": 88.31426332288402, + "std_gray": 64.25291047899364 + }, + "geometry": { + "distance_to_center_norm": 0.32852903008461, + "distance_to_border_px": 321.0 + }, + "edge_ratio": 1.6018953055219516, + "edge_lengths_px": [ + 55.10898208618164, + 35.0142822265625, + 56.08921432495117, + 35.05709457397461 + ] + }, + "confidence": 0.6242605222406631 + }, + { + "observation_id": "d8192c2a-d827-4474-a3e4-c6c65341c68d", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 570.0, + 287.0 + ], + [ + 614.0, + 288.0 + ], + [ + 626.0, + 330.0 + ], + [ + 582.0, + 331.0 + ] + ], + "center_px": [ + 598.0, + 309.0 + ], + "quality": { + "area_px": 1892.0, + "perimeter_px": 177.31040573120117, + "sharpness": { + "laplacian_var": 2210.525986394558 + }, + "contrast": { + "p05": 23.0, + "p95": 191.0, + "dynamic_range": 168.0, + "mean_gray": 80.88333333333334, + "std_gray": 74.92557074052657 + }, + "geometry": { + "distance_to_center_norm": 0.08997403085231781, + "distance_to_border_px": 287.0 + }, + "edge_ratio": 1.0441009192250936, + "edge_lengths_px": [ + 44.0113639831543, + 43.680660247802734, + 44.0113639831543, + 45.607017517089844 + ] + }, + "confidence": 0.9577618231982553 + }, + { + "observation_id": "2bc814b1-1b1c-412c-8dfb-fc26e9b1b9e8", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 968.0, + 436.0 + ], + [ + 927.0, + 408.0 + ], + [ + 967.0, + 412.0 + ], + [ + 1006.0, + 440.0 + ] + ], + "center_px": [ + 967.0, + 424.0 + ], + "quality": { + "area_px": 932.0, + "perimeter_px": 176.0686264038086, + "sharpness": { + "laplacian_var": 2486.455061563878 + }, + "contrast": { + "p05": 37.0, + "p95": 145.0, + "dynamic_range": 108.0, + "mean_gray": 77.3882175226586, + "std_gray": 44.299605272918285 + }, + "geometry": { + "distance_to_center_norm": 0.45376965403556824, + "distance_to_border_px": 274.0 + }, + "edge_ratio": 1.2993676039593838, + "edge_lengths_px": [ + 49.648765563964844, + 40.199501037597656, + 48.010414123535156, + 38.20994567871094 + ] + }, + "confidence": 0.4781813333194008 + }, + { + "observation_id": "2adab304-2e95-4f8a-a935-38e708c3f33f", + "type": "aruco", + "marker_id": 124, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 779.0, + 391.0 + ], + [ + 768.0, + 341.0 + ], + [ + 798.0, + 342.0 + ], + [ + 808.0, + 393.0 + ] + ], + "center_px": [ + 788.25, + 366.75 + ], + "quality": { + "area_px": 1474.0, + "perimeter_px": 162.25239372253418, + "sharpness": { + "laplacian_var": 2120.4502604749932 + }, + "contrast": { + "p05": 27.0, + "p95": 169.0, + "dynamic_range": 142.0, + "mean_gray": 87.66118102613747, + "std_gray": 63.54910910099871 + }, + "geometry": { + "distance_to_center_norm": 0.20210148394107819, + "distance_to_border_px": 327.0 + }, + "edge_ratio": 1.7878617499056952, + "edge_lengths_px": [ + 51.195701599121094, + 30.01666259765625, + 51.97114562988281, + 29.068883895874023 + ] + }, + "confidence": 0.5496323564831004 + }, + { + "observation_id": "5908e12b-e37c-4d12-9e33-23f0419fc8ec", + "type": "aruco", + "marker_id": 242, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 620.0, + 394.0 + ], + [ + 598.0, + 417.0 + ], + [ + 554.0, + 419.0 + ], + [ + 573.0, + 397.0 + ] + ], + "center_px": [ + 586.25, + 406.75 + ], + "quality": { + "area_px": 972.5, + "perimeter_px": 152.0376205444336, + "sharpness": { + "laplacian_var": 1947.0895482802564 + }, + "contrast": { + "p05": 28.0, + "p95": 145.0, + "dynamic_range": 117.0, + "mean_gray": 65.55653450807635, + "std_gray": 48.21979281499513 + }, + "geometry": { + "distance_to_center_norm": 0.09701235592365265, + "distance_to_border_px": 301.0 + }, + "edge_ratio": 1.620139461605737, + "edge_lengths_px": [ + 31.827661514282227, + 44.04542922973633, + 29.068883895874023, + 47.095645904541016 + ] + }, + "confidence": 0.4001713116047204 + }, + { + "observation_id": "cf53836d-7c89-4129-8c91-b3f33b156e8f", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 821.0, + 423.0 + ], + [ + 783.0, + 398.0 + ], + [ + 814.0, + 401.0 + ], + [ + 850.0, + 426.0 + ] + ], + "center_px": [ + 817.0, + 412.0 + ], + "quality": { + "area_px": 639.0, + "perimeter_px": 149.61505889892578, + "sharpness": { + "laplacian_var": 2941.054937507891 + }, + "contrast": { + "p05": 35.0, + "p95": 141.0, + "dynamic_range": 106.0, + "mean_gray": 71.56629213483146, + "std_gray": 41.98210679261008 + }, + "geometry": { + "distance_to_center_norm": 0.2512321174144745, + "distance_to_border_px": 294.0 + }, + "edge_ratio": 1.560165911582428, + "edge_lengths_px": [ + 45.486263275146484, + 31.14482307434082, + 43.8292121887207, + 29.154760360717773 + ] + }, + "confidence": 0.27304788345742115 + }, + { + "observation_id": "497302a2-9acc-49eb-bb43-f239ff306abc", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 590.0, + 695.0 + ], + [ + 630.0, + 691.0 + ], + [ + 653.0, + 699.0 + ], + [ + 609.0, + 703.0 + ] + ], + "center_px": [ + 620.5, + 697.0 + ], + "quality": { + "area_px": 420.0, + "perimeter_px": 129.3480625152588, + "sharpness": { + "laplacian_var": 4546.540325161974 + }, + "contrast": { + "p05": 21.0, + "p95": 173.0, + "dynamic_range": 152.0, + "mean_gray": 86.09634551495017, + "std_gray": 62.5571952510232 + }, + "geometry": { + "distance_to_center_norm": 0.4597066640853882, + "distance_to_border_px": 17.0 + }, + "edge_ratio": 2.1431147449676984, + "edge_lengths_px": [ + 40.199501037597656, + 24.351591110229492, + 44.18144226074219, + 20.615528106689453 + ] + }, + "confidence": 0.04442132658717482 + }, + { + "observation_id": "c587f7ab-f74c-4d9a-99f1-b62720fd11bc", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 523.0, + 669.0 + ], + [ + 563.0, + 666.0 + ], + [ + 581.0, + 672.0 + ], + [ + 541.0, + 676.0 + ] + ], + "center_px": [ + 552.0, + 670.75 + ], + "quality": { + "area_px": 323.0, + "perimeter_px": 118.59871673583984, + "sharpness": { + "laplacian_var": 6221.592994735114 + }, + "contrast": { + "p05": 19.0, + "p95": 161.0, + "dynamic_range": 142.0, + "mean_gray": 75.80237154150197, + "std_gray": 57.41032252753604 + }, + "geometry": { + "distance_to_center_norm": 0.43983229994773865, + "distance_to_border_px": 44.0 + }, + "edge_ratio": 2.1186998154843373, + "edge_lengths_px": [ + 40.112342834472656, + 18.973665237426758, + 40.199501037597656, + 19.313207626342773 + ] + }, + "confidence": 0.08943849994625828 + }, + { + "observation_id": "1def3cc0-09ff-4803-a98f-409a83f57a89", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1144.0, + 629.0 + ], + [ + 1172.0, + 626.0 + ], + [ + 1200.0, + 632.0 + ], + [ + 1171.0, + 635.0 + ] + ], + "center_px": [ + 1171.75, + 630.5 + ], + "quality": { + "area_px": 253.5, + "perimeter_px": 113.60929298400879, + "sharpness": { + "laplacian_var": 8183.706666666667 + }, + "contrast": { + "p05": 22.0, + "p95": 153.79999999999998, + "dynamic_range": 131.79999999999998, + "mean_gray": 74.33333333333333, + "std_gray": 42.99509015896789 + }, + "geometry": { + "distance_to_center_norm": 0.8124681711196899, + "distance_to_border_px": 80.0 + }, + "edge_ratio": 1.054092554421771, + "edge_lengths_px": [ + 28.160255432128906, + 28.635643005371094, + 29.154760360717773, + 27.658634185791016 + ] + }, + "confidence": 0.1603274772135223 + }, + { + "observation_id": "0fcafadc-eb7e-4b67-9fd4-5d59a010ebc3", + "type": "aruco", + "marker_id": 214, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 676.0, + 653.0 + ], + [ + 710.0, + 649.0 + ], + [ + 730.0, + 655.0 + ], + [ + 695.0, + 659.0 + ] + ], + "center_px": [ + 702.75, + 654.0 + ], + "quality": { + "area_px": 285.0, + "perimeter_px": 110.26778602600098, + "sharpness": { + "laplacian_var": 3296.7684151785716 + }, + "contrast": { + "p05": 18.0, + "p95": 137.0, + "dynamic_range": 119.0, + "mean_gray": 75.04017857142857, + "std_gray": 46.24568698001822 + }, + "geometry": { + "distance_to_center_norm": 0.40939804911613464, + "distance_to_border_px": 61.0 + }, + "edge_ratio": 1.7680341217288618, + "edge_lengths_px": [ + 34.2344856262207, + 20.880613327026367, + 35.22782897949219, + 19.92485809326172 + ] + }, + "confidence": 0.1074639893342158 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 206.0, + 612.0 + ], + [ + 160.0, + 628.0 + ], + [ + 133.0, + 627.0 + ], + [ + 191.0, + 608.0 + ] + ], + "center_px": [ + 172.5, + 618.75 + ], + "area_px": 497.5 + }, + { + "image_points_px": [ + [ + 547.0, + 479.0 + ], + [ + 543.0, + 485.0 + ], + [ + 484.0, + 488.0 + ], + [ + 508.0, + 479.0 + ] + ], + "center_px": [ + 520.5, + 482.75 + ], + "area_px": 346.5 + }, + { + "image_points_px": [ + [ + 830.0, + 570.0 + ], + [ + 799.0, + 594.0 + ], + [ + 774.0, + 592.0 + ], + [ + 804.0, + 569.0 + ] + ], + "center_px": [ + 801.75, + 581.25 + ], + "area_px": 645.0 + }, + { + "image_points_px": [ + [ + 750.0, + 676.0 + ], + [ + 788.0, + 673.0 + ], + [ + 810.0, + 680.0 + ], + [ + 773.0, + 684.0 + ] + ], + "center_px": [ + 780.25, + 678.25 + ], + "area_px": 360.0 + }, + { + "image_points_px": [ + [ + 943.0, + 549.0 + ], + [ + 924.0, + 574.0 + ], + [ + 899.0, + 573.0 + ], + [ + 920.0, + 549.0 + ] + ], + "center_px": [ + 921.5, + 561.25 + ], + "area_px": 598.0 + }, + { + "image_points_px": [ + [ + 1057.0, + 611.0 + ], + [ + 1087.0, + 609.0 + ], + [ + 1108.0, + 613.0 + ], + [ + 1079.0, + 616.0 + ] + ], + "center_px": [ + 1082.75, + 612.25 + ], + "area_px": 186.5 + }, + { + "image_points_px": [ + [ + 1176.0, + 709.0 + ], + [ + 1201.0, + 706.0 + ], + [ + 1225.0, + 711.0 + ], + [ + 1198.0, + 714.0 + ] + ], + "center_px": [ + 1200.0, + 710.0 + ], + "area_px": 199.0 + }, + { + "image_points_px": [ + [ + 1025.0, + 711.0 + ], + [ + 1055.0, + 709.0 + ], + [ + 1073.0, + 713.0 + ], + [ + 1047.0, + 716.0 + ] + ], + "center_px": [ + 1050.0, + 712.25 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 1126.0, + 706.0 + ], + [ + 1151.0, + 703.0 + ], + [ + 1173.0, + 708.0 + ], + [ + 1147.0, + 711.0 + ] + ], + "center_px": [ + 1149.25, + 707.0 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 52.0, + 695.0 + ], + [ + 18.0, + 698.0 + ], + [ + 13.0, + 693.0 + ], + [ + 47.0, + 691.0 + ] + ], + "center_px": [ + 32.5, + 694.25 + ], + "area_px": 165.5 + }, + { + "image_points_px": [ + [ + 93.0, + 321.0 + ], + [ + 97.0, + 328.0 + ], + [ + 101.0, + 356.0 + ], + [ + 94.0, + 351.0 + ] + ], + "center_px": [ + 96.25, + 339.0 + ], + "area_px": 144.5 + }, + { + "image_points_px": [ + [ + 136.0, + 650.0 + ], + [ + 106.0, + 652.0 + ], + [ + 101.0, + 649.0 + ], + [ + 130.0, + 647.0 + ] + ], + "center_px": [ + 118.25, + 649.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 173.0, + 652.0 + ], + [ + 144.0, + 654.0 + ], + [ + 138.0, + 651.0 + ], + [ + 167.0, + 649.0 + ] + ], + "center_px": [ + 155.5, + 651.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 76.0, + 656.0 + ], + [ + 46.0, + 658.0 + ], + [ + 42.0, + 655.0 + ], + [ + 70.0, + 652.0 + ] + ], + "center_px": [ + 58.5, + 655.25 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 209.0, + 654.0 + ], + [ + 181.0, + 656.0 + ], + [ + 175.0, + 653.0 + ], + [ + 204.0, + 651.0 + ] + ], + "center_px": [ + 192.25, + 653.5 + ], + "area_px": 96.5 + }, + { + "image_points_px": [ + [ + 87.0, + 639.0 + ], + [ + 58.0, + 641.0 + ], + [ + 53.0, + 638.0 + ], + [ + 81.0, + 636.0 + ] + ], + "center_px": [ + 69.75, + 638.5 + ], + "area_px": 96.5 + }, + { + "image_points_px": [ + [ + 197.0, + 646.0 + ], + [ + 225.0, + 644.0 + ], + [ + 231.0, + 647.0 + ], + [ + 203.0, + 649.0 + ] + ], + "center_px": [ + 214.0, + 646.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 124.0, + 642.0 + ], + [ + 152.0, + 640.0 + ], + [ + 158.0, + 643.0 + ], + [ + 130.0, + 645.0 + ] + ], + "center_px": [ + 141.0, + 642.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 160.0, + 644.0 + ], + [ + 188.0, + 642.0 + ], + [ + 194.0, + 645.0 + ], + [ + 167.0, + 647.0 + ] + ], + "center_px": [ + 177.25, + 644.5 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 87.0, + 665.0 + ], + [ + 58.0, + 668.0 + ], + [ + 54.0, + 665.0 + ], + [ + 83.0, + 662.0 + ] + ], + "center_px": [ + 70.5, + 665.0 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 56.0, + 709.0 + ], + [ + 31.0, + 711.0 + ], + [ + 26.0, + 706.0 + ], + [ + 56.0, + 703.0 + ] + ], + "center_px": [ + 42.25, + 707.25 + ], + "area_px": 157.5 + }, + { + "image_points_px": [ + [ + 63.0, + 646.0 + ], + [ + 34.0, + 648.0 + ], + [ + 30.0, + 645.0 + ], + [ + 58.0, + 643.0 + ] + ], + "center_px": [ + 46.25, + 645.5 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 143.0, + 634.0 + ], + [ + 116.0, + 636.0 + ], + [ + 110.0, + 633.0 + ], + [ + 137.0, + 631.0 + ] + ], + "center_px": [ + 126.5, + 633.5 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 234.0, + 648.0 + ], + [ + 261.0, + 646.0 + ], + [ + 267.0, + 649.0 + ], + [ + 240.0, + 651.0 + ] + ], + "center_px": [ + 250.5, + 648.5 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 179.0, + 636.0 + ], + [ + 152.0, + 638.0 + ], + [ + 146.0, + 635.0 + ], + [ + 172.0, + 633.0 + ] + ], + "center_px": [ + 162.25, + 635.5 + ], + "area_px": 92.5 + }, + { + "image_points_px": [ + [ + 234.0, + 631.0 + ], + [ + 208.0, + 633.0 + ], + [ + 201.0, + 630.0 + ], + [ + 226.0, + 628.0 + ] + ], + "center_px": [ + 217.25, + 630.5 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 862.0, + 319.0 + ], + [ + 888.0, + 320.0 + ], + [ + 884.0, + 332.0 + ], + [ + 873.0, + 331.0 + ] + ], + "center_px": [ + 876.75, + 325.5 + ], + "area_px": 218.5 + }, + { + "image_points_px": [ + [ + 182.0, + 637.0 + ], + [ + 209.0, + 635.0 + ], + [ + 214.0, + 638.0 + ], + [ + 187.0, + 640.0 + ] + ], + "center_px": [ + 198.0, + 637.5 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 1182.0, + 689.0 + ], + [ + 1199.0, + 687.0 + ], + [ + 1213.0, + 691.0 + ], + [ + 1196.0, + 694.0 + ] + ], + "center_px": [ + 1197.5, + 690.25 + ], + "area_px": 111.5 + }, + { + "image_points_px": [ + [ + 42.0, + 629.0 + ], + [ + 70.0, + 628.0 + ], + [ + 73.0, + 630.0 + ], + [ + 46.0, + 632.0 + ] + ], + "center_px": [ + 57.75, + 629.75 + ], + "area_px": 74.0 + }, + { + "image_points_px": [ + [ + 62.0, + 622.0 + ], + [ + 36.0, + 624.0 + ], + [ + 31.0, + 621.0 + ], + [ + 56.0, + 619.0 + ] + ], + "center_px": [ + 46.25, + 621.5 + ], + "area_px": 87.5 + }, + { + "image_points_px": [ + [ + 39.0, + 628.0 + ], + [ + 12.0, + 630.0 + ], + [ + 9.0, + 627.0 + ], + [ + 36.0, + 626.0 + ] + ], + "center_px": [ + 24.0, + 627.75 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 51.0, + 614.0 + ], + [ + 25.0, + 616.0 + ], + [ + 21.0, + 613.0 + ], + [ + 47.0, + 612.0 + ] + ], + "center_px": [ + 36.0, + 613.75 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 126.0, + 605.0 + ], + [ + 151.0, + 604.0 + ], + [ + 156.0, + 606.0 + ], + [ + 131.0, + 607.0 + ] + ], + "center_px": [ + 141.0, + 605.5 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 11.0, + 606.0 + ], + [ + 37.0, + 605.0 + ], + [ + 40.0, + 607.0 + ], + [ + 15.0, + 608.0 + ] + ], + "center_px": [ + 25.75, + 606.5 + ], + "area_px": 54.5 + }, + { + "image_points_px": [ + [ + 72.0, + 608.0 + ], + [ + 47.0, + 610.0 + ], + [ + 43.0, + 608.0 + ], + [ + 67.0, + 606.0 + ] + ], + "center_px": [ + 57.25, + 608.0 + ], + "area_px": 58.0 + }, + { + "image_points_px": [ + [ + 90.0, + 669.0 + ], + [ + 86.0, + 673.0 + ], + [ + 65.0, + 674.0 + ], + [ + 62.0, + 671.0 + ] + ], + "center_px": [ + 75.75, + 671.75 + ], + "area_px": 85.0 + }, + { + "image_points_px": [ + [ + 114.0, + 598.0 + ], + [ + 138.0, + 597.0 + ], + [ + 143.0, + 599.0 + ], + [ + 118.0, + 600.0 + ] + ], + "center_px": [ + 128.25, + 598.5 + ], + "area_px": 53.5 + }, + { + "image_points_px": [ + [ + 575.0, + 619.0 + ], + [ + 555.0, + 621.0 + ], + [ + 546.0, + 618.0 + ], + [ + 568.0, + 617.0 + ] + ], + "center_px": [ + 561.0, + 618.75 + ], + "area_px": 64.5 + }, + { + "image_points_px": [ + [ + 61.0, + 601.0 + ], + [ + 37.0, + 603.0 + ], + [ + 33.0, + 601.0 + ], + [ + 57.0, + 599.0 + ] + ], + "center_px": [ + 47.0, + 601.0 + ], + "area_px": 56.0 + }, + { + "image_points_px": [ + [ + 53.0, + 595.0 + ], + [ + 77.0, + 594.0 + ], + [ + 81.0, + 596.0 + ], + [ + 57.0, + 597.0 + ] + ], + "center_px": [ + 67.0, + 595.5 + ], + "area_px": 52.0 + }, + { + "image_points_px": [ + [ + 187.0, + 607.0 + ], + [ + 164.0, + 609.0 + ], + [ + 159.0, + 607.0 + ], + [ + 182.0, + 605.0 + ] + ], + "center_px": [ + 173.0, + 607.0 + ], + "area_px": 56.0 + }, + { + "image_points_px": [ + [ + 133.0, + 593.0 + ], + [ + 157.0, + 592.0 + ], + [ + 161.0, + 594.0 + ], + [ + 138.0, + 595.0 + ] + ], + "center_px": [ + 147.25, + 593.5 + ], + "area_px": 51.5 + }, + { + "image_points_px": [ + [ + 174.0, + 600.0 + ], + [ + 151.0, + 602.0 + ], + [ + 146.0, + 600.0 + ], + [ + 168.0, + 598.0 + ] + ], + "center_px": [ + 159.75, + 600.0 + ], + "area_px": 56.0 + }, + { + "image_points_px": [ + [ + 151.0, + 588.0 + ], + [ + 174.0, + 587.0 + ], + [ + 179.0, + 589.0 + ], + [ + 156.0, + 590.0 + ] + ], + "center_px": [ + 165.0, + 588.5 + ], + "area_px": 51.0 + }, + { + "image_points_px": [ + [ + 763.0, + 678.0 + ], + [ + 766.0, + 675.0 + ], + [ + 790.0, + 678.0 + ], + [ + 780.0, + 682.0 + ] + ], + "center_px": [ + 774.75, + 678.25 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 593.0, + 614.0 + ], + [ + 615.0, + 613.0 + ], + [ + 621.0, + 615.0 + ], + [ + 600.0, + 616.0 + ] + ], + "center_px": [ + 607.25, + 614.5 + ], + "area_px": 49.5 + }, + { + "image_points_px": [ + [ + 23.0, + 594.0 + ], + [ + 48.0, + 593.0 + ], + [ + 50.0, + 595.0 + ], + [ + 27.0, + 596.0 + ] + ], + "center_px": [ + 37.0, + 594.5 + ], + "area_px": 51.0 + }, + { + "image_points_px": [ + [ + 41.0, + 588.0 + ], + [ + 17.0, + 589.0 + ], + [ + 14.0, + 587.0 + ], + [ + 37.0, + 586.0 + ] + ], + "center_px": [ + 27.25, + 587.5 + ], + "area_px": 50.5 + }, + { + "image_points_px": [ + [ + 879.0, + 419.0 + ], + [ + 898.0, + 421.0 + ], + [ + 905.0, + 426.0 + ], + [ + 886.0, + 423.0 + ] + ], + "center_px": [ + 892.0, + 422.25 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 48.0, + 636.0 + ], + [ + 30.0, + 639.0 + ], + [ + 21.0, + 637.0 + ], + [ + 41.0, + 634.0 + ] + ], + "center_px": [ + 35.0, + 636.5 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 525.0, + 623.0 + ], + [ + 504.0, + 625.0 + ], + [ + 498.0, + 623.0 + ], + [ + 520.0, + 621.0 + ] + ], + "center_px": [ + 511.75, + 623.0 + ], + "area_px": 54.0 + }, + { + "image_points_px": [ + [ + 322.0, + 689.0 + ], + [ + 306.0, + 692.0 + ], + [ + 295.0, + 691.0 + ], + [ + 311.0, + 688.0 + ] + ], + "center_px": [ + 308.5, + 690.0 + ], + "area_px": 49.0 + }, + { + "image_points_px": [ + [ + 171.0, + 572.0 + ], + [ + 149.0, + 573.0 + ], + [ + 145.0, + 571.0 + ], + [ + 165.0, + 570.0 + ] + ], + "center_px": [ + 157.5, + 571.5 + ], + "area_px": 47.0 + }, + { + "image_points_px": [ + [ + 143.0, + 571.0 + ], + [ + 123.0, + 572.0 + ], + [ + 117.0, + 570.0 + ], + [ + 137.0, + 569.0 + ] + ], + "center_px": [ + 130.0, + 570.5 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 709.0, + 606.0 + ], + [ + 693.0, + 608.0 + ], + [ + 683.0, + 606.0 + ], + [ + 701.0, + 604.0 + ] + ], + "center_px": [ + 696.5, + 606.0 + ], + "area_px": 52.0 + }, + { + "image_points_px": [ + [ + 34.0, + 622.0 + ], + [ + 44.0, + 620.0 + ], + [ + 59.0, + 621.0 + ], + [ + 39.0, + 624.0 + ] + ], + "center_px": [ + 44.0, + 621.75 + ], + "area_px": 47.5 + }, + { + "image_points_px": [ + [ + 848.0, + 590.0 + ], + [ + 865.0, + 589.0 + ], + [ + 873.0, + 591.0 + ], + [ + 856.0, + 592.0 + ] + ], + "center_px": [ + 860.5, + 590.5 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 924.0, + 583.0 + ], + [ + 940.0, + 582.0 + ], + [ + 949.0, + 584.0 + ], + [ + 933.0, + 585.0 + ] + ], + "center_px": [ + 936.5, + 583.5 + ], + "area_px": 41.0 + }, + { + "image_points_px": [ + [ + 972.0, + 329.0 + ], + [ + 967.0, + 345.0 + ], + [ + 962.0, + 351.0 + ], + [ + 964.0, + 340.0 + ] + ], + "center_px": [ + 966.25, + 341.25 + ], + "area_px": 58.0 + }, + { + "image_points_px": [ + [ + 831.0, + 387.0 + ], + [ + 837.0, + 388.0 + ], + [ + 847.0, + 402.0 + ], + [ + 831.0, + 393.0 + ] + ], + "center_px": [ + 836.5, + 392.5 + ], + "area_px": 85.0 + }, + { + "image_points_px": [ + [ + 213.0, + 622.0 + ], + [ + 204.0, + 624.0 + ], + [ + 190.0, + 623.0 + ], + [ + 211.0, + 620.0 + ] + ], + "center_px": [ + 204.5, + 622.25 + ], + "area_px": 42.5 + }, + { + "image_points_px": [ + [ + 145.0, + 618.0 + ], + [ + 124.0, + 621.0 + ], + [ + 122.0, + 619.0 + ], + [ + 135.0, + 617.0 + ] + ], + "center_px": [ + 131.5, + 618.75 + ], + "area_px": 40.5 + }, + { + "image_points_px": [ + [ + 133.0, + 611.0 + ], + [ + 119.0, + 613.0 + ], + [ + 110.0, + 612.0 + ], + [ + 127.0, + 609.0 + ] + ], + "center_px": [ + 122.25, + 611.25 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 809.0, + 594.0 + ], + [ + 827.0, + 593.0 + ], + [ + 832.0, + 595.0 + ], + [ + 817.0, + 596.0 + ] + ], + "center_px": [ + 821.25, + 594.5 + ], + "area_px": 39.5 + }, + { + "image_points_px": [ + [ + 14.0, + 607.0 + ], + [ + 24.0, + 605.0 + ], + [ + 37.0, + 606.0 + ], + [ + 26.0, + 608.0 + ] + ], + "center_px": [ + 25.25, + 606.5 + ], + "area_px": 35.5 + }, + { + "image_points_px": [ + [ + 1078.0, + 610.0 + ], + [ + 1086.0, + 609.0 + ], + [ + 1100.0, + 613.0 + ], + [ + 1092.0, + 614.0 + ] + ], + "center_px": [ + 1089.0, + 611.5 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 130.0, + 606.0 + ], + [ + 140.0, + 604.0 + ], + [ + 152.0, + 605.0 + ], + [ + 141.0, + 607.0 + ] + ], + "center_px": [ + 140.75, + 605.5 + ], + "area_px": 33.5 + }, + { + "image_points_px": [ + [ + 118.0, + 599.0 + ], + [ + 128.0, + 597.0 + ], + [ + 139.0, + 598.0 + ], + [ + 129.0, + 600.0 + ] + ], + "center_px": [ + 128.5, + 598.5 + ], + "area_px": 32.0 + } + ] +} \ No newline at end of file diff --git a/pipeline/2_Multiview_Trial/render_2a.png b/pipeline/2_Multiview_Trial/render_2a.png new file mode 100644 index 0000000..31771f1 Binary files /dev/null and b/pipeline/2_Multiview_Trial/render_2a.png differ diff --git a/pipeline/2_Multiview_Trial/render_2a_aruco_detection.json b/pipeline/2_Multiview_Trial/render_2a_aruco_detection.json new file mode 100644 index 0000000..01d7d70 --- /dev/null +++ b/pipeline/2_Multiview_Trial/render_2a_aruco_detection.json @@ -0,0 +1,15582 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-28T22:45:50Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2a.png", + "image_sha256": "5912a4fc7106659d67d48e7e6bb64687bddf897a0f094e3d8cf77ccaeaebd937", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 14, + "num_rejected_candidates": 591 + }, + "detections": [ + { + "observation_id": "7dee6671-4ab2-4f0d-b07d-3f419ddeae4c", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 959.0, + 413.0 + ], + [ + 1016.0, + 384.0 + ], + [ + 1044.0, + 433.0 + ], + [ + 985.0, + 461.0 + ] + ], + "center_px": [ + 1001.0, + 422.75 + ], + "quality": { + "area_px": 3582.5, + "perimeter_px": 240.28525161743164, + "sharpness": { + "laplacian_var": 2646.188583315621 + }, + "contrast": { + "p05": 35.0, + "p95": 193.0, + "dynamic_range": 158.0, + "mean_gray": 95.5253881661771, + "std_gray": 72.78499835638496 + }, + "geometry": { + "distance_to_center_norm": 0.4989948868751526, + "distance_to_border_px": 236.0 + }, + "edge_ratio": 1.19633114020085, + "edge_lengths_px": [ + 63.95310592651367, + 56.4358024597168, + 65.30696868896484, + 54.58937454223633 + ] + }, + "confidence": 0.8358889661871642 + }, + { + "observation_id": "f4cdac4e-a9e5-40be-a961-27bb239c67f4", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 855.0, + 221.0 + ], + [ + 907.0, + 195.0 + ], + [ + 930.0, + 235.0 + ], + [ + 877.0, + 262.0 + ] + ], + "center_px": [ + 892.25, + 228.25 + ], + "quality": { + "area_px": 2722.5, + "perimeter_px": 210.2895050048828, + "sharpness": { + "laplacian_var": 2440.9145181844915 + }, + "contrast": { + "p05": 27.0, + "p95": 192.0, + "dynamic_range": 165.0, + "mean_gray": 81.68371837183719, + "std_gray": 73.49094650266031 + }, + "geometry": { + "distance_to_center_norm": 0.38755714893341064, + "distance_to_border_px": 195.0 + }, + "edge_ratio": 1.2891133468352027, + "edge_lengths_px": [ + 58.13776779174805, + 46.14108657836914, + 59.4810905456543, + 46.52956008911133 + ] + }, + "confidence": 0.7757269773484377 + }, + { + "observation_id": "38a732a1-f37b-40ca-9845-f84aee489a5e", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 624.0, + 64.0 + ], + [ + 676.0, + 59.0 + ], + [ + 690.0, + 107.0 + ], + [ + 638.0, + 113.0 + ] + ], + "center_px": [ + 657.0, + 85.75 + ], + "quality": { + "area_px": 2599.0, + "perimeter_px": 205.5456085205078, + "sharpness": { + "laplacian_var": 1793.3073804160247 + }, + "contrast": { + "p05": 24.0, + "p95": 190.0, + "dynamic_range": 166.0, + "mean_gray": 78.93424814179531, + "std_gray": 73.75647751316085 + }, + "geometry": { + "distance_to_center_norm": 0.37420061230659485, + "distance_to_border_px": 59.0 + }, + "edge_ratio": 1.046900177001953, + "edge_lengths_px": [ + 52.239830017089844, + 50.0, + 52.345008850097656, + 50.96076965332031 + ] + }, + "confidence": 0.9552009083270357 + }, + { + "observation_id": "28957e8e-cec9-4bac-a56c-9aed974eba88", + "type": "aruco", + "marker_id": 101, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 986.0, + 312.0 + ], + [ + 1033.0, + 315.0 + ], + [ + 1060.0, + 359.0 + ], + [ + 1013.0, + 358.0 + ] + ], + "center_px": [ + 1023.0, + 336.0 + ], + "quality": { + "area_px": 2061.0, + "perimeter_px": 199.06846237182617, + "sharpness": { + "laplacian_var": 3202.8515731516018 + }, + "contrast": { + "p05": 11.0, + "p95": 177.0, + "dynamic_range": 166.0, + "mean_gray": 83.65701881331404, + "std_gray": 74.88679071264757 + }, + "geometry": { + "distance_to_center_norm": 0.5226065516471863, + "distance_to_border_px": 220.0 + }, + "edge_ratio": 1.1346058718765915, + "edge_lengths_px": [ + 47.095645904541016, + 51.62363815307617, + 47.01063537597656, + 53.33854293823242 + ] + }, + "confidence": 0.8813633216493416 + }, + { + "observation_id": "14bf13bb-9eed-4888-b626-7f916473e2cf", + "type": "aruco", + "marker_id": 124, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 917.0, + 192.0 + ], + [ + 962.0, + 196.0 + ], + [ + 986.0, + 236.0 + ], + [ + 941.0, + 233.0 + ] + ], + "center_px": [ + 951.5, + 214.25 + ], + "quality": { + "area_px": 1738.5, + "perimeter_px": 184.43282318115234, + "sharpness": { + "laplacian_var": 3204.524815886671 + }, + "contrast": { + "p05": 12.0, + "p95": 176.0, + "dynamic_range": 164.0, + "mean_gray": 82.29362416107382, + "std_gray": 74.1613017966978 + }, + "geometry": { + "distance_to_center_norm": 0.46835172176361084, + "distance_to_border_px": 192.0 + }, + "edge_ratio": 1.0533926995309433, + "edge_lengths_px": [ + 45.17742919921875, + 46.647613525390625, + 45.09988784790039, + 47.50789260864258 + ] + }, + "confidence": 0.949313584995683 + }, + { + "observation_id": "358e72f4-560f-433a-9949-deffa03acbbc", + "type": "aruco", + "marker_id": 247, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 725.0, + 38.0 + ], + [ + 774.0, + 34.0 + ], + [ + 793.0, + 67.0 + ], + [ + 743.0, + 73.0 + ] + ], + "center_px": [ + 758.75, + 53.0 + ], + "quality": { + "area_px": 1775.5, + "perimeter_px": 176.95791244506836, + "sharpness": { + "laplacian_var": 3479.254611502003 + }, + "contrast": { + "p05": 13.0, + "p95": 185.0, + "dynamic_range": 172.0, + "mean_gray": 95.2322738386308, + "std_gray": 78.67079749260358 + }, + "geometry": { + "distance_to_center_norm": 0.4482710361480713, + "distance_to_border_px": 34.0 + }, + "edge_ratio": 1.3224846641193186, + "edge_lengths_px": [ + 49.162994384765625, + 38.07886505126953, + 50.35871505737305, + 39.357337951660156 + ] + }, + "confidence": 0.5141836563018536 + }, + { + "observation_id": "a509ad51-6d02-4227-b862-7ecf57a58fa2", + "type": "aruco", + "marker_id": 246, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 800.0, + 31.0 + ], + [ + 848.0, + 26.0 + ], + [ + 868.0, + 60.0 + ], + [ + 819.0, + 64.0 + ] + ], + "center_px": [ + 833.75, + 45.25 + ], + "quality": { + "area_px": 1712.5, + "perimeter_px": 174.94773864746094, + "sharpness": { + "laplacian_var": 2659.0007176668505 + }, + "contrast": { + "p05": 13.0, + "p95": 183.0, + "dynamic_range": 170.0, + "mean_gray": 61.38709677419355, + "std_gray": 71.4034706099394 + }, + "geometry": { + "distance_to_center_norm": 0.503339409828186, + "distance_to_border_px": 26.0 + }, + "edge_ratio": 1.2910835004817602, + "edge_lengths_px": [ + 48.25971221923828, + 39.4461669921875, + 49.162994384765625, + 38.07886505126953 + ] + }, + "confidence": 0.40276248577722906 + }, + { + "observation_id": "3b096984-3a75-4b0d-b23d-bc2326604b4c", + "type": "aruco", + "marker_id": 242, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 690.0, + 178.0 + ], + [ + 676.0, + 202.0 + ], + [ + 626.0, + 208.0 + ], + [ + 638.0, + 185.0 + ] + ], + "center_px": [ + 657.5, + 193.25 + ], + "quality": { + "area_px": 1114.0, + "perimeter_px": 156.5548858642578, + "sharpness": { + "laplacian_var": 1956.16945815478 + }, + "contrast": { + "p05": 31.0, + "p95": 154.0, + "dynamic_range": 123.0, + "mean_gray": 71.15277777777777, + "std_gray": 51.17785034584126 + }, + "geometry": { + "distance_to_center_norm": 0.22833341360092163, + "distance_to_border_px": 178.0 + }, + "edge_ratio": 2.022532853150459, + "edge_lengths_px": [ + 27.784887313842773, + 50.35871505737305, + 25.942243576049805, + 52.46903991699219 + ] + }, + "confidence": 0.3671963426996153 + }, + { + "observation_id": "05bcbba5-7a1e-4024-8836-81eba0273951", + "type": "aruco", + "marker_id": 210, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 147.0, + 597.0 + ], + [ + 196.0, + 589.0 + ], + [ + 202.0, + 614.0 + ], + [ + 152.0, + 623.0 + ] + ], + "center_px": [ + 174.25, + 605.75 + ], + "quality": { + "area_px": 1309.0, + "perimeter_px": 152.63863372802734, + "sharpness": { + "laplacian_var": 2874.586081340775 + }, + "contrast": { + "p05": 17.0, + "p95": 179.0, + "dynamic_range": 162.0, + "mean_gray": 74.25913621262458, + "std_gray": 69.19237760500586 + }, + "geometry": { + "distance_to_center_norm": 0.7171543836593628, + "distance_to_border_px": 97.0 + }, + "edge_ratio": 1.9760287603241775, + "edge_lengths_px": [ + 49.648765563964844, + 25.70992088317871, + 50.80354309082031, + 26.476404190063477 + ] + }, + "confidence": 0.4416265006808409 + }, + { + "observation_id": "2c325e53-0359-472c-ab13-af9288330b29", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 624.0, + 586.0 + ], + [ + 669.0, + 577.0 + ], + [ + 685.0, + 602.0 + ], + [ + 639.0, + 610.0 + ] + ], + "center_px": [ + 654.25, + 593.75 + ], + "quality": { + "area_px": 1246.5, + "perimeter_px": 150.56523323059082, + "sharpness": { + "laplacian_var": 2749.1520781451327 + }, + "contrast": { + "p05": 13.0, + "p95": 176.0, + "dynamic_range": 163.0, + "mean_gray": 78.26460071513706, + "std_gray": 73.26526378850413 + }, + "geometry": { + "distance_to_center_norm": 0.3189203441143036, + "distance_to_border_px": 110.0 + }, + "edge_ratio": 1.6497267320956905, + "edge_lengths_px": [ + 45.89117431640625, + 29.681644439697266, + 46.69047164916992, + 28.301942825317383 + ] + }, + "confidence": 0.5037197881520409 + }, + { + "observation_id": "43ed3c3a-b200-407a-8cd0-acd3447d3c88", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 804.0, + 550.0 + ], + [ + 846.0, + 543.0 + ], + [ + 866.0, + 566.0 + ], + [ + 823.0, + 574.0 + ] + ], + "center_px": [ + 834.75, + 558.25 + ], + "quality": { + "area_px": 1145.0, + "perimeter_px": 147.4071502685547, + "sharpness": { + "laplacian_var": 2772.7042557487066 + }, + "contrast": { + "p05": 11.0, + "p95": 168.0, + "dynamic_range": 157.0, + "mean_gray": 67.48548812664907, + "std_gray": 67.30111264325656 + }, + "geometry": { + "distance_to_center_norm": 0.3784599006175995, + "distance_to_border_px": 146.0 + }, + "edge_ratio": 1.4349924221076584, + "edge_lengths_px": [ + 42.57933807373047, + 30.479501724243164, + 43.73785400390625, + 30.610456466674805 + ] + }, + "confidence": 0.5319424141712054 + }, + { + "observation_id": "6311827e-6a45-4465-9d41-e5a28c44e7e8", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 576.0, + 510.0 + ], + [ + 618.0, + 502.0 + ], + [ + 633.0, + 523.0 + ], + [ + 590.0, + 531.0 + ] + ], + "center_px": [ + 604.25, + 516.5 + ], + "quality": { + "area_px": 1008.5, + "perimeter_px": 137.53880500793457, + "sharpness": { + "laplacian_var": 2547.242275529489 + }, + "contrast": { + "p05": 16.0, + "p95": 176.0, + "dynamic_range": 160.0, + "mean_gray": 77.97079276773296, + "std_gray": 70.45003740258201 + }, + "geometry": { + "distance_to_center_norm": 0.2186174839735031, + "distance_to_border_px": 189.0 + }, + "edge_ratio": 1.7329568542620777, + "edge_lengths_px": [ + 42.7551155090332, + 25.806976318359375, + 43.73785400390625, + 25.238859176635742 + ] + }, + "confidence": 0.38796888201791047 + }, + { + "observation_id": "7bdcd7db-f6cf-4c00-bc34-c6cbdfb40c87", + "type": "aruco", + "marker_id": 214, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 745.0, + 479.0 + ], + [ + 785.0, + 472.0 + ], + [ + 802.0, + 492.0 + ], + [ + 762.0, + 499.0 + ] + ], + "center_px": [ + 773.5, + 485.5 + ], + "quality": { + "area_px": 919.0, + "perimeter_px": 133.71337890625, + "sharpness": { + "laplacian_var": 3101.8661949456414 + }, + "contrast": { + "p05": 12.0, + "p95": 166.0, + "dynamic_range": 154.0, + "mean_gray": 85.11746522411129, + "std_gray": 67.88802345752185 + }, + "geometry": { + "distance_to_center_norm": 0.24952663481235504, + "distance_to_border_px": 221.0 + }, + "edge_ratio": 1.5470369866565286, + "edge_lengths_px": [ + 40.607879638671875, + 26.248809814453125, + 40.607879638671875, + 26.248809814453125 + ] + }, + "confidence": 0.3960258687743258 + }, + { + "observation_id": "d9d8a79b-edff-4c16-90aa-e20d660da48f", + "type": "aruco", + "marker_id": 206, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1196.0, + 398.0 + ], + [ + 1229.0, + 392.0 + ], + [ + 1254.0, + 409.0 + ], + [ + 1219.0, + 414.0 + ] + ], + "center_px": [ + 1224.5, + 403.25 + ], + "quality": { + "area_px": 693.0, + "perimeter_px": 127.14664268493652, + "sharpness": { + "laplacian_var": 3871.735724826389 + }, + "contrast": { + "p05": 11.0, + "p95": 158.0, + "dynamic_range": 147.0, + "mean_gray": 65.0125, + "std_gray": 59.72788860392885 + }, + "geometry": { + "distance_to_center_norm": 0.7981697916984558, + "distance_to_border_px": 26.0 + }, + "edge_ratio": 1.261886188450016, + "edge_lengths_px": [ + 33.541019439697266, + 30.232433319091797, + 35.35533905029297, + 28.017850875854492 + ] + }, + "confidence": 0.19038167007366058 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 388.0, + 94.0 + ], + [ + 304.0, + 138.0 + ], + [ + 281.0, + 135.0 + ], + [ + 367.0, + 92.0 + ] + ], + "center_px": [ + 335.0, + 114.75 + ], + "area_px": 1169.5 + }, + { + "image_points_px": [ + [ + 309.0, + 73.0 + ], + [ + 241.0, + 104.0 + ], + [ + 219.0, + 101.0 + ], + [ + 291.0, + 70.0 + ] + ], + "center_px": [ + 265.0, + 87.0 + ], + "area_px": 830.0 + }, + { + "image_points_px": [ + [ + 462.0, + 58.0 + ], + [ + 404.0, + 87.0 + ], + [ + 383.0, + 86.0 + ], + [ + 442.0, + 56.0 + ] + ], + "center_px": [ + 422.75, + 71.75 + ], + "area_px": 692.5 + }, + { + "image_points_px": [ + [ + 951.0, + 26.0 + ], + [ + 903.0, + 66.0 + ], + [ + 886.0, + 62.0 + ], + [ + 930.0, + 24.0 + ] + ], + "center_px": [ + 917.5, + 44.5 + ], + "area_px": 879.0 + }, + { + "image_points_px": [ + [ + 1149.0, + 295.0 + ], + [ + 1210.0, + 299.0 + ], + [ + 1225.0, + 309.0 + ], + [ + 1164.0, + 305.0 + ] + ], + "center_px": [ + 1187.0, + 302.0 + ], + "area_px": 550.0 + }, + { + "image_points_px": [ + [ + 1069.0, + 226.0 + ], + [ + 1125.0, + 229.0 + ], + [ + 1138.0, + 237.0 + ], + [ + 1118.0, + 239.0 + ] + ], + "center_px": [ + 1112.5, + 232.75 + ], + "area_px": 383.5 + }, + { + "image_points_px": [ + [ + 930.0, + 438.0 + ], + [ + 942.0, + 444.0 + ], + [ + 972.0, + 493.0 + ], + [ + 961.0, + 485.0 + ] + ], + "center_px": [ + 951.25, + 465.0 + ], + "area_px": 338.5 + }, + { + "image_points_px": [ + [ + 1127.0, + 197.0 + ], + [ + 1181.0, + 200.0 + ], + [ + 1194.0, + 207.0 + ], + [ + 1139.0, + 204.0 + ] + ], + "center_px": [ + 1160.25, + 202.0 + ], + "area_px": 344.0 + }, + { + "image_points_px": [ + [ + 144.0, + 684.0 + ], + [ + 147.0, + 707.0 + ], + [ + 106.0, + 715.0 + ], + [ + 103.0, + 692.0 + ] + ], + "center_px": [ + 125.0, + 699.5 + ], + "area_px": 967.0 + }, + { + "image_points_px": [ + [ + 1075.0, + 166.0 + ], + [ + 1127.0, + 170.0 + ], + [ + 1138.0, + 176.0 + ], + [ + 1087.0, + 173.0 + ] + ], + "center_px": [ + 1106.75, + 171.25 + ], + "area_px": 294.5 + }, + { + "image_points_px": [ + [ + 799.0, + 699.0 + ], + [ + 762.0, + 707.0 + ], + [ + 747.0, + 685.0 + ], + [ + 783.0, + 677.0 + ] + ], + "center_px": [ + 772.75, + 692.0 + ], + "area_px": 927.0 + }, + { + "image_points_px": [ + [ + 928.0, + 697.0 + ], + [ + 892.0, + 705.0 + ], + [ + 875.0, + 683.0 + ], + [ + 910.0, + 676.0 + ] + ], + "center_px": [ + 901.25, + 690.25 + ], + "area_px": 894.5 + }, + { + "image_points_px": [ + [ + 1003.0, + 682.0 + ], + [ + 1029.0, + 675.0 + ], + [ + 1057.0, + 696.0 + ], + [ + 1023.0, + 704.0 + ] + ], + "center_px": [ + 1028.0, + 689.25 + ], + "area_px": 825.0 + }, + { + "image_points_px": [ + [ + 1000.0, + 681.0 + ], + [ + 965.0, + 688.0 + ], + [ + 947.0, + 667.0 + ], + [ + 981.0, + 660.0 + ] + ], + "center_px": [ + 973.25, + 674.0 + ], + "area_px": 854.0 + }, + { + "image_points_px": [ + [ + 873.0, + 682.0 + ], + [ + 837.0, + 690.0 + ], + [ + 821.0, + 669.0 + ], + [ + 856.0, + 661.0 + ] + ], + "center_px": [ + 846.75, + 675.5 + ], + "area_px": 877.5 + }, + { + "image_points_px": [ + [ + 669.0, + 700.0 + ], + [ + 632.0, + 708.0 + ], + [ + 619.0, + 686.0 + ], + [ + 656.0, + 679.0 + ] + ], + "center_px": [ + 644.0, + 693.25 + ], + "area_px": 893.0 + }, + { + "image_points_px": [ + [ + 819.0, + 668.0 + ], + [ + 783.0, + 675.0 + ], + [ + 768.0, + 654.0 + ], + [ + 803.0, + 647.0 + ] + ], + "center_px": [ + 793.25, + 661.0 + ], + "area_px": 854.0 + }, + { + "image_points_px": [ + [ + 99.0, + 671.0 + ], + [ + 101.0, + 691.0 + ], + [ + 60.0, + 699.0 + ], + [ + 59.0, + 677.0 + ] + ], + "center_px": [ + 79.75, + 684.5 + ], + "area_px": 861.0 + }, + { + "image_points_px": [ + [ + 745.0, + 684.0 + ], + [ + 708.0, + 691.0 + ], + [ + 695.0, + 670.0 + ], + [ + 731.0, + 663.0 + ] + ], + "center_px": [ + 719.75, + 677.0 + ], + "area_px": 861.0 + }, + { + "image_points_px": [ + [ + 945.0, + 666.0 + ], + [ + 911.0, + 674.0 + ], + [ + 893.0, + 653.0 + ], + [ + 927.0, + 646.0 + ] + ], + "center_px": [ + 919.0, + 659.75 + ], + "area_px": 832.0 + }, + { + "image_points_px": [ + [ + 55.0, + 656.0 + ], + [ + 57.0, + 676.0 + ], + [ + 16.0, + 684.0 + ], + [ + 15.0, + 663.0 + ] + ], + "center_px": [ + 35.75, + 669.75 + ], + "area_px": 841.5 + }, + { + "image_points_px": [ + [ + 1205.0, + 635.0 + ], + [ + 1173.0, + 641.0 + ], + [ + 1152.0, + 621.0 + ], + [ + 1184.0, + 615.0 + ] + ], + "center_px": [ + 1178.5, + 628.0 + ], + "area_px": 766.0 + }, + { + "image_points_px": [ + [ + 1015.0, + 651.0 + ], + [ + 981.0, + 658.0 + ], + [ + 963.0, + 638.0 + ], + [ + 996.0, + 631.0 + ] + ], + "center_px": [ + 988.75, + 644.5 + ], + "area_px": 799.5 + }, + { + "image_points_px": [ + [ + 1020.0, + 148.0 + ], + [ + 1038.0, + 146.0 + ], + [ + 1080.0, + 156.0 + ], + [ + 1062.0, + 158.0 + ] + ], + "center_px": [ + 1050.0, + 152.0 + ], + "area_px": 264.0 + }, + { + "image_points_px": [ + [ + 891.0, + 652.0 + ], + [ + 856.0, + 659.0 + ], + [ + 840.0, + 639.0 + ], + [ + 874.0, + 632.0 + ] + ], + "center_px": [ + 865.25, + 645.5 + ], + "area_px": 805.5 + }, + { + "image_points_px": [ + [ + 1200.0, + 665.0 + ], + [ + 1230.0, + 657.0 + ], + [ + 1252.0, + 677.0 + ], + [ + 1221.0, + 685.0 + ] + ], + "center_px": [ + 1225.75, + 671.0 + ], + "area_px": 782.0 + }, + { + "image_points_px": [ + [ + 910.0, + 624.0 + ], + [ + 944.0, + 618.0 + ], + [ + 961.0, + 637.0 + ], + [ + 927.0, + 644.0 + ] + ], + "center_px": [ + 935.5, + 630.75 + ], + "area_px": 773.5 + }, + { + "image_points_px": [ + [ + 137.0, + 641.0 + ], + [ + 139.0, + 661.0 + ], + [ + 100.0, + 668.0 + ], + [ + 98.0, + 647.0 + ] + ], + "center_px": [ + 118.5, + 654.25 + ], + "area_px": 812.5 + }, + { + "image_points_px": [ + [ + 1029.0, + 622.0 + ], + [ + 996.0, + 629.0 + ], + [ + 978.0, + 610.0 + ], + [ + 1010.0, + 603.0 + ] + ], + "center_px": [ + 1003.25, + 616.0 + ], + "area_px": 747.0 + }, + { + "image_points_px": [ + [ + 1208.0, + 635.0 + ], + [ + 1232.0, + 629.0 + ], + [ + 1259.0, + 649.0 + ], + [ + 1230.0, + 655.0 + ] + ], + "center_px": [ + 1232.25, + 642.0 + ], + "area_px": 677.0 + }, + { + "image_points_px": [ + [ + 93.0, + 628.0 + ], + [ + 94.0, + 647.0 + ], + [ + 56.0, + 654.0 + ], + [ + 54.0, + 634.0 + ] + ], + "center_px": [ + 74.25, + 640.75 + ], + "area_px": 760.5 + }, + { + "image_points_px": [ + [ + 50.0, + 614.0 + ], + [ + 52.0, + 633.0 + ], + [ + 13.0, + 640.0 + ], + [ + 12.0, + 620.0 + ] + ], + "center_px": [ + 31.75, + 626.75 + ], + "area_px": 760.5 + }, + { + "image_points_px": [ + [ + 129.0, + 599.0 + ], + [ + 132.0, + 618.0 + ], + [ + 94.0, + 625.0 + ], + [ + 91.0, + 606.0 + ] + ], + "center_px": [ + 111.5, + 612.0 + ], + "area_px": 743.0 + }, + { + "image_points_px": [ + [ + 46.0, + 574.0 + ], + [ + 48.0, + 592.0 + ], + [ + 10.0, + 599.0 + ], + [ + 9.0, + 581.0 + ] + ], + "center_px": [ + 28.25, + 586.5 + ], + "area_px": 685.5 + }, + { + "image_points_px": [ + [ + 87.0, + 587.0 + ], + [ + 89.0, + 605.0 + ], + [ + 51.0, + 611.0 + ], + [ + 50.0, + 593.0 + ] + ], + "center_px": [ + 69.25, + 599.0 + ], + "area_px": 684.0 + }, + { + "image_points_px": [ + [ + 972.0, + 92.0 + ], + [ + 1017.0, + 95.0 + ], + [ + 1026.0, + 100.0 + ], + [ + 980.0, + 97.0 + ] + ], + "center_px": [ + 998.75, + 96.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 939.0, + 528.0 + ], + [ + 970.0, + 522.0 + ], + [ + 987.0, + 539.0 + ], + [ + 953.0, + 542.0 + ] + ], + "center_px": [ + 962.25, + 532.75 + ], + "area_px": 573.5 + }, + { + "image_points_px": [ + [ + 82.0, + 549.0 + ], + [ + 84.0, + 566.0 + ], + [ + 47.0, + 572.0 + ], + [ + 47.0, + 555.0 + ] + ], + "center_px": [ + 65.0, + 560.5 + ], + "area_px": 618.0 + }, + { + "image_points_px": [ + [ + 539.0, + 702.0 + ], + [ + 501.0, + 710.0 + ], + [ + 494.0, + 698.0 + ], + [ + 533.0, + 689.0 + ] + ], + "center_px": [ + 516.75, + 699.75 + ], + "area_px": 536.5 + }, + { + "image_points_px": [ + [ + 43.0, + 538.0 + ], + [ + 44.0, + 554.0 + ], + [ + 8.0, + 561.0 + ], + [ + 7.0, + 544.0 + ] + ], + "center_px": [ + 25.5, + 549.25 + ], + "area_px": 600.5 + }, + { + "image_points_px": [ + [ + 617.0, + 685.0 + ], + [ + 580.0, + 693.0 + ], + [ + 572.0, + 681.0 + ], + [ + 611.0, + 673.0 + ] + ], + "center_px": [ + 595.0, + 683.0 + ], + "area_px": 512.0 + }, + { + "image_points_px": [ + [ + 358.0, + 112.0 + ], + [ + 403.0, + 115.0 + ], + [ + 407.0, + 120.0 + ], + [ + 362.0, + 117.0 + ] + ], + "center_px": [ + 382.5, + 116.0 + ], + "area_px": 213.0 + }, + { + "image_points_px": [ + [ + 119.0, + 562.0 + ], + [ + 121.0, + 579.0 + ], + [ + 88.0, + 585.0 + ], + [ + 86.0, + 567.0 + ] + ], + "center_px": [ + 103.5, + 573.25 + ], + "area_px": 588.5 + }, + { + "image_points_px": [ + [ + 692.0, + 669.0 + ], + [ + 657.0, + 677.0 + ], + [ + 649.0, + 665.0 + ], + [ + 685.0, + 657.0 + ] + ], + "center_px": [ + 670.75, + 667.0 + ], + "area_px": 486.0 + }, + { + "image_points_px": [ + [ + 73.0, + 482.0 + ], + [ + 75.0, + 496.0 + ], + [ + 40.0, + 502.0 + ], + [ + 39.0, + 487.0 + ] + ], + "center_px": [ + 56.75, + 491.75 + ], + "area_px": 508.5 + }, + { + "image_points_px": [ + [ + 838.0, + 638.0 + ], + [ + 804.0, + 645.0 + ], + [ + 795.0, + 634.0 + ], + [ + 830.0, + 627.0 + ] + ], + "center_px": [ + 816.75, + 636.0 + ], + "area_px": 439.0 + }, + { + "image_points_px": [ + [ + 113.0, + 526.0 + ], + [ + 115.0, + 542.0 + ], + [ + 83.0, + 547.0 + ], + [ + 81.0, + 531.0 + ] + ], + "center_px": [ + 98.0, + 536.5 + ], + "area_px": 522.0 + }, + { + "image_points_px": [ + [ + 908.0, + 623.0 + ], + [ + 874.0, + 630.0 + ], + [ + 865.0, + 620.0 + ], + [ + 899.0, + 613.0 + ] + ], + "center_px": [ + 886.5, + 621.5 + ], + "area_px": 403.0 + }, + { + "image_points_px": [ + [ + 36.0, + 472.0 + ], + [ + 37.0, + 486.0 + ], + [ + 3.0, + 491.0 + ], + [ + 3.0, + 477.0 + ] + ], + "center_px": [ + 19.75, + 481.5 + ], + "area_px": 471.5 + }, + { + "image_points_px": [ + [ + 77.0, + 516.0 + ], + [ + 78.0, + 530.0 + ], + [ + 44.0, + 534.0 + ], + [ + 44.0, + 520.0 + ] + ], + "center_px": [ + 60.75, + 525.0 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 209.0, + 460.0 + ], + [ + 213.0, + 474.0 + ], + [ + 180.0, + 479.0 + ], + [ + 177.0, + 465.0 + ] + ], + "center_px": [ + 194.75, + 469.5 + ], + "area_px": 472.5 + }, + { + "image_points_px": [ + [ + 976.0, + 609.0 + ], + [ + 944.0, + 616.0 + ], + [ + 934.0, + 605.0 + ], + [ + 967.0, + 599.0 + ] + ], + "center_px": [ + 955.25, + 607.25 + ], + "area_px": 403.0 + }, + { + "image_points_px": [ + [ + 39.0, + 505.0 + ], + [ + 39.0, + 519.0 + ], + [ + 6.0, + 523.0 + ], + [ + 6.0, + 509.0 + ] + ], + "center_px": [ + 22.5, + 514.0 + ], + "area_px": 462.0 + }, + { + "image_points_px": [ + [ + 69.0, + 452.0 + ], + [ + 70.0, + 465.0 + ], + [ + 37.0, + 470.0 + ], + [ + 36.0, + 456.0 + ] + ], + "center_px": [ + 53.0, + 460.75 + ], + "area_px": 450.0 + }, + { + "image_points_px": [ + [ + 172.0, + 450.0 + ], + [ + 175.0, + 464.0 + ], + [ + 143.0, + 469.0 + ], + [ + 140.0, + 455.0 + ] + ], + "center_px": [ + 157.5, + 459.5 + ], + "area_px": 463.0 + }, + { + "image_points_px": [ + [ + 275.0, + 449.0 + ], + [ + 280.0, + 463.0 + ], + [ + 248.0, + 468.0 + ], + [ + 244.0, + 454.0 + ] + ], + "center_px": [ + 261.75, + 458.5 + ], + "area_px": 463.5 + }, + { + "image_points_px": [ + [ + 107.0, + 493.0 + ], + [ + 110.0, + 507.0 + ], + [ + 78.0, + 513.0 + ], + [ + 77.0, + 497.0 + ] + ], + "center_px": [ + 93.0, + 502.5 + ], + "area_px": 475.0 + }, + { + "image_points_px": [ + [ + 238.0, + 440.0 + ], + [ + 242.0, + 453.0 + ], + [ + 210.0, + 458.0 + ], + [ + 206.0, + 445.0 + ] + ], + "center_px": [ + 224.0, + 449.0 + ], + "area_px": 436.0 + }, + { + "image_points_px": [ + [ + 65.0, + 423.0 + ], + [ + 66.0, + 435.0 + ], + [ + 34.0, + 440.0 + ], + [ + 33.0, + 427.0 + ] + ], + "center_px": [ + 49.5, + 431.25 + ], + "area_px": 404.5 + }, + { + "image_points_px": [ + [ + 307.0, + 442.0 + ], + [ + 276.0, + 447.0 + ], + [ + 271.0, + 434.0 + ], + [ + 302.0, + 430.0 + ] + ], + "center_px": [ + 289.0, + 438.25 + ], + "area_px": 410.0 + }, + { + "image_points_px": [ + [ + 201.0, + 431.0 + ], + [ + 204.0, + 444.0 + ], + [ + 173.0, + 448.0 + ], + [ + 170.0, + 435.0 + ] + ], + "center_px": [ + 187.0, + 439.5 + ], + "area_px": 415.0 + }, + { + "image_points_px": [ + [ + 165.0, + 422.0 + ], + [ + 168.0, + 434.0 + ], + [ + 136.0, + 439.0 + ], + [ + 134.0, + 426.0 + ] + ], + "center_px": [ + 150.75, + 430.25 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 102.0, + 461.0 + ], + [ + 104.0, + 475.0 + ], + [ + 74.0, + 480.0 + ], + [ + 72.0, + 466.0 + ] + ], + "center_px": [ + 88.0, + 470.5 + ], + "area_px": 430.0 + }, + { + "image_points_px": [ + [ + 265.0, + 421.0 + ], + [ + 269.0, + 433.0 + ], + [ + 238.0, + 438.0 + ], + [ + 235.0, + 425.0 + ] + ], + "center_px": [ + 251.75, + 429.25 + ], + "area_px": 397.0 + }, + { + "image_points_px": [ + [ + 229.0, + 412.0 + ], + [ + 233.0, + 424.0 + ], + [ + 202.0, + 429.0 + ], + [ + 199.0, + 416.0 + ] + ], + "center_px": [ + 215.75, + 420.25 + ], + "area_px": 397.0 + }, + { + "image_points_px": [ + [ + 333.0, + 423.0 + ], + [ + 303.0, + 428.0 + ], + [ + 298.0, + 415.0 + ], + [ + 328.0, + 411.0 + ] + ], + "center_px": [ + 315.5, + 419.25 + ], + "area_px": 397.5 + }, + { + "image_points_px": [ + [ + 710.0, + 393.0 + ], + [ + 682.0, + 397.0 + ], + [ + 672.0, + 385.0 + ], + [ + 699.0, + 381.0 + ] + ], + "center_px": [ + 690.75, + 389.0 + ], + "area_px": 372.0 + }, + { + "image_points_px": [ + [ + 345.0, + 451.0 + ], + [ + 315.0, + 457.0 + ], + [ + 310.0, + 444.0 + ], + [ + 339.0, + 439.0 + ] + ], + "center_px": [ + 327.25, + 447.75 + ], + "area_px": 399.0 + }, + { + "image_points_px": [ + [ + 613.0, + 394.0 + ], + [ + 585.0, + 398.0 + ], + [ + 576.0, + 386.0 + ], + [ + 604.0, + 382.0 + ] + ], + "center_px": [ + 594.5, + 390.0 + ], + "area_px": 372.0 + }, + { + "image_points_px": [ + [ + 193.0, + 403.0 + ], + [ + 197.0, + 415.0 + ], + [ + 166.0, + 420.0 + ], + [ + 164.0, + 407.0 + ] + ], + "center_px": [ + 180.0, + 411.25 + ], + "area_px": 388.5 + }, + { + "image_points_px": [ + [ + 766.0, + 384.0 + ], + [ + 739.0, + 387.0 + ], + [ + 728.0, + 376.0 + ], + [ + 755.0, + 372.0 + ] + ], + "center_px": [ + 747.0, + 379.75 + ], + "area_px": 349.0 + }, + { + "image_points_px": [ + [ + 1143.0, + 685.0 + ], + [ + 1160.0, + 674.0 + ], + [ + 1181.0, + 691.0 + ], + [ + 1156.0, + 690.0 + ] + ], + "center_px": [ + 1160.0, + 685.0 + ], + "area_px": 316.0 + }, + { + "image_points_px": [ + [ + 95.0, + 404.0 + ], + [ + 96.0, + 416.0 + ], + [ + 66.0, + 421.0 + ], + [ + 65.0, + 408.0 + ] + ], + "center_px": [ + 80.5, + 412.25 + ], + "area_px": 379.5 + }, + { + "image_points_px": [ + [ + 652.0, + 402.0 + ], + [ + 624.0, + 406.0 + ], + [ + 615.0, + 394.0 + ], + [ + 643.0, + 391.0 + ] + ], + "center_px": [ + 633.5, + 398.25 + ], + "area_px": 353.5 + }, + { + "image_points_px": [ + [ + 260.0, + 405.0 + ], + [ + 230.0, + 410.0 + ], + [ + 226.0, + 398.0 + ], + [ + 256.0, + 394.0 + ] + ], + "center_px": [ + 243.0, + 401.75 + ], + "area_px": 363.0 + }, + { + "image_points_px": [ + [ + 296.0, + 413.0 + ], + [ + 266.0, + 419.0 + ], + [ + 262.0, + 407.0 + ], + [ + 291.0, + 402.0 + ] + ], + "center_px": [ + 278.75, + 410.25 + ], + "area_px": 364.0 + }, + { + "image_points_px": [ + [ + 220.0, + 385.0 + ], + [ + 224.0, + 397.0 + ], + [ + 194.0, + 401.0 + ], + [ + 191.0, + 389.0 + ] + ], + "center_px": [ + 207.25, + 393.0 + ], + "area_px": 368.0 + }, + { + "image_points_px": [ + [ + 158.0, + 395.0 + ], + [ + 161.0, + 406.0 + ], + [ + 131.0, + 411.0 + ], + [ + 128.0, + 399.0 + ] + ], + "center_px": [ + 144.5, + 402.75 + ], + "area_px": 358.5 + }, + { + "image_points_px": [ + [ + 782.0, + 367.0 + ], + [ + 755.0, + 370.0 + ], + [ + 745.0, + 359.0 + ], + [ + 771.0, + 356.0 + ] + ], + "center_px": [ + 763.25, + 363.0 + ], + "area_px": 323.0 + }, + { + "image_points_px": [ + [ + 836.0, + 358.0 + ], + [ + 810.0, + 362.0 + ], + [ + 799.0, + 351.0 + ], + [ + 824.0, + 347.0 + ] + ], + "center_px": [ + 817.25, + 354.5 + ], + "area_px": 326.5 + }, + { + "image_points_px": [ + [ + 784.0, + 367.0 + ], + [ + 810.0, + 364.0 + ], + [ + 821.0, + 375.0 + ], + [ + 795.0, + 378.0 + ] + ], + "center_px": [ + 802.5, + 371.0 + ], + "area_px": 319.0 + }, + { + "image_points_px": [ + [ + 797.0, + 350.0 + ], + [ + 771.0, + 354.0 + ], + [ + 760.0, + 343.0 + ], + [ + 786.0, + 340.0 + ] + ], + "center_px": [ + 778.5, + 346.75 + ], + "area_px": 311.5 + }, + { + "image_points_px": [ + [ + 186.0, + 377.0 + ], + [ + 188.0, + 389.0 + ], + [ + 159.0, + 393.0 + ], + [ + 157.0, + 381.0 + ] + ], + "center_px": [ + 172.5, + 385.0 + ], + "area_px": 356.0 + }, + { + "image_points_px": [ + [ + 726.0, + 375.0 + ], + [ + 699.0, + 379.0 + ], + [ + 690.0, + 368.0 + ], + [ + 716.0, + 364.0 + ] + ], + "center_px": [ + 707.75, + 371.5 + ], + "area_px": 329.5 + }, + { + "image_points_px": [ + [ + 152.0, + 369.0 + ], + [ + 155.0, + 380.0 + ], + [ + 125.0, + 384.0 + ], + [ + 123.0, + 373.0 + ] + ], + "center_px": [ + 138.75, + 376.5 + ], + "area_px": 334.5 + }, + { + "image_points_px": [ + [ + 246.0, + 368.0 + ], + [ + 250.0, + 380.0 + ], + [ + 222.0, + 384.0 + ], + [ + 218.0, + 372.0 + ] + ], + "center_px": [ + 234.0, + 376.0 + ], + "area_px": 352.0 + }, + { + "image_points_px": [ + [ + 92.0, + 433.0 + ], + [ + 99.0, + 445.0 + ], + [ + 70.0, + 450.0 + ], + [ + 68.0, + 436.0 + ] + ], + "center_px": [ + 82.25, + 441.0 + ], + "area_px": 362.5 + }, + { + "image_points_px": [ + [ + 743.0, + 359.0 + ], + [ + 716.0, + 362.0 + ], + [ + 707.0, + 352.0 + ], + [ + 732.0, + 348.0 + ] + ], + "center_px": [ + 724.5, + 355.25 + ], + "area_px": 308.0 + }, + { + "image_points_px": [ + [ + 1100.0, + 92.0 + ], + [ + 1126.0, + 91.0 + ], + [ + 1138.0, + 95.0 + ], + [ + 1138.0, + 99.0 + ] + ], + "center_px": [ + 1125.5, + 94.25 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 1234.0, + 295.0 + ], + [ + 1256.0, + 292.0 + ], + [ + 1272.0, + 301.0 + ], + [ + 1249.0, + 304.0 + ] + ], + "center_px": [ + 1252.75, + 298.0 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 669.0, + 344.0 + ], + [ + 695.0, + 341.0 + ], + [ + 705.0, + 351.0 + ], + [ + 678.0, + 354.0 + ] + ], + "center_px": [ + 686.75, + 347.5 + ], + "area_px": 293.5 + }, + { + "image_points_px": [ + [ + 86.0, + 354.0 + ], + [ + 88.0, + 364.0 + ], + [ + 58.0, + 368.0 + ], + [ + 57.0, + 357.0 + ] + ], + "center_px": [ + 72.25, + 360.75 + ], + "area_px": 315.0 + }, + { + "image_points_px": [ + [ + 1053.0, + 310.0 + ], + [ + 1077.0, + 308.0 + ], + [ + 1090.0, + 317.0 + ], + [ + 1066.0, + 320.0 + ] + ], + "center_px": [ + 1071.5, + 313.75 + ], + "area_px": 260.5 + }, + { + "image_points_px": [ + [ + 813.0, + 335.0 + ], + [ + 839.0, + 332.0 + ], + [ + 849.0, + 342.0 + ], + [ + 824.0, + 345.0 + ] + ], + "center_px": [ + 831.25, + 338.5 + ], + "area_px": 286.5 + }, + { + "image_points_px": [ + [ + 774.0, + 327.0 + ], + [ + 748.0, + 330.0 + ], + [ + 738.0, + 320.0 + ], + [ + 763.0, + 317.0 + ] + ], + "center_px": [ + 755.75, + 323.5 + ], + "area_px": 286.5 + }, + { + "image_points_px": [ + [ + 61.0, + 397.0 + ], + [ + 61.0, + 407.0 + ], + [ + 31.0, + 410.0 + ], + [ + 31.0, + 400.0 + ] + ], + "center_px": [ + 46.0, + 403.5 + ], + "area_px": 300.0 + }, + { + "image_points_px": [ + [ + 1093.0, + 317.0 + ], + [ + 1116.0, + 315.0 + ], + [ + 1130.0, + 324.0 + ], + [ + 1107.0, + 327.0 + ] + ], + "center_px": [ + 1111.5, + 320.75 + ], + "area_px": 253.5 + }, + { + "image_points_px": [ + [ + 276.0, + 362.0 + ], + [ + 247.0, + 366.0 + ], + [ + 243.0, + 356.0 + ], + [ + 272.0, + 352.0 + ] + ], + "center_px": [ + 259.5, + 359.0 + ], + "area_px": 306.0 + }, + { + "image_points_px": [ + [ + 216.0, + 370.0 + ], + [ + 187.0, + 375.0 + ], + [ + 184.0, + 364.0 + ], + [ + 212.0, + 360.0 + ] + ], + "center_px": [ + 199.75, + 367.25 + ], + "area_px": 315.0 + }, + { + "image_points_px": [ + [ + 1101.0, + 303.0 + ], + [ + 1124.0, + 300.0 + ], + [ + 1138.0, + 309.0 + ], + [ + 1114.0, + 312.0 + ] + ], + "center_px": [ + 1119.25, + 306.0 + ], + "area_px": 252.0 + }, + { + "image_points_px": [ + [ + 1141.0, + 310.0 + ], + [ + 1164.0, + 307.0 + ], + [ + 1178.0, + 316.0 + ], + [ + 1155.0, + 319.0 + ] + ], + "center_px": [ + 1159.5, + 313.0 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 1099.0, + 302.0 + ], + [ + 1076.0, + 305.0 + ], + [ + 1062.0, + 296.0 + ], + [ + 1085.0, + 293.0 + ] + ], + "center_px": [ + 1080.5, + 299.0 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 667.0, + 343.0 + ], + [ + 641.0, + 347.0 + ], + [ + 632.0, + 337.0 + ], + [ + 658.0, + 333.0 + ] + ], + "center_px": [ + 649.5, + 340.0 + ], + "area_px": 296.0 + }, + { + "image_points_px": [ + [ + 721.0, + 335.0 + ], + [ + 694.0, + 338.0 + ], + [ + 686.0, + 328.0 + ], + [ + 711.0, + 325.0 + ] + ], + "center_px": [ + 703.0, + 331.5 + ], + "area_px": 287.0 + }, + { + "image_points_px": [ + [ + 684.0, + 328.0 + ], + [ + 658.0, + 331.0 + ], + [ + 649.0, + 321.0 + ], + [ + 675.0, + 318.0 + ] + ], + "center_px": [ + 666.5, + 324.5 + ], + "area_px": 287.0 + }, + { + "image_points_px": [ + [ + 758.0, + 343.0 + ], + [ + 733.0, + 346.0 + ], + [ + 723.0, + 336.0 + ], + [ + 747.0, + 332.0 + ] + ], + "center_px": [ + 740.25, + 339.25 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 179.0, + 353.0 + ], + [ + 182.0, + 363.0 + ], + [ + 153.0, + 367.0 + ], + [ + 151.0, + 356.0 + ] + ], + "center_px": [ + 166.25, + 359.75 + ], + "area_px": 308.0 + }, + { + "image_points_px": [ + [ + 811.0, + 334.0 + ], + [ + 786.0, + 338.0 + ], + [ + 776.0, + 328.0 + ], + [ + 800.0, + 324.0 + ] + ], + "center_px": [ + 793.25, + 331.0 + ], + "area_px": 287.0 + }, + { + "image_points_px": [ + [ + 54.0, + 346.0 + ], + [ + 55.0, + 356.0 + ], + [ + 26.0, + 360.0 + ], + [ + 26.0, + 349.0 + ] + ], + "center_px": [ + 40.25, + 352.75 + ], + "area_px": 301.0 + }, + { + "image_points_px": [ + [ + 825.0, + 319.0 + ], + [ + 801.0, + 323.0 + ], + [ + 790.0, + 313.0 + ], + [ + 814.0, + 309.0 + ] + ], + "center_px": [ + 807.5, + 316.0 + ], + "area_px": 284.0 + }, + { + "image_points_px": [ + [ + 205.0, + 337.0 + ], + [ + 208.0, + 347.0 + ], + [ + 180.0, + 351.0 + ], + [ + 177.0, + 340.0 + ] + ], + "center_px": [ + 192.5, + 343.75 + ], + "area_px": 304.5 + }, + { + "image_points_px": [ + [ + 238.0, + 344.0 + ], + [ + 241.0, + 355.0 + ], + [ + 213.0, + 358.0 + ], + [ + 210.0, + 348.0 + ] + ], + "center_px": [ + 225.5, + 351.25 + ], + "area_px": 304.5 + }, + { + "image_points_px": [ + [ + 669.0, + 383.0 + ], + [ + 643.0, + 388.0 + ], + [ + 635.0, + 378.0 + ], + [ + 660.0, + 373.0 + ] + ], + "center_px": [ + 651.75, + 380.5 + ], + "area_px": 297.5 + }, + { + "image_points_px": [ + [ + 1024.0, + 290.0 + ], + [ + 1047.0, + 287.0 + ], + [ + 1060.0, + 296.0 + ], + [ + 1038.0, + 299.0 + ] + ], + "center_px": [ + 1042.25, + 293.0 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 82.0, + 330.0 + ], + [ + 84.0, + 340.0 + ], + [ + 55.0, + 344.0 + ], + [ + 54.0, + 334.0 + ] + ], + "center_px": [ + 68.75, + 337.0 + ], + "area_px": 291.0 + }, + { + "image_points_px": [ + [ + 1110.0, + 289.0 + ], + [ + 1132.0, + 286.0 + ], + [ + 1146.0, + 295.0 + ], + [ + 1124.0, + 298.0 + ] + ], + "center_px": [ + 1128.0, + 292.0 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 300.0, + 346.0 + ], + [ + 273.0, + 350.0 + ], + [ + 268.0, + 340.0 + ], + [ + 296.0, + 336.0 + ] + ], + "center_px": [ + 284.25, + 343.0 + ], + "area_px": 293.0 + }, + { + "image_points_px": [ + [ + 285.0, + 386.0 + ], + [ + 258.0, + 392.0 + ], + [ + 253.0, + 382.0 + ], + [ + 281.0, + 377.0 + ] + ], + "center_px": [ + 269.25, + 384.25 + ], + "area_px": 286.0 + }, + { + "image_points_px": [ + [ + 1163.0, + 268.0 + ], + [ + 1185.0, + 266.0 + ], + [ + 1199.0, + 274.0 + ], + [ + 1177.0, + 277.0 + ] + ], + "center_px": [ + 1181.0, + 271.25 + ], + "area_px": 222.0 + }, + { + "image_points_px": [ + [ + 630.0, + 375.0 + ], + [ + 604.0, + 380.0 + ], + [ + 597.0, + 370.0 + ], + [ + 622.0, + 365.0 + ] + ], + "center_px": [ + 613.25, + 372.5 + ], + "area_px": 292.5 + }, + { + "image_points_px": [ + [ + 736.0, + 320.0 + ], + [ + 711.0, + 323.0 + ], + [ + 702.0, + 313.0 + ], + [ + 726.0, + 310.0 + ] + ], + "center_px": [ + 718.75, + 316.5 + ], + "area_px": 273.5 + }, + { + "image_points_px": [ + [ + 1208.0, + 261.0 + ], + [ + 1229.0, + 259.0 + ], + [ + 1244.0, + 267.0 + ], + [ + 1223.0, + 270.0 + ] + ], + "center_px": [ + 1226.0, + 264.25 + ], + "area_px": 216.0 + }, + { + "image_points_px": [ + [ + 1125.0, + 262.0 + ], + [ + 1148.0, + 260.0 + ], + [ + 1161.0, + 268.0 + ], + [ + 1139.0, + 270.0 + ] + ], + "center_px": [ + 1143.25, + 265.0 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 263.0, + 329.0 + ], + [ + 266.0, + 339.0 + ], + [ + 239.0, + 342.0 + ], + [ + 235.0, + 332.0 + ] + ], + "center_px": [ + 250.75, + 335.5 + ], + "area_px": 285.5 + }, + { + "image_points_px": [ + [ + 1170.0, + 255.0 + ], + [ + 1191.0, + 253.0 + ], + [ + 1206.0, + 261.0 + ], + [ + 1183.0, + 263.0 + ] + ], + "center_px": [ + 1187.5, + 258.0 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 51.0, + 323.0 + ], + [ + 52.0, + 333.0 + ], + [ + 24.0, + 336.0 + ], + [ + 23.0, + 326.0 + ] + ], + "center_px": [ + 37.5, + 329.5 + ], + "area_px": 283.0 + }, + { + "image_points_px": [ + [ + 700.0, + 313.0 + ], + [ + 675.0, + 316.0 + ], + [ + 666.0, + 307.0 + ], + [ + 690.0, + 303.0 + ] + ], + "center_px": [ + 682.75, + 309.75 + ], + "area_px": 266.0 + }, + { + "image_points_px": [ + [ + 1047.0, + 325.0 + ], + [ + 1067.0, + 322.0 + ], + [ + 1081.0, + 332.0 + ], + [ + 1058.0, + 336.0 + ] + ], + "center_px": [ + 1063.25, + 328.75 + ], + "area_px": 269.5 + }, + { + "image_points_px": [ + [ + 1072.0, + 668.0 + ], + [ + 1101.0, + 682.0 + ], + [ + 1104.0, + 686.0 + ], + [ + 1094.0, + 687.0 + ] + ], + "center_px": [ + 1092.75, + 680.75 + ], + "area_px": 143.0 + }, + { + "image_points_px": [ + [ + 172.0, + 329.0 + ], + [ + 174.0, + 340.0 + ], + [ + 147.0, + 343.0 + ], + [ + 145.0, + 333.0 + ] + ], + "center_px": [ + 159.5, + 336.25 + ], + "area_px": 290.5 + }, + { + "image_points_px": [ + [ + 653.0, + 361.0 + ], + [ + 678.0, + 357.0 + ], + [ + 686.0, + 366.0 + ], + [ + 661.0, + 371.0 + ] + ], + "center_px": [ + 669.5, + 363.75 + ], + "area_px": 273.5 + }, + { + "image_points_px": [ + [ + 754.0, + 306.0 + ], + [ + 778.0, + 303.0 + ], + [ + 788.0, + 312.0 + ], + [ + 763.0, + 315.0 + ] + ], + "center_px": [ + 770.75, + 309.0 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 751.0, + 305.0 + ], + [ + 727.0, + 308.0 + ], + [ + 717.0, + 299.0 + ], + [ + 742.0, + 296.0 + ] + ], + "center_px": [ + 734.25, + 302.0 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 1202.0, + 274.0 + ], + [ + 1223.0, + 272.0 + ], + [ + 1237.0, + 281.0 + ], + [ + 1216.0, + 283.0 + ] + ], + "center_px": [ + 1219.5, + 277.5 + ], + "area_px": 217.0 + }, + { + "image_points_px": [ + [ + 871.0, + 367.0 + ], + [ + 849.0, + 369.0 + ], + [ + 838.0, + 359.0 + ], + [ + 859.0, + 355.0 + ] + ], + "center_px": [ + 854.25, + 362.5 + ], + "area_px": 271.0 + }, + { + "image_points_px": [ + [ + 768.0, + 292.0 + ], + [ + 792.0, + 289.0 + ], + [ + 802.0, + 298.0 + ], + [ + 778.0, + 301.0 + ] + ], + "center_px": [ + 785.0, + 295.0 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 766.0, + 291.0 + ], + [ + 742.0, + 294.0 + ], + [ + 732.0, + 285.0 + ], + [ + 756.0, + 282.0 + ] + ], + "center_px": [ + 749.0, + 288.0 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 1043.0, + 263.0 + ], + [ + 1065.0, + 260.0 + ], + [ + 1078.0, + 268.0 + ], + [ + 1056.0, + 271.0 + ] + ], + "center_px": [ + 1060.5, + 265.5 + ], + "area_px": 215.0 + }, + { + "image_points_px": [ + [ + 816.0, + 284.0 + ], + [ + 793.0, + 287.0 + ], + [ + 782.0, + 278.0 + ], + [ + 805.0, + 275.0 + ] + ], + "center_px": [ + 799.0, + 281.0 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 1123.0, + 261.0 + ], + [ + 1101.0, + 264.0 + ], + [ + 1088.0, + 256.0 + ], + [ + 1109.0, + 253.0 + ] + ], + "center_px": [ + 1105.25, + 258.5 + ], + "area_px": 212.5 + }, + { + "image_points_px": [ + [ + 1133.0, + 249.0 + ], + [ + 1155.0, + 247.0 + ], + [ + 1168.0, + 255.0 + ], + [ + 1146.0, + 257.0 + ] + ], + "center_px": [ + 1150.5, + 252.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 648.0, + 359.0 + ], + [ + 623.0, + 363.0 + ], + [ + 616.0, + 353.0 + ], + [ + 640.0, + 349.0 + ] + ], + "center_px": [ + 631.75, + 356.0 + ], + "area_px": 275.0 + }, + { + "image_points_px": [ + [ + 1214.0, + 249.0 + ], + [ + 1234.0, + 246.0 + ], + [ + 1249.0, + 254.0 + ], + [ + 1228.0, + 257.0 + ] + ], + "center_px": [ + 1231.25, + 251.5 + ], + "area_px": 207.5 + }, + { + "image_points_px": [ + [ + 146.0, + 345.0 + ], + [ + 146.0, + 356.0 + ], + [ + 119.0, + 357.0 + ], + [ + 118.0, + 349.0 + ] + ], + "center_px": [ + 132.25, + 351.75 + ], + "area_px": 262.5 + }, + { + "image_points_px": [ + [ + 169.0, + 316.0 + ], + [ + 141.0, + 320.0 + ], + [ + 139.0, + 311.0 + ], + [ + 166.0, + 307.0 + ] + ], + "center_px": [ + 153.75, + 313.5 + ], + "area_px": 257.5 + }, + { + "image_points_px": [ + [ + 1035.0, + 59.0 + ], + [ + 1062.0, + 58.0 + ], + [ + 1071.0, + 63.0 + ], + [ + 1044.0, + 63.0 + ] + ], + "center_px": [ + 1053.0, + 60.75 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 1140.0, + 237.0 + ], + [ + 1162.0, + 235.0 + ], + [ + 1175.0, + 242.0 + ], + [ + 1155.0, + 245.0 + ] + ], + "center_px": [ + 1158.0, + 239.75 + ], + "area_px": 192.5 + }, + { + "image_points_px": [ + [ + 233.0, + 330.0 + ], + [ + 206.0, + 335.0 + ], + [ + 203.0, + 325.0 + ], + [ + 229.0, + 321.0 + ] + ], + "center_px": [ + 217.75, + 327.75 + ], + "area_px": 267.5 + }, + { + "image_points_px": [ + [ + 1220.0, + 237.0 + ], + [ + 1240.0, + 234.0 + ], + [ + 1255.0, + 242.0 + ], + [ + 1234.0, + 244.0 + ] + ], + "center_px": [ + 1237.25, + 239.25 + ], + "area_px": 190.0 + }, + { + "image_points_px": [ + [ + 715.0, + 298.0 + ], + [ + 691.0, + 301.0 + ], + [ + 682.0, + 292.0 + ], + [ + 706.0, + 289.0 + ] + ], + "center_px": [ + 698.5, + 295.0 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 1189.0, + 219.0 + ], + [ + 1210.0, + 217.0 + ], + [ + 1224.0, + 224.0 + ], + [ + 1202.0, + 226.0 + ] + ], + "center_px": [ + 1206.25, + 221.5 + ], + "area_px": 177.5 + }, + { + "image_points_px": [ + [ + 78.0, + 308.0 + ], + [ + 80.0, + 318.0 + ], + [ + 52.0, + 321.0 + ], + [ + 53.0, + 311.0 + ] + ], + "center_px": [ + 65.75, + 314.5 + ], + "area_px": 266.5 + }, + { + "image_points_px": [ + [ + 1007.0, + 257.0 + ], + [ + 1029.0, + 254.0 + ], + [ + 1041.0, + 262.0 + ], + [ + 1019.0, + 265.0 + ] + ], + "center_px": [ + 1024.0, + 259.5 + ], + "area_px": 212.0 + }, + { + "image_points_px": [ + [ + 48.0, + 301.0 + ], + [ + 48.0, + 311.0 + ], + [ + 21.0, + 313.0 + ], + [ + 21.0, + 304.0 + ] + ], + "center_px": [ + 34.5, + 307.25 + ], + "area_px": 256.5 + }, + { + "image_points_px": [ + [ + 1086.0, + 255.0 + ], + [ + 1065.0, + 258.0 + ], + [ + 1052.0, + 250.0 + ], + [ + 1073.0, + 247.0 + ] + ], + "center_px": [ + 1069.0, + 252.5 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 712.0, + 265.0 + ], + [ + 736.0, + 263.0 + ], + [ + 745.0, + 271.0 + ], + [ + 722.0, + 274.0 + ] + ], + "center_px": [ + 728.75, + 268.25 + ], + "area_px": 223.5 + }, + { + "image_points_px": [ + [ + 135.0, + 301.0 + ], + [ + 137.0, + 310.0 + ], + [ + 110.0, + 313.0 + ], + [ + 108.0, + 304.0 + ] + ], + "center_px": [ + 122.5, + 307.0 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 1016.0, + 244.0 + ], + [ + 1039.0, + 242.0 + ], + [ + 1050.0, + 249.0 + ], + [ + 1028.0, + 252.0 + ] + ], + "center_px": [ + 1033.25, + 246.75 + ], + "area_px": 197.5 + }, + { + "image_points_px": [ + [ + 1131.0, + 249.0 + ], + [ + 1109.0, + 251.0 + ], + [ + 1097.0, + 243.0 + ], + [ + 1117.0, + 241.0 + ] + ], + "center_px": [ + 1113.5, + 246.0 + ], + "area_px": 194.0 + }, + { + "image_points_px": [ + [ + 1095.0, + 243.0 + ], + [ + 1073.0, + 245.0 + ], + [ + 1061.0, + 237.0 + ], + [ + 1081.0, + 235.0 + ] + ], + "center_px": [ + 1077.5, + 240.0 + ], + "area_px": 194.0 + }, + { + "image_points_px": [ + [ + 1211.0, + 248.0 + ], + [ + 1192.0, + 251.0 + ], + [ + 1177.0, + 243.0 + ], + [ + 1197.0, + 240.0 + ] + ], + "center_px": [ + 1194.25, + 245.5 + ], + "area_px": 199.5 + }, + { + "image_points_px": [ + [ + 761.0, + 258.0 + ], + [ + 784.0, + 256.0 + ], + [ + 794.0, + 264.0 + ], + [ + 771.0, + 267.0 + ] + ], + "center_px": [ + 777.5, + 261.25 + ], + "area_px": 220.5 + }, + { + "image_points_px": [ + [ + 747.0, + 272.0 + ], + [ + 771.0, + 269.0 + ], + [ + 780.0, + 277.0 + ], + [ + 756.0, + 280.0 + ] + ], + "center_px": [ + 763.5, + 274.5 + ], + "area_px": 219.0 + }, + { + "image_points_px": [ + [ + 1226.0, + 224.0 + ], + [ + 1246.0, + 222.0 + ], + [ + 1260.0, + 230.0 + ], + [ + 1240.0, + 232.0 + ] + ], + "center_px": [ + 1243.0, + 227.0 + ], + "area_px": 188.0 + }, + { + "image_points_px": [ + [ + 290.0, + 322.0 + ], + [ + 264.0, + 327.0 + ], + [ + 260.0, + 317.0 + ], + [ + 286.0, + 314.0 + ] + ], + "center_px": [ + 275.0, + 320.0 + ], + "area_px": 250.0 + }, + { + "image_points_px": [ + [ + 1147.0, + 225.0 + ], + [ + 1169.0, + 223.0 + ], + [ + 1181.0, + 230.0 + ], + [ + 1161.0, + 233.0 + ] + ], + "center_px": [ + 1164.5, + 227.75 + ], + "area_px": 190.0 + }, + { + "image_points_px": [ + [ + 313.0, + 308.0 + ], + [ + 287.0, + 312.0 + ], + [ + 283.0, + 303.0 + ], + [ + 309.0, + 299.0 + ] + ], + "center_px": [ + 298.0, + 305.5 + ], + "area_px": 250.0 + }, + { + "image_points_px": [ + [ + 1218.0, + 236.0 + ], + [ + 1196.0, + 238.0 + ], + [ + 1184.0, + 231.0 + ], + [ + 1203.0, + 228.0 + ] + ], + "center_px": [ + 1200.25, + 233.25 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 696.0, + 278.0 + ], + [ + 672.0, + 281.0 + ], + [ + 664.0, + 272.0 + ], + [ + 687.0, + 269.0 + ] + ], + "center_px": [ + 679.75, + 275.0 + ], + "area_px": 237.0 + }, + { + "image_points_px": [ + [ + 1190.0, + 303.0 + ], + [ + 1209.0, + 299.0 + ], + [ + 1223.0, + 308.0 + ], + [ + 1204.0, + 312.0 + ] + ], + "center_px": [ + 1206.5, + 305.5 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 730.0, + 284.0 + ], + [ + 706.0, + 287.0 + ], + [ + 698.0, + 278.0 + ], + [ + 722.0, + 276.0 + ] + ], + "center_px": [ + 714.0, + 281.25 + ], + "area_px": 224.0 + }, + { + "image_points_px": [ + [ + 1231.0, + 213.0 + ], + [ + 1251.0, + 211.0 + ], + [ + 1265.0, + 218.0 + ], + [ + 1244.0, + 220.0 + ] + ], + "center_px": [ + 1247.75, + 215.5 + ], + "area_px": 170.5 + }, + { + "image_points_px": [ + [ + 75.0, + 288.0 + ], + [ + 76.0, + 296.0 + ], + [ + 49.0, + 299.0 + ], + [ + 48.0, + 290.0 + ] + ], + "center_px": [ + 62.0, + 293.25 + ], + "area_px": 232.0 + }, + { + "image_points_px": [ + [ + 1105.0, + 231.0 + ], + [ + 1126.0, + 229.0 + ], + [ + 1138.0, + 237.0 + ], + [ + 1117.0, + 239.0 + ] + ], + "center_px": [ + 1121.5, + 234.0 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 161.0, + 288.0 + ], + [ + 163.0, + 295.0 + ], + [ + 136.0, + 299.0 + ], + [ + 134.0, + 290.0 + ] + ], + "center_px": [ + 148.5, + 293.0 + ], + "area_px": 222.0 + }, + { + "image_points_px": [ + [ + 185.0, + 273.0 + ], + [ + 187.0, + 282.0 + ], + [ + 161.0, + 285.0 + ], + [ + 159.0, + 276.0 + ] + ], + "center_px": [ + 173.0, + 279.0 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 1059.0, + 237.0 + ], + [ + 1037.0, + 239.0 + ], + [ + 1026.0, + 232.0 + ], + [ + 1046.0, + 229.0 + ] + ], + "center_px": [ + 1042.0, + 234.25 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 727.0, + 252.0 + ], + [ + 750.0, + 250.0 + ], + [ + 759.0, + 258.0 + ], + [ + 735.0, + 260.0 + ] + ], + "center_px": [ + 742.75, + 255.0 + ], + "area_px": 205.0 + }, + { + "image_points_px": [ + [ + 1034.0, + 220.0 + ], + [ + 1055.0, + 218.0 + ], + [ + 1067.0, + 225.0 + ], + [ + 1045.0, + 227.0 + ] + ], + "center_px": [ + 1050.25, + 222.5 + ], + "area_px": 173.5 + }, + { + "image_points_px": [ + [ + 1077.0, + 214.0 + ], + [ + 1098.0, + 212.0 + ], + [ + 1110.0, + 219.0 + ], + [ + 1088.0, + 221.0 + ] + ], + "center_px": [ + 1093.25, + 216.5 + ], + "area_px": 173.5 + }, + { + "image_points_px": [ + [ + 319.0, + 331.0 + ], + [ + 297.0, + 334.0 + ], + [ + 292.0, + 324.0 + ], + [ + 317.0, + 320.0 + ] + ], + "center_px": [ + 306.25, + 327.25 + ], + "area_px": 259.0 + }, + { + "image_points_px": [ + [ + 1151.0, + 296.0 + ], + [ + 1171.0, + 293.0 + ], + [ + 1183.0, + 301.0 + ], + [ + 1164.0, + 305.0 + ] + ], + "center_px": [ + 1167.25, + 298.75 + ], + "area_px": 209.5 + }, + { + "image_points_px": [ + [ + 1112.0, + 220.0 + ], + [ + 1133.0, + 218.0 + ], + [ + 1145.0, + 225.0 + ], + [ + 1126.0, + 227.0 + ] + ], + "center_px": [ + 1129.0, + 222.5 + ], + "area_px": 166.0 + }, + { + "image_points_px": [ + [ + 1119.0, + 208.0 + ], + [ + 1139.0, + 206.0 + ], + [ + 1152.0, + 213.0 + ], + [ + 1132.0, + 215.0 + ] + ], + "center_px": [ + 1135.5, + 210.5 + ], + "area_px": 166.0 + }, + { + "image_points_px": [ + [ + 1229.0, + 294.0 + ], + [ + 1210.0, + 297.0 + ], + [ + 1197.0, + 289.0 + ], + [ + 1216.0, + 285.0 + ] + ], + "center_px": [ + 1213.0, + 291.25 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 710.0, + 265.0 + ], + [ + 687.0, + 267.0 + ], + [ + 679.0, + 259.0 + ], + [ + 702.0, + 256.0 + ] + ], + "center_px": [ + 694.5, + 261.75 + ], + "area_px": 215.5 + }, + { + "image_points_px": [ + [ + 1237.0, + 202.0 + ], + [ + 1257.0, + 200.0 + ], + [ + 1270.0, + 207.0 + ], + [ + 1251.0, + 209.0 + ] + ], + "center_px": [ + 1253.75, + 204.5 + ], + "area_px": 163.5 + }, + { + "image_points_px": [ + [ + 1196.0, + 208.0 + ], + [ + 1216.0, + 206.0 + ], + [ + 1229.0, + 213.0 + ], + [ + 1210.0, + 215.0 + ] + ], + "center_px": [ + 1212.75, + 210.5 + ], + "area_px": 163.5 + }, + { + "image_points_px": [ + [ + 1242.0, + 191.0 + ], + [ + 1261.0, + 189.0 + ], + [ + 1275.0, + 196.0 + ], + [ + 1256.0, + 198.0 + ] + ], + "center_px": [ + 1258.5, + 193.5 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 272.0, + 281.0 + ], + [ + 247.0, + 284.0 + ], + [ + 243.0, + 276.0 + ], + [ + 268.0, + 272.0 + ] + ], + "center_px": [ + 257.5, + 278.25 + ], + "area_px": 226.5 + }, + { + "image_points_px": [ + [ + 991.0, + 226.0 + ], + [ + 1012.0, + 224.0 + ], + [ + 1023.0, + 231.0 + ], + [ + 1002.0, + 234.0 + ] + ], + "center_px": [ + 1007.0, + 228.75 + ], + "area_px": 185.0 + }, + { + "image_points_px": [ + [ + 155.0, + 267.0 + ], + [ + 157.0, + 275.0 + ], + [ + 131.0, + 278.0 + ], + [ + 129.0, + 270.0 + ] + ], + "center_px": [ + 143.0, + 272.5 + ], + "area_px": 214.0 + }, + { + "image_points_px": [ + [ + 1102.0, + 231.0 + ], + [ + 1081.0, + 233.0 + ], + [ + 1070.0, + 226.0 + ], + [ + 1090.0, + 223.0 + ] + ], + "center_px": [ + 1085.75, + 228.25 + ], + "area_px": 182.5 + }, + { + "image_points_px": [ + [ + 1207.0, + 186.0 + ], + [ + 1226.0, + 184.0 + ], + [ + 1240.0, + 190.0 + ], + [ + 1220.0, + 192.0 + ] + ], + "center_px": [ + 1223.25, + 188.0 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 1032.0, + 220.0 + ], + [ + 1012.0, + 222.0 + ], + [ + 1000.0, + 215.0 + ], + [ + 1020.0, + 212.0 + ] + ], + "center_px": [ + 1016.0, + 217.25 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 1187.0, + 219.0 + ], + [ + 1166.0, + 220.0 + ], + [ + 1155.0, + 213.0 + ], + [ + 1174.0, + 211.0 + ] + ], + "center_px": [ + 1170.5, + 215.75 + ], + "area_px": 168.0 + }, + { + "image_points_px": [ + [ + 257.0, + 314.0 + ], + [ + 231.0, + 319.0 + ], + [ + 228.0, + 311.0 + ], + [ + 253.0, + 307.0 + ] + ], + "center_px": [ + 242.25, + 312.75 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 1085.0, + 203.0 + ], + [ + 1106.0, + 201.0 + ], + [ + 1117.0, + 208.0 + ], + [ + 1097.0, + 210.0 + ] + ], + "center_px": [ + 1101.25, + 205.5 + ], + "area_px": 166.5 + }, + { + "image_points_px": [ + [ + 1043.0, + 209.0 + ], + [ + 1064.0, + 207.0 + ], + [ + 1075.0, + 214.0 + ], + [ + 1055.0, + 216.0 + ] + ], + "center_px": [ + 1059.25, + 211.5 + ], + "area_px": 166.5 + }, + { + "image_points_px": [ + [ + 741.0, + 240.0 + ], + [ + 764.0, + 238.0 + ], + [ + 772.0, + 245.0 + ], + [ + 750.0, + 248.0 + ] + ], + "center_px": [ + 756.75, + 242.75 + ], + "area_px": 190.0 + }, + { + "image_points_px": [ + [ + 708.0, + 234.0 + ], + [ + 731.0, + 232.0 + ], + [ + 739.0, + 239.0 + ], + [ + 717.0, + 242.0 + ] + ], + "center_px": [ + 723.75, + 236.75 + ], + "area_px": 190.0 + }, + { + "image_points_px": [ + [ + 1127.0, + 197.0 + ], + [ + 1146.0, + 195.0 + ], + [ + 1159.0, + 202.0 + ], + [ + 1139.0, + 204.0 + ] + ], + "center_px": [ + 1142.75, + 199.5 + ], + "area_px": 161.5 + }, + { + "image_points_px": [ + [ + 937.0, + 157.0 + ], + [ + 959.0, + 156.0 + ], + [ + 969.0, + 162.0 + ], + [ + 950.0, + 164.0 + ] + ], + "center_px": [ + 953.75, + 159.75 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 1159.0, + 282.0 + ], + [ + 1178.0, + 279.0 + ], + [ + 1190.0, + 287.0 + ], + [ + 1170.0, + 290.0 + ] + ], + "center_px": [ + 1174.25, + 284.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 234.0, + 255.0 + ], + [ + 209.0, + 258.0 + ], + [ + 206.0, + 250.0 + ], + [ + 231.0, + 247.0 + ] + ], + "center_px": [ + 220.0, + 252.5 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 1202.0, + 197.0 + ], + [ + 1222.0, + 195.0 + ], + [ + 1234.0, + 202.0 + ], + [ + 1214.0, + 203.0 + ] + ], + "center_px": [ + 1218.0, + 199.25 + ], + "area_px": 148.0 + }, + { + "image_points_px": [ + [ + 1168.0, + 191.0 + ], + [ + 1188.0, + 190.0 + ], + [ + 1200.0, + 196.0 + ], + [ + 1180.0, + 198.0 + ] + ], + "center_px": [ + 1184.0, + 193.75 + ], + "area_px": 148.0 + }, + { + "image_points_px": [ + [ + 43.0, + 262.0 + ], + [ + 43.0, + 269.0 + ], + [ + 17.0, + 272.0 + ], + [ + 17.0, + 264.0 + ] + ], + "center_px": [ + 30.0, + 266.75 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 755.0, + 228.0 + ], + [ + 777.0, + 226.0 + ], + [ + 786.0, + 233.0 + ], + [ + 763.0, + 235.0 + ] + ], + "center_px": [ + 770.25, + 230.5 + ], + "area_px": 174.5 + }, + { + "image_points_px": [ + [ + 280.0, + 301.0 + ], + [ + 256.0, + 305.0 + ], + [ + 252.0, + 297.0 + ], + [ + 277.0, + 293.0 + ] + ], + "center_px": [ + 266.25, + 299.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 193.0, + 301.0 + ], + [ + 168.0, + 305.0 + ], + [ + 165.0, + 298.0 + ], + [ + 190.0, + 293.0 + ] + ], + "center_px": [ + 179.0, + 299.25 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 132.0, + 287.0 + ], + [ + 107.0, + 292.0 + ], + [ + 104.0, + 284.0 + ], + [ + 129.0, + 280.0 + ] + ], + "center_px": [ + 118.0, + 285.75 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 264.0, + 261.0 + ], + [ + 239.0, + 264.0 + ], + [ + 236.0, + 256.0 + ], + [ + 260.0, + 253.0 + ] + ], + "center_px": [ + 249.75, + 258.5 + ], + "area_px": 206.5 + }, + { + "image_points_px": [ + [ + 179.0, + 254.0 + ], + [ + 181.0, + 262.0 + ], + [ + 156.0, + 265.0 + ], + [ + 154.0, + 257.0 + ] + ], + "center_px": [ + 167.5, + 259.5 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 805.0, + 251.0 + ], + [ + 784.0, + 254.0 + ], + [ + 775.0, + 246.0 + ], + [ + 797.0, + 243.0 + ] + ], + "center_px": [ + 790.25, + 248.5 + ], + "area_px": 197.5 + }, + { + "image_points_px": [ + [ + 211.0, + 267.0 + ], + [ + 186.0, + 271.0 + ], + [ + 183.0, + 263.0 + ], + [ + 208.0, + 260.0 + ] + ], + "center_px": [ + 197.0, + 265.25 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 976.0, + 198.0 + ], + [ + 996.0, + 196.0 + ], + [ + 1007.0, + 203.0 + ], + [ + 986.0, + 205.0 + ] + ], + "center_px": [ + 991.25, + 200.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 40.0, + 243.0 + ], + [ + 41.0, + 250.0 + ], + [ + 15.0, + 253.0 + ], + [ + 15.0, + 245.0 + ] + ], + "center_px": [ + 27.75, + 247.75 + ], + "area_px": 192.5 + }, + { + "image_points_px": [ + [ + 1010.0, + 203.0 + ], + [ + 1029.0, + 201.0 + ], + [ + 1041.0, + 208.0 + ], + [ + 1020.0, + 210.0 + ] + ], + "center_px": [ + 1025.0, + 205.5 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 126.0, + 262.0 + ], + [ + 127.0, + 269.0 + ], + [ + 101.0, + 271.0 + ], + [ + 101.0, + 263.0 + ] + ], + "center_px": [ + 113.75, + 266.25 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 1090.0, + 192.0 + ], + [ + 1071.0, + 194.0 + ], + [ + 1059.0, + 187.0 + ], + [ + 1079.0, + 185.0 + ] + ], + "center_px": [ + 1074.75, + 189.5 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 1162.0, + 202.0 + ], + [ + 1181.0, + 200.0 + ], + [ + 1193.0, + 207.0 + ], + [ + 1173.0, + 209.0 + ] + ], + "center_px": [ + 1177.25, + 204.5 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 1093.0, + 192.0 + ], + [ + 1113.0, + 190.0 + ], + [ + 1124.0, + 197.0 + ], + [ + 1105.0, + 199.0 + ] + ], + "center_px": [ + 1108.75, + 194.5 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 753.0, + 227.0 + ], + [ + 731.0, + 230.0 + ], + [ + 723.0, + 222.0 + ], + [ + 744.0, + 220.0 + ] + ], + "center_px": [ + 737.75, + 224.75 + ], + "area_px": 182.5 + }, + { + "image_points_px": [ + [ + 1074.0, + 283.0 + ], + [ + 1094.0, + 280.0 + ], + [ + 1104.0, + 288.0 + ], + [ + 1085.0, + 291.0 + ] + ], + "center_px": [ + 1089.25, + 285.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 1134.0, + 186.0 + ], + [ + 1155.0, + 185.0 + ], + [ + 1165.0, + 191.0 + ], + [ + 1145.0, + 193.0 + ] + ], + "center_px": [ + 1149.75, + 188.75 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 985.0, + 187.0 + ], + [ + 1006.0, + 186.0 + ], + [ + 1016.0, + 192.0 + ], + [ + 996.0, + 194.0 + ] + ], + "center_px": [ + 1000.75, + 189.75 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 1057.0, + 187.0 + ], + [ + 1037.0, + 188.0 + ], + [ + 1026.0, + 182.0 + ], + [ + 1046.0, + 180.0 + ] + ], + "center_px": [ + 1041.5, + 184.25 + ], + "area_px": 146.5 + }, + { + "image_points_px": [ + [ + 1037.0, + 277.0 + ], + [ + 1056.0, + 273.0 + ], + [ + 1067.0, + 281.0 + ], + [ + 1046.0, + 284.0 + ] + ], + "center_px": [ + 1051.5, + 278.75 + ], + "area_px": 185.0 + }, + { + "image_points_px": [ + [ + 204.0, + 249.0 + ], + [ + 180.0, + 252.0 + ], + [ + 177.0, + 244.0 + ], + [ + 201.0, + 241.0 + ] + ], + "center_px": [ + 190.5, + 246.5 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 1171.0, + 181.0 + ], + [ + 1152.0, + 182.0 + ], + [ + 1140.0, + 176.0 + ], + [ + 1159.0, + 174.0 + ] + ], + "center_px": [ + 1155.5, + 178.25 + ], + "area_px": 141.5 + }, + { + "image_points_px": [ + [ + 65.0, + 231.0 + ], + [ + 66.0, + 238.0 + ], + [ + 41.0, + 241.0 + ], + [ + 40.0, + 233.0 + ] + ], + "center_px": [ + 53.0, + 235.75 + ], + "area_px": 190.0 + }, + { + "image_points_px": [ + [ + 1052.0, + 198.0 + ], + [ + 1072.0, + 196.0 + ], + [ + 1083.0, + 202.0 + ], + [ + 1062.0, + 204.0 + ] + ], + "center_px": [ + 1067.25, + 200.0 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 1018.0, + 193.0 + ], + [ + 1039.0, + 191.0 + ], + [ + 1049.0, + 197.0 + ], + [ + 1029.0, + 199.0 + ] + ], + "center_px": [ + 1033.75, + 195.0 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 1214.0, + 175.0 + ], + [ + 1232.0, + 174.0 + ], + [ + 1245.0, + 180.0 + ], + [ + 1226.0, + 182.0 + ] + ], + "center_px": [ + 1229.25, + 177.75 + ], + "area_px": 139.0 + }, + { + "image_points_px": [ + [ + 1113.0, + 274.0 + ], + [ + 1093.0, + 277.0 + ], + [ + 1083.0, + 270.0 + ], + [ + 1101.0, + 266.0 + ] + ], + "center_px": [ + 1097.5, + 271.75 + ], + "area_px": 181.0 + }, + { + "image_points_px": [ + [ + 45.0, + 282.0 + ], + [ + 45.0, + 289.0 + ], + [ + 19.0, + 291.0 + ], + [ + 20.0, + 284.0 + ] + ], + "center_px": [ + 32.25, + 286.5 + ], + "area_px": 177.5 + }, + { + "image_points_px": [ + [ + 68.0, + 249.0 + ], + [ + 69.0, + 256.0 + ], + [ + 43.0, + 258.0 + ], + [ + 43.0, + 251.0 + ] + ], + "center_px": [ + 55.75, + 253.5 + ], + "area_px": 179.5 + }, + { + "image_points_px": [ + [ + 736.0, + 211.0 + ], + [ + 757.0, + 209.0 + ], + [ + 766.0, + 216.0 + ], + [ + 744.0, + 218.0 + ] + ], + "center_px": [ + 750.75, + 213.5 + ], + "area_px": 167.5 + }, + { + "image_points_px": [ + [ + 1100.0, + 182.0 + ], + [ + 1120.0, + 180.0 + ], + [ + 1131.0, + 186.0 + ], + [ + 1112.0, + 188.0 + ] + ], + "center_px": [ + 1115.75, + 184.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 1174.0, + 181.0 + ], + [ + 1193.0, + 179.0 + ], + [ + 1205.0, + 185.0 + ], + [ + 1185.0, + 187.0 + ] + ], + "center_px": [ + 1189.25, + 183.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 1067.0, + 177.0 + ], + [ + 1087.0, + 175.0 + ], + [ + 1098.0, + 181.0 + ], + [ + 1079.0, + 183.0 + ] + ], + "center_px": [ + 1082.75, + 179.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 286.0, + 248.0 + ], + [ + 261.0, + 251.0 + ], + [ + 258.0, + 244.0 + ], + [ + 282.0, + 241.0 + ] + ], + "center_px": [ + 271.75, + 246.0 + ], + "area_px": 182.0 + }, + { + "image_points_px": [ + [ + 1180.0, + 171.0 + ], + [ + 1199.0, + 169.0 + ], + [ + 1211.0, + 175.0 + ], + [ + 1192.0, + 177.0 + ] + ], + "center_px": [ + 1195.5, + 173.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 831.0, + 306.0 + ], + [ + 816.0, + 308.0 + ], + [ + 804.0, + 298.0 + ], + [ + 826.0, + 295.0 + ] + ], + "center_px": [ + 819.25, + 301.75 + ], + "area_px": 215.5 + }, + { + "image_points_px": [ + [ + 175.0, + 242.0 + ], + [ + 150.0, + 246.0 + ], + [ + 148.0, + 238.0 + ], + [ + 173.0, + 236.0 + ] + ], + "center_px": [ + 161.5, + 240.5 + ], + "area_px": 181.0 + }, + { + "image_points_px": [ + [ + 1219.0, + 166.0 + ], + [ + 1238.0, + 164.0 + ], + [ + 1250.0, + 170.0 + ], + [ + 1232.0, + 172.0 + ] + ], + "center_px": [ + 1234.75, + 168.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 1186.0, + 161.0 + ], + [ + 1204.0, + 159.0 + ], + [ + 1217.0, + 165.0 + ], + [ + 1198.0, + 167.0 + ] + ], + "center_px": [ + 1201.25, + 163.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 303.0, + 286.0 + ], + [ + 279.0, + 290.0 + ], + [ + 275.0, + 283.0 + ], + [ + 299.0, + 279.0 + ] + ], + "center_px": [ + 289.0, + 284.5 + ], + "area_px": 184.0 + }, + { + "image_points_px": [ + [ + 116.0, + 224.0 + ], + [ + 118.0, + 232.0 + ], + [ + 93.0, + 234.0 + ], + [ + 92.0, + 227.0 + ] + ], + "center_px": [ + 104.75, + 229.25 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 256.0, + 243.0 + ], + [ + 232.0, + 245.0 + ], + [ + 229.0, + 238.0 + ], + [ + 253.0, + 235.0 + ] + ], + "center_px": [ + 242.5, + 240.25 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 38.0, + 225.0 + ], + [ + 38.0, + 232.0 + ], + [ + 13.0, + 235.0 + ], + [ + 14.0, + 227.0 + ] + ], + "center_px": [ + 25.75, + 229.75 + ], + "area_px": 182.5 + }, + { + "image_points_px": [ + [ + 198.0, + 231.0 + ], + [ + 174.0, + 234.0 + ], + [ + 171.0, + 227.0 + ], + [ + 196.0, + 224.0 + ] + ], + "center_px": [ + 184.75, + 229.0 + ], + "area_px": 179.0 + }, + { + "image_points_px": [ + [ + 307.0, + 236.0 + ], + [ + 283.0, + 239.0 + ], + [ + 280.0, + 231.0 + ], + [ + 303.0, + 229.0 + ] + ], + "center_px": [ + 293.25, + 233.75 + ], + "area_px": 185.0 + }, + { + "image_points_px": [ + [ + 1024.0, + 182.0 + ], + [ + 1004.0, + 183.0 + ], + [ + 994.0, + 177.0 + ], + [ + 1013.0, + 175.0 + ] + ], + "center_px": [ + 1008.75, + 179.25 + ], + "area_px": 142.5 + }, + { + "image_points_px": [ + [ + 1121.0, + 276.0 + ], + [ + 1140.0, + 273.0 + ], + [ + 1150.0, + 280.0 + ], + [ + 1132.0, + 284.0 + ] + ], + "center_px": [ + 1135.75, + 278.25 + ], + "area_px": 175.5 + }, + { + "image_points_px": [ + [ + 734.0, + 210.0 + ], + [ + 713.0, + 213.0 + ], + [ + 705.0, + 206.0 + ], + [ + 725.0, + 203.0 + ] + ], + "center_px": [ + 719.25, + 208.0 + ], + "area_px": 169.0 + }, + { + "image_points_px": [ + [ + 1035.0, + 172.0 + ], + [ + 1054.0, + 170.0 + ], + [ + 1065.0, + 176.0 + ], + [ + 1045.0, + 178.0 + ] + ], + "center_px": [ + 1049.75, + 174.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 1003.0, + 167.0 + ], + [ + 1022.0, + 165.0 + ], + [ + 1033.0, + 171.0 + ], + [ + 1013.0, + 173.0 + ] + ], + "center_px": [ + 1017.75, + 169.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 1043.0, + 162.0 + ], + [ + 1062.0, + 160.0 + ], + [ + 1073.0, + 166.0 + ], + [ + 1053.0, + 168.0 + ] + ], + "center_px": [ + 1057.75, + 164.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 1041.0, + 161.0 + ], + [ + 1021.0, + 163.0 + ], + [ + 1011.0, + 157.0 + ], + [ + 1030.0, + 155.0 + ] + ], + "center_px": [ + 1025.75, + 159.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 241.0, + 273.0 + ], + [ + 217.0, + 277.0 + ], + [ + 214.0, + 270.0 + ], + [ + 237.0, + 266.0 + ] + ], + "center_px": [ + 227.25, + 271.5 + ], + "area_px": 178.5 + }, + { + "image_points_px": [ + [ + 327.0, + 225.0 + ], + [ + 304.0, + 227.0 + ], + [ + 300.0, + 220.0 + ], + [ + 323.0, + 217.0 + ] + ], + "center_px": [ + 313.5, + 222.25 + ], + "area_px": 182.5 + }, + { + "image_points_px": [ + [ + 425.0, + 212.0 + ], + [ + 402.0, + 215.0 + ], + [ + 397.0, + 208.0 + ], + [ + 419.0, + 205.0 + ] + ], + "center_px": [ + 410.75, + 210.0 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 1147.0, + 166.0 + ], + [ + 1165.0, + 164.0 + ], + [ + 1177.0, + 170.0 + ], + [ + 1158.0, + 172.0 + ] + ], + "center_px": [ + 1161.75, + 168.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 1082.0, + 157.0 + ], + [ + 1101.0, + 155.0 + ], + [ + 1112.0, + 161.0 + ], + [ + 1094.0, + 163.0 + ] + ], + "center_px": [ + 1097.25, + 159.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 277.0, + 231.0 + ], + [ + 253.0, + 233.0 + ], + [ + 251.0, + 226.0 + ], + [ + 274.0, + 223.0 + ] + ], + "center_px": [ + 263.75, + 228.25 + ], + "area_px": 182.5 + }, + { + "image_points_px": [ + [ + 1153.0, + 156.0 + ], + [ + 1172.0, + 155.0 + ], + [ + 1183.0, + 161.0 + ], + [ + 1165.0, + 162.0 + ] + ], + "center_px": [ + 1168.25, + 158.5 + ], + "area_px": 122.5 + }, + { + "image_points_px": [ + [ + 502.0, + 212.0 + ], + [ + 480.0, + 214.0 + ], + [ + 474.0, + 207.0 + ], + [ + 497.0, + 205.0 + ] + ], + "center_px": [ + 488.25, + 209.5 + ], + "area_px": 168.5 + }, + { + "image_points_px": [ + [ + 749.0, + 200.0 + ], + [ + 771.0, + 198.0 + ], + [ + 778.0, + 204.0 + ], + [ + 758.0, + 207.0 + ] + ], + "center_px": [ + 764.0, + 202.25 + ], + "area_px": 156.5 + }, + { + "image_points_px": [ + [ + 1089.0, + 147.0 + ], + [ + 1109.0, + 146.0 + ], + [ + 1119.0, + 151.0 + ], + [ + 1100.0, + 153.0 + ] + ], + "center_px": [ + 1104.25, + 149.25 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 1121.0, + 152.0 + ], + [ + 1139.0, + 150.0 + ], + [ + 1151.0, + 156.0 + ], + [ + 1131.0, + 157.0 + ] + ], + "center_px": [ + 1135.5, + 153.75 + ], + "area_px": 121.0 + }, + { + "image_points_px": [ + [ + 35.0, + 208.0 + ], + [ + 36.0, + 215.0 + ], + [ + 12.0, + 218.0 + ], + [ + 11.0, + 211.0 + ] + ], + "center_px": [ + 23.5, + 213.0 + ], + "area_px": 171.0 + }, + { + "image_points_px": [ + [ + 376.0, + 218.0 + ], + [ + 353.0, + 221.0 + ], + [ + 349.0, + 214.0 + ], + [ + 372.0, + 211.0 + ] + ], + "center_px": [ + 362.5, + 216.0 + ], + "area_px": 173.0 + }, + { + "image_points_px": [ + [ + 267.0, + 263.0 + ], + [ + 290.0, + 260.0 + ], + [ + 294.0, + 266.0 + ], + [ + 270.0, + 270.0 + ] + ], + "center_px": [ + 280.25, + 264.75 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 220.0, + 219.0 + ], + [ + 196.0, + 222.0 + ], + [ + 194.0, + 215.0 + ], + [ + 217.0, + 212.0 + ] + ], + "center_px": [ + 206.75, + 217.0 + ], + "area_px": 172.0 + }, + { + "image_points_px": [ + [ + 1096.0, + 138.0 + ], + [ + 1115.0, + 137.0 + ], + [ + 1126.0, + 142.0 + ], + [ + 1107.0, + 143.0 + ] + ], + "center_px": [ + 1111.0, + 140.0 + ], + "area_px": 106.0 + }, + { + "image_points_px": [ + [ + 1219.0, + 638.0 + ], + [ + 1232.0, + 635.0 + ], + [ + 1245.0, + 647.0 + ], + [ + 1232.0, + 650.0 + ] + ], + "center_px": [ + 1232.0, + 642.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 1000.0, + 167.0 + ], + [ + 981.0, + 168.0 + ], + [ + 971.0, + 162.0 + ], + [ + 990.0, + 160.0 + ] + ], + "center_px": [ + 985.5, + 164.25 + ], + "area_px": 138.5 + }, + { + "image_points_px": [ + [ + 1025.0, + 599.0 + ], + [ + 1010.0, + 601.0 + ], + [ + 1000.0, + 591.0 + ], + [ + 1018.0, + 587.0 + ] + ], + "center_px": [ + 1013.25, + 594.5 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 145.0, + 231.0 + ], + [ + 145.0, + 238.0 + ], + [ + 122.0, + 240.0 + ], + [ + 120.0, + 234.0 + ] + ], + "center_px": [ + 133.0, + 235.75 + ], + "area_px": 158.5 + }, + { + "image_points_px": [ + [ + 395.0, + 207.0 + ], + [ + 372.0, + 209.0 + ], + [ + 368.0, + 203.0 + ], + [ + 391.0, + 200.0 + ] + ], + "center_px": [ + 381.5, + 204.75 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 59.0, + 197.0 + ], + [ + 60.0, + 204.0 + ], + [ + 36.0, + 206.0 + ], + [ + 35.0, + 200.0 + ] + ], + "center_px": [ + 47.5, + 201.75 + ], + "area_px": 158.5 + }, + { + "image_points_px": [ + [ + 298.0, + 219.0 + ], + [ + 275.0, + 221.0 + ], + [ + 272.0, + 214.0 + ], + [ + 295.0, + 212.0 + ] + ], + "center_px": [ + 285.0, + 216.5 + ], + "area_px": 167.0 + }, + { + "image_points_px": [ + [ + 489.0, + 196.0 + ], + [ + 467.0, + 198.0 + ], + [ + 462.0, + 191.0 + ], + [ + 484.0, + 189.0 + ] + ], + "center_px": [ + 475.5, + 193.5 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 1115.0, + 161.0 + ], + [ + 1134.0, + 160.0 + ], + [ + 1144.0, + 166.0 + ], + [ + 1125.0, + 167.0 + ] + ], + "center_px": [ + 1129.5, + 163.5 + ], + "area_px": 124.0 + }, + { + "image_points_px": [ + [ + 414.0, + 196.0 + ], + [ + 391.0, + 198.0 + ], + [ + 387.0, + 192.0 + ], + [ + 409.0, + 189.0 + ] + ], + "center_px": [ + 400.25, + 193.75 + ], + "area_px": 157.5 + }, + { + "image_points_px": [ + [ + 980.0, + 153.0 + ], + [ + 999.0, + 151.0 + ], + [ + 1009.0, + 157.0 + ], + [ + 989.0, + 158.0 + ] + ], + "center_px": [ + 994.25, + 154.75 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 949.0, + 148.0 + ], + [ + 969.0, + 147.0 + ], + [ + 978.0, + 152.0 + ], + [ + 959.0, + 154.0 + ] + ], + "center_px": [ + 963.75, + 150.25 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 241.0, + 208.0 + ], + [ + 219.0, + 211.0 + ], + [ + 215.0, + 204.0 + ], + [ + 238.0, + 201.0 + ] + ], + "center_px": [ + 228.25, + 206.0 + ], + "area_px": 168.0 + }, + { + "image_points_px": [ + [ + 988.0, + 143.0 + ], + [ + 1008.0, + 142.0 + ], + [ + 1017.0, + 147.0 + ], + [ + 999.0, + 149.0 + ] + ], + "center_px": [ + 1003.0, + 145.25 + ], + "area_px": 119.5 + }, + { + "image_points_px": [ + [ + 1058.0, + 143.0 + ], + [ + 1076.0, + 141.0 + ], + [ + 1087.0, + 147.0 + ], + [ + 1067.0, + 148.0 + ] + ], + "center_px": [ + 1072.0, + 144.75 + ], + "area_px": 119.5 + }, + { + "image_points_px": [ + [ + 108.0, + 191.0 + ], + [ + 110.0, + 198.0 + ], + [ + 87.0, + 201.0 + ], + [ + 85.0, + 194.0 + ] + ], + "center_px": [ + 97.5, + 196.0 + ], + "area_px": 167.0 + }, + { + "image_points_px": [ + [ + 1035.0, + 129.0 + ], + [ + 1053.0, + 128.0 + ], + [ + 1064.0, + 133.0 + ], + [ + 1045.0, + 135.0 + ] + ], + "center_px": [ + 1049.25, + 131.25 + ], + "area_px": 117.5 + }, + { + "image_points_px": [ + [ + 347.0, + 213.0 + ], + [ + 324.0, + 215.0 + ], + [ + 321.0, + 208.0 + ], + [ + 343.0, + 206.0 + ] + ], + "center_px": [ + 333.75, + 210.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 338.0, + 197.0 + ], + [ + 315.0, + 199.0 + ], + [ + 312.0, + 192.0 + ], + [ + 334.0, + 190.0 + ] + ], + "center_px": [ + 324.75, + 194.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 1134.0, + 133.0 + ], + [ + 1153.0, + 132.0 + ], + [ + 1163.0, + 137.0 + ], + [ + 1145.0, + 139.0 + ] + ], + "center_px": [ + 1148.75, + 135.25 + ], + "area_px": 117.5 + }, + { + "image_points_px": [ + [ + 1128.0, + 142.0 + ], + [ + 1146.0, + 141.0 + ], + [ + 1157.0, + 146.0 + ], + [ + 1139.0, + 148.0 + ] + ], + "center_px": [ + 1142.5, + 144.25 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 162.0, + 202.0 + ], + [ + 164.0, + 209.0 + ], + [ + 141.0, + 211.0 + ], + [ + 139.0, + 204.0 + ] + ], + "center_px": [ + 151.5, + 206.5 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 213.0, + 203.0 + ], + [ + 190.0, + 205.0 + ], + [ + 188.0, + 198.0 + ], + [ + 211.0, + 196.0 + ] + ], + "center_px": [ + 200.5, + 200.5 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 445.0, + 202.0 + ], + [ + 467.0, + 200.0 + ], + [ + 472.0, + 206.0 + ], + [ + 450.0, + 209.0 + ] + ], + "center_px": [ + 458.5, + 204.25 + ], + "area_px": 155.5 + }, + { + "image_points_px": [ + [ + 1166.0, + 137.0 + ], + [ + 1181.0, + 136.0 + ], + [ + 1195.0, + 141.0 + ], + [ + 1176.0, + 143.0 + ] + ], + "center_px": [ + 1179.5, + 139.25 + ], + "area_px": 111.5 + }, + { + "image_points_px": [ + [ + 318.0, + 207.0 + ], + [ + 295.0, + 210.0 + ], + [ + 292.0, + 203.0 + ], + [ + 315.0, + 201.0 + ] + ], + "center_px": [ + 305.0, + 205.25 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 290.0, + 202.0 + ], + [ + 267.0, + 205.0 + ], + [ + 264.0, + 198.0 + ], + [ + 287.0, + 196.0 + ] + ], + "center_px": [ + 277.0, + 200.25 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 1103.0, + 129.0 + ], + [ + 1122.0, + 128.0 + ], + [ + 1132.0, + 133.0 + ], + [ + 1113.0, + 134.0 + ] + ], + "center_px": [ + 1117.5, + 131.0 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 366.0, + 202.0 + ], + [ + 344.0, + 204.0 + ], + [ + 340.0, + 197.0 + ], + [ + 362.0, + 195.0 + ] + ], + "center_px": [ + 353.0, + 199.5 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 443.0, + 201.0 + ], + [ + 420.0, + 203.0 + ], + [ + 416.0, + 197.0 + ], + [ + 438.0, + 195.0 + ] + ], + "center_px": [ + 429.25, + 199.0 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 33.0, + 192.0 + ], + [ + 33.0, + 199.0 + ], + [ + 10.0, + 201.0 + ], + [ + 10.0, + 194.0 + ] + ], + "center_px": [ + 21.5, + 196.5 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 310.0, + 191.0 + ], + [ + 287.0, + 194.0 + ], + [ + 284.0, + 187.0 + ], + [ + 306.0, + 185.0 + ] + ], + "center_px": [ + 296.75, + 189.25 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 186.0, + 197.0 + ], + [ + 163.0, + 200.0 + ], + [ + 161.0, + 193.0 + ], + [ + 184.0, + 191.0 + ] + ], + "center_px": [ + 173.5, + 195.25 + ], + "area_px": 154.5 + }, + { + "image_points_px": [ + [ + 479.0, + 181.0 + ], + [ + 501.0, + 179.0 + ], + [ + 506.0, + 185.0 + ], + [ + 484.0, + 187.0 + ] + ], + "center_px": [ + 492.5, + 183.0 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 449.0, + 175.0 + ], + [ + 427.0, + 177.0 + ], + [ + 422.0, + 171.0 + ], + [ + 444.0, + 169.0 + ] + ], + "center_px": [ + 435.5, + 173.0 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 467.0, + 166.0 + ], + [ + 489.0, + 164.0 + ], + [ + 494.0, + 170.0 + ], + [ + 473.0, + 172.0 + ] + ], + "center_px": [ + 480.75, + 168.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 986.0, + 143.0 + ], + [ + 969.0, + 145.0 + ], + [ + 958.0, + 139.0 + ], + [ + 976.0, + 137.0 + ] + ], + "center_px": [ + 972.25, + 141.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 460.0, + 190.0 + ], + [ + 438.0, + 193.0 + ], + [ + 434.0, + 186.0 + ], + [ + 455.0, + 184.0 + ] + ], + "center_px": [ + 446.75, + 188.25 + ], + "area_px": 151.0 + }, + { + "image_points_px": [ + [ + 1028.0, + 138.0 + ], + [ + 1046.0, + 137.0 + ], + [ + 1056.0, + 142.0 + ], + [ + 1037.0, + 144.0 + ] + ], + "center_px": [ + 1041.75, + 140.25 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 137.0, + 202.0 + ], + [ + 114.0, + 206.0 + ], + [ + 112.0, + 199.0 + ], + [ + 135.0, + 197.0 + ] + ], + "center_px": [ + 124.5, + 201.0 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 159.0, + 191.0 + ], + [ + 136.0, + 195.0 + ], + [ + 134.0, + 188.0 + ], + [ + 157.0, + 186.0 + ] + ], + "center_px": [ + 146.5, + 190.0 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 997.0, + 134.0 + ], + [ + 1016.0, + 133.0 + ], + [ + 1025.0, + 138.0 + ], + [ + 1007.0, + 140.0 + ] + ], + "center_px": [ + 1011.25, + 136.25 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 1005.0, + 125.0 + ], + [ + 1023.0, + 124.0 + ], + [ + 1033.0, + 129.0 + ], + [ + 1015.0, + 131.0 + ] + ], + "center_px": [ + 1019.0, + 127.25 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 965.0, + 130.0 + ], + [ + 947.0, + 131.0 + ], + [ + 937.0, + 126.0 + ], + [ + 955.0, + 124.0 + ] + ], + "center_px": [ + 951.0, + 127.75 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 1066.0, + 134.0 + ], + [ + 1083.0, + 132.0 + ], + [ + 1094.0, + 138.0 + ], + [ + 1075.0, + 139.0 + ] + ], + "center_px": [ + 1079.5, + 135.75 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 995.0, + 134.0 + ], + [ + 976.0, + 135.0 + ], + [ + 967.0, + 130.0 + ], + [ + 984.0, + 128.0 + ] + ], + "center_px": [ + 980.5, + 131.75 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 1101.0, + 129.0 + ], + [ + 1083.0, + 130.0 + ], + [ + 1073.0, + 125.0 + ], + [ + 1090.0, + 123.0 + ] + ], + "center_px": [ + 1086.75, + 126.75 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 1141.0, + 124.0 + ], + [ + 1158.0, + 123.0 + ], + [ + 1169.0, + 128.0 + ], + [ + 1152.0, + 130.0 + ] + ], + "center_px": [ + 1155.0, + 126.25 + ], + "area_px": 110.0 + }, + { + "image_points_px": [ + [ + 403.0, + 180.0 + ], + [ + 382.0, + 183.0 + ], + [ + 377.0, + 176.0 + ], + [ + 398.0, + 174.0 + ] + ], + "center_px": [ + 390.0, + 178.25 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 975.0, + 121.0 + ], + [ + 994.0, + 120.0 + ], + [ + 1003.0, + 125.0 + ], + [ + 984.0, + 126.0 + ] + ], + "center_px": [ + 989.0, + 123.0 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 234.0, + 192.0 + ], + [ + 212.0, + 194.0 + ], + [ + 209.0, + 188.0 + ], + [ + 231.0, + 185.0 + ] + ], + "center_px": [ + 221.5, + 189.75 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 255.0, + 181.0 + ], + [ + 233.0, + 184.0 + ], + [ + 230.0, + 177.0 + ], + [ + 252.0, + 175.0 + ] + ], + "center_px": [ + 242.5, + 179.25 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 431.0, + 185.0 + ], + [ + 409.0, + 187.0 + ], + [ + 405.0, + 181.0 + ], + [ + 427.0, + 179.0 + ] + ], + "center_px": [ + 418.0, + 183.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 359.0, + 187.0 + ], + [ + 381.0, + 185.0 + ], + [ + 385.0, + 191.0 + ], + [ + 363.0, + 193.0 + ] + ], + "center_px": [ + 372.0, + 189.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 56.0, + 181.0 + ], + [ + 57.0, + 188.0 + ], + [ + 34.0, + 190.0 + ], + [ + 33.0, + 185.0 + ] + ], + "center_px": [ + 45.0, + 186.0 + ], + "area_px": 141.0 + }, + { + "image_points_px": [ + [ + 1080.0, + 116.0 + ], + [ + 1098.0, + 115.0 + ], + [ + 1108.0, + 120.0 + ], + [ + 1089.0, + 121.0 + ] + ], + "center_px": [ + 1093.75, + 118.0 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 1110.0, + 120.0 + ], + [ + 1127.0, + 119.0 + ], + [ + 1138.0, + 124.0 + ], + [ + 1119.0, + 125.0 + ] + ], + "center_px": [ + 1123.5, + 122.0 + ], + "area_px": 100.0 + }, + { + "image_points_px": [ + [ + 1116.0, + 112.0 + ], + [ + 1135.0, + 111.0 + ], + [ + 1144.0, + 116.0 + ], + [ + 1127.0, + 117.0 + ] + ], + "center_px": [ + 1130.5, + 114.0 + ], + "area_px": 100.0 + }, + { + "image_points_px": [ + [ + 131.0, + 181.0 + ], + [ + 132.0, + 187.0 + ], + [ + 109.0, + 189.0 + ], + [ + 108.0, + 183.0 + ] + ], + "center_px": [ + 120.0, + 185.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 63.0, + 219.0 + ], + [ + 40.0, + 223.0 + ], + [ + 38.0, + 217.0 + ], + [ + 61.0, + 214.0 + ] + ], + "center_px": [ + 50.5, + 218.25 + ], + "area_px": 133.5 + }, + { + "image_points_px": [ + [ + 465.0, + 165.0 + ], + [ + 444.0, + 167.0 + ], + [ + 439.0, + 161.0 + ], + [ + 461.0, + 159.0 + ] + ], + "center_px": [ + 452.25, + 163.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 451.0, + 176.0 + ], + [ + 472.0, + 174.0 + ], + [ + 477.0, + 180.0 + ], + [ + 455.0, + 182.0 + ] + ], + "center_px": [ + 463.75, + 178.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 31.0, + 177.0 + ], + [ + 31.0, + 183.0 + ], + [ + 8.0, + 185.0 + ], + [ + 8.0, + 179.0 + ] + ], + "center_px": [ + 19.5, + 181.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 1086.0, + 108.0 + ], + [ + 1105.0, + 107.0 + ], + [ + 1114.0, + 111.0 + ], + [ + 1097.0, + 113.0 + ] + ], + "center_px": [ + 1100.5, + 109.75 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 1013.0, + 117.0 + ], + [ + 1032.0, + 116.0 + ], + [ + 1041.0, + 120.0 + ], + [ + 1021.0, + 121.0 + ] + ], + "center_px": [ + 1026.75, + 118.5 + ], + "area_px": 86.5 + }, + { + "image_points_px": [ + [ + 152.0, + 171.0 + ], + [ + 154.0, + 177.0 + ], + [ + 131.0, + 179.0 + ], + [ + 130.0, + 173.0 + ] + ], + "center_px": [ + 141.75, + 175.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 304.0, + 177.0 + ], + [ + 325.0, + 175.0 + ], + [ + 329.0, + 181.0 + ], + [ + 307.0, + 183.0 + ] + ], + "center_px": [ + 316.25, + 179.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 322.0, + 167.0 + ], + [ + 344.0, + 165.0 + ], + [ + 347.0, + 171.0 + ], + [ + 326.0, + 173.0 + ] + ], + "center_px": [ + 334.75, + 169.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 269.0, + 212.0 + ], + [ + 247.0, + 216.0 + ], + [ + 244.0, + 210.0 + ], + [ + 266.0, + 207.0 + ] + ], + "center_px": [ + 256.5, + 211.25 + ], + "area_px": 131.5 + }, + { + "image_points_px": [ + [ + 175.0, + 167.0 + ], + [ + 153.0, + 169.0 + ], + [ + 151.0, + 163.0 + ], + [ + 173.0, + 161.0 + ] + ], + "center_px": [ + 163.0, + 165.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 128.0, + 172.0 + ], + [ + 106.0, + 174.0 + ], + [ + 104.0, + 168.0 + ], + [ + 126.0, + 166.0 + ] + ], + "center_px": [ + 116.0, + 170.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 946.0, + 117.0 + ], + [ + 965.0, + 116.0 + ], + [ + 973.0, + 121.0 + ], + [ + 955.0, + 122.0 + ] + ], + "center_px": [ + 959.75, + 119.0 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 106.0, + 181.0 + ], + [ + 83.0, + 184.0 + ], + [ + 82.0, + 178.0 + ], + [ + 104.0, + 176.0 + ] + ], + "center_px": [ + 93.75, + 179.75 + ], + "area_px": 127.5 + }, + { + "image_points_px": [ + [ + 1043.0, + 121.0 + ], + [ + 1062.0, + 120.0 + ], + [ + 1070.0, + 125.0 + ], + [ + 1053.0, + 126.0 + ] + ], + "center_px": [ + 1057.0, + 123.0 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 420.0, + 170.0 + ], + [ + 399.0, + 172.0 + ], + [ + 395.0, + 166.0 + ], + [ + 416.0, + 164.0 + ] + ], + "center_px": [ + 407.5, + 168.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 366.0, + 161.0 + ], + [ + 345.0, + 163.0 + ], + [ + 341.0, + 157.0 + ], + [ + 362.0, + 155.0 + ] + ], + "center_px": [ + 353.5, + 159.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 1011.0, + 116.0 + ], + [ + 994.0, + 118.0 + ], + [ + 984.0, + 113.0 + ], + [ + 1001.0, + 111.0 + ] + ], + "center_px": [ + 997.5, + 114.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 982.0, + 112.0 + ], + [ + 965.0, + 114.0 + ], + [ + 955.0, + 109.0 + ], + [ + 972.0, + 107.0 + ] + ], + "center_px": [ + 968.5, + 110.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 499.0, + 147.0 + ], + [ + 520.0, + 145.0 + ], + [ + 525.0, + 150.0 + ], + [ + 504.0, + 152.0 + ] + ], + "center_px": [ + 512.0, + 148.5 + ], + "area_px": 115.0 + }, + { + "image_points_px": [ + [ + 368.0, + 161.0 + ], + [ + 389.0, + 160.0 + ], + [ + 393.0, + 165.0 + ], + [ + 371.0, + 167.0 + ] + ], + "center_px": [ + 380.25, + 163.25 + ], + "area_px": 123.5 + }, + { + "image_points_px": [ + [ + 301.0, + 176.0 + ], + [ + 279.0, + 178.0 + ], + [ + 277.0, + 172.0 + ], + [ + 298.0, + 170.0 + ] + ], + "center_px": [ + 288.75, + 174.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 274.0, + 171.0 + ], + [ + 252.0, + 173.0 + ], + [ + 250.0, + 167.0 + ], + [ + 271.0, + 165.0 + ] + ], + "center_px": [ + 261.75, + 169.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 410.0, + 156.0 + ], + [ + 390.0, + 158.0 + ], + [ + 385.0, + 152.0 + ], + [ + 406.0, + 150.0 + ] + ], + "center_px": [ + 397.75, + 154.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 1057.0, + 104.0 + ], + [ + 1075.0, + 103.0 + ], + [ + 1084.0, + 107.0 + ], + [ + 1067.0, + 109.0 + ] + ], + "center_px": [ + 1070.75, + 105.75 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 1028.0, + 100.0 + ], + [ + 1045.0, + 99.0 + ], + [ + 1055.0, + 103.0 + ], + [ + 1038.0, + 105.0 + ] + ], + "center_px": [ + 1041.5, + 101.75 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 926.0, + 105.0 + ], + [ + 945.0, + 104.0 + ], + [ + 953.0, + 108.0 + ], + [ + 934.0, + 109.0 + ] + ], + "center_px": [ + 939.5, + 106.5 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 437.0, + 160.0 + ], + [ + 416.0, + 162.0 + ], + [ + 412.0, + 157.0 + ], + [ + 433.0, + 154.0 + ] + ], + "center_px": [ + 424.5, + 158.25 + ], + "area_px": 125.5 + }, + { + "image_points_px": [ + [ + 1014.0, + 81.0 + ], + [ + 1033.0, + 80.0 + ], + [ + 1041.0, + 84.0 + ], + [ + 1023.0, + 85.0 + ] + ], + "center_px": [ + 1027.75, + 82.5 + ], + "area_px": 82.5 + }, + { + "image_points_px": [ + [ + 497.0, + 146.0 + ], + [ + 477.0, + 148.0 + ], + [ + 472.0, + 142.0 + ], + [ + 492.0, + 140.0 + ] + ], + "center_px": [ + 484.5, + 144.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 1093.0, + 100.0 + ], + [ + 1111.0, + 99.0 + ], + [ + 1120.0, + 103.0 + ], + [ + 1102.0, + 104.0 + ] + ], + "center_px": [ + 1106.5, + 101.5 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 456.0, + 151.0 + ], + [ + 477.0, + 150.0 + ], + [ + 481.0, + 155.0 + ], + [ + 460.0, + 157.0 + ] + ], + "center_px": [ + 468.5, + 153.25 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 1064.0, + 96.0 + ], + [ + 1081.0, + 95.0 + ], + [ + 1091.0, + 99.0 + ], + [ + 1073.0, + 100.0 + ] + ], + "center_px": [ + 1077.25, + 97.5 + ], + "area_px": 79.5 + }, + { + "image_points_px": [ + [ + 319.0, + 344.0 + ], + [ + 321.0, + 356.0 + ], + [ + 307.0, + 358.0 + ], + [ + 302.0, + 347.0 + ] + ], + "center_px": [ + 312.25, + 351.25 + ], + "area_px": 187.0 + }, + { + "image_points_px": [ + [ + 320.0, + 166.0 + ], + [ + 299.0, + 168.0 + ], + [ + 296.0, + 162.0 + ], + [ + 317.0, + 160.0 + ] + ], + "center_px": [ + 308.0, + 164.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 147.0, + 156.0 + ], + [ + 149.0, + 162.0 + ], + [ + 127.0, + 164.0 + ], + [ + 126.0, + 158.0 + ] + ], + "center_px": [ + 137.25, + 160.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 145.0, + 148.0 + ], + [ + 123.0, + 150.0 + ], + [ + 122.0, + 144.0 + ], + [ + 143.0, + 142.0 + ] + ], + "center_px": [ + 133.25, + 146.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 99.0, + 153.0 + ], + [ + 77.0, + 155.0 + ], + [ + 76.0, + 149.0 + ], + [ + 97.0, + 147.0 + ] + ], + "center_px": [ + 87.25, + 151.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 817.0, + 261.0 + ], + [ + 816.0, + 272.0 + ], + [ + 805.0, + 273.0 + ], + [ + 796.0, + 265.0 + ] + ], + "center_px": [ + 808.5, + 267.75 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 454.0, + 151.0 + ], + [ + 435.0, + 153.0 + ], + [ + 429.0, + 147.0 + ], + [ + 449.0, + 145.0 + ] + ], + "center_px": [ + 441.75, + 149.0 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 76.0, + 157.0 + ], + [ + 76.0, + 163.0 + ], + [ + 55.0, + 165.0 + ], + [ + 54.0, + 159.0 + ] + ], + "center_px": [ + 65.25, + 161.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 747.0, + 199.0 + ], + [ + 725.0, + 201.0 + ], + [ + 721.0, + 197.0 + ], + [ + 742.0, + 195.0 + ] + ], + "center_px": [ + 733.75, + 198.0 + ], + "area_px": 95.0 + }, + { + "image_points_px": [ + [ + 958.0, + 182.0 + ], + [ + 973.0, + 181.0 + ], + [ + 983.0, + 187.0 + ], + [ + 964.0, + 189.0 + ] + ], + "center_px": [ + 969.5, + 184.75 + ], + "area_px": 122.5 + }, + { + "image_points_px": [ + [ + 402.0, + 143.0 + ], + [ + 423.0, + 141.0 + ], + [ + 427.0, + 146.0 + ], + [ + 406.0, + 148.0 + ] + ], + "center_px": [ + 414.5, + 144.5 + ], + "area_px": 113.0 + }, + { + "image_points_px": [ + [ + 918.0, + 113.0 + ], + [ + 936.0, + 112.0 + ], + [ + 944.0, + 117.0 + ], + [ + 926.0, + 118.0 + ] + ], + "center_px": [ + 931.0, + 115.0 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 312.0, + 151.0 + ], + [ + 291.0, + 154.0 + ], + [ + 288.0, + 148.0 + ], + [ + 309.0, + 146.0 + ] + ], + "center_px": [ + 300.0, + 149.75 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 241.0, + 152.0 + ], + [ + 220.0, + 154.0 + ], + [ + 217.0, + 149.0 + ], + [ + 238.0, + 146.0 + ] + ], + "center_px": [ + 229.0, + 150.25 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 470.0, + 141.0 + ], + [ + 449.0, + 143.0 + ], + [ + 445.0, + 138.0 + ], + [ + 465.0, + 136.0 + ] + ], + "center_px": [ + 457.25, + 139.5 + ], + "area_px": 111.5 + }, + { + "image_points_px": [ + [ + 267.0, + 157.0 + ], + [ + 246.0, + 158.0 + ], + [ + 243.0, + 153.0 + ], + [ + 264.0, + 151.0 + ] + ], + "center_px": [ + 255.0, + 154.75 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 180.0, + 181.0 + ], + [ + 159.0, + 184.0 + ], + [ + 156.0, + 179.0 + ], + [ + 178.0, + 176.0 + ] + ], + "center_px": [ + 168.25, + 180.0 + ], + "area_px": 115.0 + }, + { + "image_points_px": [ + [ + 1035.0, + 92.0 + ], + [ + 1052.0, + 91.0 + ], + [ + 1061.0, + 96.0 + ], + [ + 1045.0, + 97.0 + ] + ], + "center_px": [ + 1048.25, + 94.0 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 961.0, + 100.0 + ], + [ + 943.0, + 101.0 + ], + [ + 935.0, + 97.0 + ], + [ + 952.0, + 95.0 + ] + ], + "center_px": [ + 947.75, + 98.25 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 486.0, + 132.0 + ], + [ + 466.0, + 134.0 + ], + [ + 461.0, + 129.0 + ], + [ + 481.0, + 127.0 + ] + ], + "center_px": [ + 473.5, + 130.5 + ], + "area_px": 110.0 + }, + { + "image_points_px": [ + [ + 964.0, + 101.0 + ], + [ + 980.0, + 99.0 + ], + [ + 990.0, + 104.0 + ], + [ + 972.0, + 105.0 + ] + ], + "center_px": [ + 976.5, + 102.25 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 27.0, + 148.0 + ], + [ + 27.0, + 153.0 + ], + [ + 5.0, + 155.0 + ], + [ + 5.0, + 150.0 + ] + ], + "center_px": [ + 16.0, + 151.5 + ], + "area_px": 110.0 + }, + { + "image_points_px": [ + [ + 237.0, + 194.0 + ], + [ + 258.0, + 191.0 + ], + [ + 261.0, + 196.0 + ], + [ + 240.0, + 199.0 + ] + ], + "center_px": [ + 249.0, + 195.0 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 501.0, + 123.0 + ], + [ + 481.0, + 125.0 + ], + [ + 476.0, + 120.0 + ], + [ + 495.0, + 118.0 + ] + ], + "center_px": [ + 488.25, + 121.5 + ], + "area_px": 108.5 + }, + { + "image_points_px": [ + [ + 907.0, + 93.0 + ], + [ + 925.0, + 92.0 + ], + [ + 933.0, + 96.0 + ], + [ + 914.0, + 97.0 + ] + ], + "center_px": [ + 919.75, + 94.5 + ], + "area_px": 81.5 + }, + { + "image_points_px": [ + [ + 943.0, + 89.0 + ], + [ + 962.0, + 88.0 + ], + [ + 969.0, + 92.0 + ], + [ + 951.0, + 93.0 + ] + ], + "center_px": [ + 956.25, + 90.5 + ], + "area_px": 81.5 + }, + { + "image_points_px": [ + [ + 286.0, + 147.0 + ], + [ + 265.0, + 149.0 + ], + [ + 262.0, + 144.0 + ], + [ + 281.0, + 141.0 + ] + ], + "center_px": [ + 273.5, + 145.25 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 951.0, + 81.0 + ], + [ + 969.0, + 80.0 + ], + [ + 977.0, + 84.0 + ], + [ + 959.0, + 85.0 + ] + ], + "center_px": [ + 964.0, + 82.5 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 979.0, + 85.0 + ], + [ + 997.0, + 84.0 + ], + [ + 1005.0, + 88.0 + ], + [ + 987.0, + 89.0 + ] + ], + "center_px": [ + 992.0, + 86.5 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 931.0, + 134.0 + ], + [ + 947.0, + 133.0 + ], + [ + 956.0, + 138.0 + ], + [ + 937.0, + 140.0 + ] + ], + "center_px": [ + 942.75, + 136.25 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 417.0, + 133.0 + ], + [ + 396.0, + 134.0 + ], + [ + 393.0, + 129.0 + ], + [ + 412.0, + 127.0 + ] + ], + "center_px": [ + 404.5, + 130.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 419.0, + 133.0 + ], + [ + 439.0, + 132.0 + ], + [ + 443.0, + 137.0 + ], + [ + 423.0, + 139.0 + ] + ], + "center_px": [ + 431.0, + 135.25 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 170.0, + 152.0 + ], + [ + 148.0, + 154.0 + ], + [ + 147.0, + 149.0 + ], + [ + 168.0, + 147.0 + ] + ], + "center_px": [ + 158.25, + 150.5 + ], + "area_px": 110.5 + }, + { + "image_points_px": [ + [ + 141.0, + 134.0 + ], + [ + 119.0, + 136.0 + ], + [ + 118.0, + 131.0 + ], + [ + 139.0, + 129.0 + ] + ], + "center_px": [ + 129.25, + 132.5 + ], + "area_px": 110.5 + }, + { + "image_points_px": [ + [ + 991.0, + 237.0 + ], + [ + 1003.0, + 236.0 + ], + [ + 1014.0, + 243.0 + ], + [ + 996.0, + 246.0 + ] + ], + "center_px": [ + 1001.0, + 240.5 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 260.0, + 143.0 + ], + [ + 240.0, + 145.0 + ], + [ + 237.0, + 139.0 + ], + [ + 257.0, + 137.0 + ] + ], + "center_px": [ + 248.5, + 141.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 374.0, + 137.0 + ], + [ + 353.0, + 139.0 + ], + [ + 350.0, + 134.0 + ], + [ + 370.0, + 132.0 + ] + ], + "center_px": [ + 361.75, + 135.5 + ], + "area_px": 109.5 + }, + { + "image_points_px": [ + [ + 330.0, + 142.0 + ], + [ + 310.0, + 144.0 + ], + [ + 306.0, + 139.0 + ], + [ + 327.0, + 137.0 + ] + ], + "center_px": [ + 318.25, + 140.5 + ], + "area_px": 109.5 + }, + { + "image_points_px": [ + [ + 348.0, + 133.0 + ], + [ + 328.0, + 135.0 + ], + [ + 324.0, + 130.0 + ], + [ + 345.0, + 128.0 + ] + ], + "center_px": [ + 336.25, + 131.5 + ], + "area_px": 109.5 + }, + { + "image_points_px": [ + [ + 215.0, + 147.0 + ], + [ + 195.0, + 150.0 + ], + [ + 192.0, + 144.0 + ], + [ + 213.0, + 142.0 + ] + ], + "center_px": [ + 203.75, + 145.75 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 512.0, + 137.0 + ], + [ + 492.0, + 138.0 + ], + [ + 488.0, + 133.0 + ], + [ + 507.0, + 131.0 + ] + ], + "center_px": [ + 499.75, + 134.75 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 281.0, + 134.0 + ], + [ + 302.0, + 133.0 + ], + [ + 304.0, + 138.0 + ], + [ + 284.0, + 140.0 + ] + ], + "center_px": [ + 292.75, + 136.25 + ], + "area_px": 116.5 + }, + { + "image_points_px": [ + [ + 162.0, + 126.0 + ], + [ + 183.0, + 125.0 + ], + [ + 185.0, + 130.0 + ], + [ + 165.0, + 132.0 + ] + ], + "center_px": [ + 173.75, + 128.25 + ], + "area_px": 116.5 + }, + { + "image_points_px": [ + [ + 391.0, + 128.0 + ], + [ + 370.0, + 130.0 + ], + [ + 367.0, + 125.0 + ], + [ + 386.0, + 123.0 + ] + ], + "center_px": [ + 378.5, + 126.5 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 1223.0, + 396.0 + ], + [ + 1229.0, + 395.0 + ], + [ + 1245.0, + 407.0 + ], + [ + 1239.0, + 409.0 + ] + ], + "center_px": [ + 1234.0, + 401.75 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 435.0, + 125.0 + ], + [ + 455.0, + 123.0 + ], + [ + 459.0, + 128.0 + ], + [ + 439.0, + 130.0 + ] + ], + "center_px": [ + 447.0, + 126.5 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 187.0, + 131.0 + ], + [ + 208.0, + 129.0 + ], + [ + 210.0, + 134.0 + ], + [ + 189.0, + 136.0 + ] + ], + "center_px": [ + 198.5, + 132.5 + ], + "area_px": 109.0 + }, + { + "image_points_px": [ + [ + 167.0, + 140.0 + ], + [ + 188.0, + 138.0 + ], + [ + 190.0, + 143.0 + ], + [ + 169.0, + 145.0 + ] + ], + "center_px": [ + 178.5, + 141.5 + ], + "area_px": 109.0 + }, + { + "image_points_px": [ + [ + 1033.0, + 92.0 + ], + [ + 1016.0, + 93.0 + ], + [ + 1008.0, + 88.0 + ], + [ + 1024.0, + 87.0 + ] + ], + "center_px": [ + 1020.25, + 90.0 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 409.0, + 121.0 + ], + [ + 429.0, + 119.0 + ], + [ + 433.0, + 124.0 + ], + [ + 414.0, + 126.0 + ] + ], + "center_px": [ + 421.25, + 122.5 + ], + "area_px": 106.5 + }, + { + "image_points_px": [ + [ + 299.0, + 125.0 + ], + [ + 319.0, + 124.0 + ], + [ + 322.0, + 129.0 + ], + [ + 302.0, + 131.0 + ] + ], + "center_px": [ + 310.5, + 127.25 + ], + "area_px": 114.5 + }, + { + "image_points_px": [ + [ + 975.0, + 208.0 + ], + [ + 986.0, + 207.0 + ], + [ + 998.0, + 214.0 + ], + [ + 980.0, + 216.0 + ] + ], + "center_px": [ + 984.75, + 211.25 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 638.0, + 36.0 + ], + [ + 621.0, + 38.0 + ], + [ + 614.0, + 33.0 + ], + [ + 632.0, + 30.0 + ] + ], + "center_px": [ + 626.25, + 34.25 + ], + "area_px": 112.5 + }, + { + "image_points_px": [ + [ + 235.0, + 138.0 + ], + [ + 214.0, + 140.0 + ], + [ + 212.0, + 135.0 + ], + [ + 232.0, + 133.0 + ] + ], + "center_px": [ + 223.25, + 136.5 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 229.0, + 125.0 + ], + [ + 208.0, + 127.0 + ], + [ + 206.0, + 122.0 + ], + [ + 226.0, + 120.0 + ] + ], + "center_px": [ + 217.25, + 123.5 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 279.0, + 133.0 + ], + [ + 258.0, + 135.0 + ], + [ + 256.0, + 130.0 + ], + [ + 276.0, + 128.0 + ] + ], + "center_px": [ + 267.25, + 131.5 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 254.0, + 129.0 + ], + [ + 233.0, + 131.0 + ], + [ + 231.0, + 126.0 + ], + [ + 251.0, + 124.0 + ] + ], + "center_px": [ + 242.25, + 127.5 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 115.0, + 125.0 + ], + [ + 116.0, + 130.0 + ], + [ + 95.0, + 132.0 + ], + [ + 94.0, + 127.0 + ] + ], + "center_px": [ + 105.0, + 128.5 + ], + "area_px": 107.0 + }, + { + "image_points_px": [ + [ + 49.0, + 132.0 + ], + [ + 70.0, + 130.0 + ], + [ + 71.0, + 135.0 + ], + [ + 50.0, + 137.0 + ] + ], + "center_px": [ + 60.0, + 133.5 + ], + "area_px": 107.0 + }, + { + "image_points_px": [ + [ + 1043.0, + 85.0 + ], + [ + 1059.0, + 83.0 + ], + [ + 1068.0, + 88.0 + ], + [ + 1052.0, + 89.0 + ] + ], + "center_px": [ + 1055.5, + 86.25 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 1047.0, + 76.0 + ], + [ + 1031.0, + 78.0 + ], + [ + 1022.0, + 73.0 + ], + [ + 1038.0, + 72.0 + ] + ], + "center_px": [ + 1034.5, + 74.75 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 274.0, + 121.0 + ], + [ + 294.0, + 120.0 + ], + [ + 297.0, + 125.0 + ], + [ + 276.0, + 126.0 + ] + ], + "center_px": [ + 285.25, + 123.0 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 29.0, + 163.0 + ], + [ + 28.0, + 168.0 + ], + [ + 7.0, + 169.0 + ], + [ + 8.0, + 164.0 + ] + ], + "center_px": [ + 18.0, + 166.0 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 924.0, + 78.0 + ], + [ + 943.0, + 77.0 + ], + [ + 949.0, + 81.0 + ], + [ + 933.0, + 82.0 + ] + ], + "center_px": [ + 937.25, + 79.5 + ], + "area_px": 77.5 + }, + { + "image_points_px": [ + [ + 1089.0, + 572.0 + ], + [ + 1083.0, + 578.0 + ], + [ + 1073.0, + 583.0 + ], + [ + 1066.0, + 578.0 + ] + ], + "center_px": [ + 1077.75, + 577.75 + ], + "area_px": 93.5 + }, + { + "image_points_px": [ + [ + 989.0, + 176.0 + ], + [ + 972.0, + 178.0 + ], + [ + 965.0, + 173.0 + ], + [ + 981.0, + 170.0 + ] + ], + "center_px": [ + 976.75, + 174.25 + ], + "area_px": 109.5 + }, + { + "image_points_px": [ + [ + 941.0, + 63.0 + ], + [ + 957.0, + 62.0 + ], + [ + 966.0, + 66.0 + ], + [ + 948.0, + 67.0 + ] + ], + "center_px": [ + 953.0, + 64.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 1050.0, + 77.0 + ], + [ + 1067.0, + 76.0 + ], + [ + 1075.0, + 80.0 + ], + [ + 1058.0, + 81.0 + ] + ], + "center_px": [ + 1062.5, + 78.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 897.0, + 74.0 + ], + [ + 914.0, + 73.0 + ], + [ + 922.0, + 77.0 + ], + [ + 905.0, + 78.0 + ] + ], + "center_px": [ + 909.5, + 75.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 290.0, + 112.0 + ], + [ + 270.0, + 114.0 + ], + [ + 267.0, + 109.0 + ], + [ + 287.0, + 107.0 + ] + ], + "center_px": [ + 278.5, + 110.5 + ], + "area_px": 106.0 + }, + { + "image_points_px": [ + [ + 490.0, + 111.0 + ], + [ + 470.0, + 112.0 + ], + [ + 466.0, + 108.0 + ], + [ + 485.0, + 106.0 + ] + ], + "center_px": [ + 477.75, + 109.25 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 995.0, + 70.0 + ], + [ + 1011.0, + 69.0 + ], + [ + 1020.0, + 73.0 + ], + [ + 1003.0, + 74.0 + ] + ], + "center_px": [ + 1007.25, + 71.5 + ], + "area_px": 74.5 + }, + { + "image_points_px": [ + [ + 1029.0, + 66.0 + ], + [ + 1045.0, + 65.0 + ], + [ + 1054.0, + 69.0 + ], + [ + 1037.0, + 70.0 + ] + ], + "center_px": [ + 1041.25, + 67.5 + ], + "area_px": 74.5 + }, + { + "image_points_px": [ + [ + 956.0, + 49.0 + ], + [ + 972.0, + 48.0 + ], + [ + 981.0, + 52.0 + ], + [ + 964.0, + 53.0 + ] + ], + "center_px": [ + 968.25, + 50.5 + ], + "area_px": 74.5 + }, + { + "image_points_px": [ + [ + 1078.0, + 167.0 + ], + [ + 1094.0, + 165.0 + ], + [ + 1102.0, + 170.0 + ], + [ + 1087.0, + 173.0 + ] + ], + "center_px": [ + 1090.25, + 168.75 + ], + "area_px": 106.5 + }, + { + "image_points_px": [ + [ + 1030.0, + 301.0 + ], + [ + 1038.0, + 301.0 + ], + [ + 1051.0, + 310.0 + ], + [ + 1036.0, + 312.0 + ] + ], + "center_px": [ + 1038.75, + 306.0 + ], + "area_px": 124.5 + }, + { + "image_points_px": [ + [ + 249.0, + 117.0 + ], + [ + 270.0, + 116.0 + ], + [ + 272.0, + 120.0 + ], + [ + 252.0, + 122.0 + ] + ], + "center_px": [ + 260.75, + 118.75 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 47.0, + 126.0 + ], + [ + 47.0, + 130.0 + ], + [ + 26.0, + 132.0 + ], + [ + 25.0, + 128.0 + ] + ], + "center_px": [ + 36.25, + 129.0 + ], + "area_px": 87.0 + }, + { + "image_points_px": [ + [ + 485.0, + 223.0 + ], + [ + 468.0, + 225.0 + ], + [ + 463.0, + 218.0 + ], + [ + 479.0, + 216.0 + ] + ], + "center_px": [ + 473.75, + 220.5 + ], + "area_px": 126.5 + }, + { + "image_points_px": [ + [ + 160.0, + 126.0 + ], + [ + 140.0, + 127.0 + ], + [ + 138.0, + 123.0 + ], + [ + 158.0, + 120.0 + ] + ], + "center_px": [ + 149.0, + 124.0 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 204.0, + 121.0 + ], + [ + 184.0, + 123.0 + ], + [ + 182.0, + 118.0 + ], + [ + 202.0, + 116.0 + ] + ], + "center_px": [ + 193.0, + 119.5 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 180.0, + 117.0 + ], + [ + 160.0, + 119.0 + ], + [ + 158.0, + 114.0 + ], + [ + 178.0, + 112.0 + ] + ], + "center_px": [ + 169.0, + 115.5 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 508.0, + 159.0 + ], + [ + 489.0, + 162.0 + ], + [ + 485.0, + 157.0 + ], + [ + 503.0, + 154.0 + ] + ], + "center_px": [ + 496.25, + 158.0 + ], + "area_px": 106.0 + }, + { + "image_points_px": [ + [ + 224.0, + 164.0 + ], + [ + 245.0, + 161.0 + ], + [ + 247.0, + 165.0 + ], + [ + 227.0, + 168.0 + ] + ], + "center_px": [ + 235.75, + 164.5 + ], + "area_px": 89.5 + }, + { + "image_points_px": [ + [ + 350.0, + 100.0 + ], + [ + 369.0, + 99.0 + ], + [ + 373.0, + 103.0 + ], + [ + 353.0, + 105.0 + ] + ], + "center_px": [ + 361.25, + 101.75 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 64.0, + 104.0 + ], + [ + 66.0, + 109.0 + ], + [ + 45.0, + 111.0 + ], + [ + 45.0, + 106.0 + ] + ], + "center_px": [ + 55.0, + 107.5 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 481.0, + 99.0 + ], + [ + 499.0, + 98.0 + ], + [ + 504.0, + 103.0 + ], + [ + 485.0, + 104.0 + ] + ], + "center_px": [ + 492.25, + 101.0 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 506.0, + 103.0 + ], + [ + 525.0, + 102.0 + ], + [ + 529.0, + 107.0 + ], + [ + 511.0, + 108.0 + ] + ], + "center_px": [ + 517.75, + 105.0 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 789.0, + 223.0 + ], + [ + 777.0, + 224.0 + ], + [ + 768.0, + 216.0 + ], + [ + 784.0, + 214.0 + ] + ], + "center_px": [ + 779.5, + 219.25 + ], + "area_px": 129.5 + }, + { + "image_points_px": [ + [ + 992.0, + 69.0 + ], + [ + 976.0, + 71.0 + ], + [ + 968.0, + 66.0 + ], + [ + 983.0, + 65.0 + ] + ], + "center_px": [ + 979.75, + 67.75 + ], + "area_px": 82.5 + }, + { + "image_points_px": [ + [ + 223.0, + 112.0 + ], + [ + 203.0, + 114.0 + ], + [ + 201.0, + 109.0 + ], + [ + 220.0, + 107.0 + ] + ], + "center_px": [ + 211.75, + 110.5 + ], + "area_px": 102.5 + }, + { + "image_points_px": [ + [ + 88.0, + 108.0 + ], + [ + 89.0, + 113.0 + ], + [ + 68.0, + 114.0 + ], + [ + 68.0, + 110.0 + ] + ], + "center_px": [ + 78.25, + 111.25 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 479.0, + 99.0 + ], + [ + 459.0, + 100.0 + ], + [ + 456.0, + 96.0 + ], + [ + 474.0, + 94.0 + ] + ], + "center_px": [ + 467.0, + 97.25 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 515.0, + 115.0 + ], + [ + 496.0, + 116.0 + ], + [ + 492.0, + 112.0 + ], + [ + 511.0, + 110.0 + ] + ], + "center_px": [ + 503.5, + 113.25 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 406.0, + 88.0 + ], + [ + 425.0, + 87.0 + ], + [ + 429.0, + 91.0 + ], + [ + 410.0, + 93.0 + ] + ], + "center_px": [ + 417.5, + 89.75 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 518.0, + 95.0 + ], + [ + 499.0, + 96.0 + ], + [ + 495.0, + 92.0 + ], + [ + 514.0, + 90.0 + ] + ], + "center_px": [ + 506.5, + 93.25 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 45.0, + 114.0 + ], + [ + 45.0, + 118.0 + ], + [ + 24.0, + 119.0 + ], + [ + 25.0, + 114.0 + ] + ], + "center_px": [ + 34.75, + 116.25 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 225.0, + 113.0 + ], + [ + 245.0, + 112.0 + ], + [ + 247.0, + 116.0 + ], + [ + 227.0, + 118.0 + ] + ], + "center_px": [ + 236.0, + 114.75 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 156.0, + 113.0 + ], + [ + 136.0, + 114.0 + ], + [ + 134.0, + 110.0 + ], + [ + 154.0, + 108.0 + ] + ], + "center_px": [ + 145.0, + 111.25 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 1002.0, + 63.0 + ], + [ + 1019.0, + 62.0 + ], + [ + 1026.0, + 66.0 + ], + [ + 1011.0, + 67.0 + ] + ], + "center_px": [ + 1014.5, + 64.5 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 173.0, + 489.0 + ], + [ + 155.0, + 493.0 + ], + [ + 149.0, + 492.0 + ], + [ + 171.0, + 487.0 + ] + ], + "center_px": [ + 162.0, + 490.25 + ], + "area_px": 48.0 + }, + { + "image_points_px": [ + [ + 265.0, + 108.0 + ], + [ + 246.0, + 110.0 + ], + [ + 243.0, + 105.0 + ], + [ + 262.0, + 103.0 + ] + ], + "center_px": [ + 254.0, + 106.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 241.0, + 104.0 + ], + [ + 222.0, + 106.0 + ], + [ + 219.0, + 101.0 + ], + [ + 238.0, + 99.0 + ] + ], + "center_px": [ + 230.0, + 102.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 283.0, + 100.0 + ], + [ + 264.0, + 102.0 + ], + [ + 261.0, + 97.0 + ], + [ + 280.0, + 95.0 + ] + ], + "center_px": [ + 272.0, + 98.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 520.0, + 95.0 + ], + [ + 539.0, + 94.0 + ], + [ + 543.0, + 98.0 + ], + [ + 525.0, + 100.0 + ] + ], + "center_px": [ + 531.75, + 96.75 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 532.0, + 87.0 + ], + [ + 513.0, + 88.0 + ], + [ + 509.0, + 84.0 + ], + [ + 527.0, + 82.0 + ] + ], + "center_px": [ + 520.25, + 85.25 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 334.0, + 108.0 + ], + [ + 353.0, + 107.0 + ], + [ + 356.0, + 112.0 + ], + [ + 337.0, + 113.0 + ] + ], + "center_px": [ + 345.0, + 110.0 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 1007.0, + 55.0 + ], + [ + 990.0, + 56.0 + ], + [ + 983.0, + 53.0 + ], + [ + 998.0, + 51.0 + ] + ], + "center_px": [ + 994.5, + 53.75 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 1009.0, + 56.0 + ], + [ + 1026.0, + 55.0 + ], + [ + 1033.0, + 58.0 + ], + [ + 1018.0, + 60.0 + ] + ], + "center_px": [ + 1021.5, + 57.25 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 493.0, + 91.0 + ], + [ + 474.0, + 92.0 + ], + [ + 470.0, + 88.0 + ], + [ + 487.0, + 86.0 + ] + ], + "center_px": [ + 481.0, + 89.25 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 1001.0, + 96.0 + ], + [ + 1018.0, + 95.0 + ], + [ + 1024.0, + 100.0 + ], + [ + 1008.0, + 101.0 + ] + ], + "center_px": [ + 1012.75, + 98.0 + ], + "area_px": 89.0 + }, + { + "image_points_px": [ + [ + 237.0, + 93.0 + ], + [ + 257.0, + 92.0 + ], + [ + 259.0, + 96.0 + ], + [ + 240.0, + 98.0 + ] + ], + "center_px": [ + 248.25, + 94.75 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 307.0, + 104.0 + ], + [ + 287.0, + 105.0 + ], + [ + 285.0, + 101.0 + ], + [ + 304.0, + 99.0 + ] + ], + "center_px": [ + 295.75, + 102.25 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 324.0, + 96.0 + ], + [ + 304.0, + 97.0 + ], + [ + 302.0, + 93.0 + ], + [ + 321.0, + 91.0 + ] + ], + "center_px": [ + 312.75, + 94.25 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 397.0, + 77.0 + ], + [ + 416.0, + 76.0 + ], + [ + 420.0, + 80.0 + ], + [ + 401.0, + 81.0 + ] + ], + "center_px": [ + 408.5, + 78.5 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 22.0, + 102.0 + ], + [ + 42.0, + 101.0 + ], + [ + 43.0, + 105.0 + ], + [ + 23.0, + 107.0 + ] + ], + "center_px": [ + 32.5, + 103.75 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 990.0, + 46.0 + ], + [ + 1006.0, + 45.0 + ], + [ + 1014.0, + 48.0 + ], + [ + 997.0, + 49.0 + ] + ], + "center_px": [ + 1001.75, + 47.0 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 313.0, + 266.0 + ], + [ + 314.0, + 276.0 + ], + [ + 301.0, + 277.0 + ], + [ + 297.0, + 268.0 + ] + ], + "center_px": [ + 306.25, + 271.75 + ], + "area_px": 141.5 + }, + { + "image_points_px": [ + [ + 300.0, + 92.0 + ], + [ + 280.0, + 93.0 + ], + [ + 278.0, + 89.0 + ], + [ + 296.0, + 87.0 + ] + ], + "center_px": [ + 288.5, + 90.25 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 208.0, + 78.0 + ], + [ + 228.0, + 77.0 + ], + [ + 230.0, + 81.0 + ], + [ + 210.0, + 82.0 + ] + ], + "center_px": [ + 219.0, + 79.5 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 198.0, + 437.0 + ], + [ + 196.0, + 441.0 + ], + [ + 176.0, + 442.0 + ], + [ + 178.0, + 438.0 + ] + ], + "center_px": [ + 187.0, + 439.5 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 348.0, + 99.0 + ], + [ + 329.0, + 101.0 + ], + [ + 326.0, + 96.0 + ], + [ + 345.0, + 95.0 + ] + ], + "center_px": [ + 337.0, + 97.75 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 536.0, + 69.0 + ], + [ + 554.0, + 68.0 + ], + [ + 559.0, + 72.0 + ], + [ + 541.0, + 73.0 + ] + ], + "center_px": [ + 547.5, + 70.5 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 501.0, + 55.0 + ], + [ + 519.0, + 54.0 + ], + [ + 524.0, + 58.0 + ], + [ + 506.0, + 59.0 + ] + ], + "center_px": [ + 512.5, + 56.5 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 1012.0, + 267.0 + ], + [ + 1020.0, + 267.0 + ], + [ + 1032.0, + 275.0 + ], + [ + 1017.0, + 277.0 + ] + ], + "center_px": [ + 1020.25, + 271.5 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 194.0, + 96.0 + ], + [ + 174.0, + 98.0 + ], + [ + 173.0, + 93.0 + ], + [ + 192.0, + 92.0 + ] + ], + "center_px": [ + 183.25, + 94.75 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 318.0, + 85.0 + ], + [ + 338.0, + 84.0 + ], + [ + 340.0, + 88.0 + ], + [ + 321.0, + 89.0 + ] + ], + "center_px": [ + 329.25, + 86.5 + ], + "area_px": 80.5 + }, + { + "image_points_px": [ + [ + 655.0, + 210.0 + ], + [ + 635.0, + 213.0 + ], + [ + 632.0, + 210.0 + ], + [ + 653.0, + 208.0 + ] + ], + "center_px": [ + 643.75, + 210.25 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 915.0, + 60.0 + ], + [ + 932.0, + 59.0 + ], + [ + 938.0, + 63.0 + ], + [ + 923.0, + 64.0 + ] + ], + "center_px": [ + 927.0, + 61.5 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 912.0, + 59.0 + ], + [ + 895.0, + 60.0 + ], + [ + 889.0, + 56.0 + ], + [ + 904.0, + 55.0 + ] + ], + "center_px": [ + 900.0, + 57.5 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 923.0, + 53.0 + ], + [ + 940.0, + 52.0 + ], + [ + 946.0, + 56.0 + ], + [ + 931.0, + 57.0 + ] + ], + "center_px": [ + 935.0, + 54.5 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 364.0, + 91.0 + ], + [ + 345.0, + 93.0 + ], + [ + 342.0, + 89.0 + ], + [ + 361.0, + 87.0 + ] + ], + "center_px": [ + 353.0, + 90.0 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 485.0, + 80.0 + ], + [ + 503.0, + 79.0 + ], + [ + 507.0, + 83.0 + ], + [ + 489.0, + 85.0 + ] + ], + "center_px": [ + 496.0, + 81.75 + ], + "area_px": 87.0 + }, + { + "image_points_px": [ + [ + 931.0, + 46.0 + ], + [ + 947.0, + 45.0 + ], + [ + 954.0, + 49.0 + ], + [ + 939.0, + 50.0 + ] + ], + "center_px": [ + 942.75, + 47.5 + ], + "area_px": 69.5 + }, + { + "image_points_px": [ + [ + 358.0, + 81.0 + ], + [ + 377.0, + 80.0 + ], + [ + 380.0, + 84.0 + ], + [ + 361.0, + 85.0 + ] + ], + "center_px": [ + 369.0, + 82.5 + ], + "area_px": 79.0 + }, + { + "image_points_px": [ + [ + 311.0, + 74.0 + ], + [ + 330.0, + 73.0 + ], + [ + 333.0, + 77.0 + ], + [ + 314.0, + 78.0 + ] + ], + "center_px": [ + 322.0, + 75.5 + ], + "area_px": 79.0 + }, + { + "image_points_px": [ + [ + 350.0, + 70.0 + ], + [ + 369.0, + 69.0 + ], + [ + 372.0, + 73.0 + ], + [ + 353.0, + 74.0 + ] + ], + "center_px": [ + 361.0, + 71.5 + ], + "area_px": 79.0 + }, + { + "image_points_px": [ + [ + 63.0, + 93.0 + ], + [ + 63.0, + 97.0 + ], + [ + 43.0, + 98.0 + ], + [ + 43.0, + 94.0 + ] + ], + "center_px": [ + 53.0, + 95.5 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 196.0, + 97.0 + ], + [ + 215.0, + 96.0 + ], + [ + 217.0, + 100.0 + ], + [ + 198.0, + 102.0 + ] + ], + "center_px": [ + 206.5, + 98.75 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 212.0, + 89.0 + ], + [ + 193.0, + 90.0 + ], + [ + 191.0, + 86.0 + ], + [ + 210.0, + 84.0 + ] + ], + "center_px": [ + 201.5, + 87.25 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 255.0, + 85.0 + ], + [ + 274.0, + 84.0 + ], + [ + 276.0, + 88.0 + ], + [ + 257.0, + 90.0 + ] + ], + "center_px": [ + 265.5, + 86.75 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 235.0, + 92.0 + ], + [ + 216.0, + 94.0 + ], + [ + 214.0, + 89.0 + ], + [ + 233.0, + 88.0 + ] + ], + "center_px": [ + 224.5, + 90.75 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 905.0, + 43.0 + ], + [ + 922.0, + 42.0 + ], + [ + 928.0, + 46.0 + ], + [ + 911.0, + 46.0 + ] + ], + "center_px": [ + 916.5, + 44.25 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 446.0, + 84.0 + ], + [ + 464.0, + 83.0 + ], + [ + 468.0, + 87.0 + ], + [ + 451.0, + 89.0 + ] + ], + "center_px": [ + 457.25, + 85.75 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 482.0, + 80.0 + ], + [ + 464.0, + 81.0 + ], + [ + 460.0, + 77.0 + ], + [ + 477.0, + 75.0 + ] + ], + "center_px": [ + 470.75, + 78.25 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 404.0, + 87.0 + ], + [ + 385.0, + 89.0 + ], + [ + 382.0, + 85.0 + ], + [ + 400.0, + 83.0 + ] + ], + "center_px": [ + 392.75, + 86.0 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 152.0, + 100.0 + ], + [ + 132.0, + 102.0 + ], + [ + 131.0, + 98.0 + ], + [ + 150.0, + 96.0 + ] + ], + "center_px": [ + 141.25, + 99.0 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 988.0, + 45.0 + ], + [ + 971.0, + 46.0 + ], + [ + 965.0, + 43.0 + ], + [ + 979.0, + 41.0 + ] + ], + "center_px": [ + 975.75, + 43.75 + ], + "area_px": 65.5 + }, + { + "image_points_px": [ + [ + 403.0, + 59.0 + ], + [ + 422.0, + 58.0 + ], + [ + 425.0, + 62.0 + ], + [ + 407.0, + 63.0 + ] + ], + "center_px": [ + 414.25, + 60.5 + ], + "area_px": 77.5 + }, + { + "image_points_px": [ + [ + 168.0, + 82.0 + ], + [ + 187.0, + 81.0 + ], + [ + 189.0, + 85.0 + ], + [ + 169.0, + 86.0 + ] + ], + "center_px": [ + 178.25, + 83.5 + ], + "area_px": 79.5 + }, + { + "image_points_px": [ + [ + 377.0, + 637.0 + ], + [ + 360.0, + 642.0 + ], + [ + 354.0, + 641.0 + ], + [ + 374.0, + 636.0 + ] + ], + "center_px": [ + 366.25, + 639.0 + ], + "area_px": 41.0 + }, + { + "image_points_px": [ + [ + 434.0, + 72.0 + ], + [ + 416.0, + 74.0 + ], + [ + 412.0, + 70.0 + ], + [ + 430.0, + 68.0 + ] + ], + "center_px": [ + 423.0, + 71.0 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 880.0, + 40.0 + ], + [ + 897.0, + 39.0 + ], + [ + 903.0, + 42.0 + ], + [ + 886.0, + 43.0 + ] + ], + "center_px": [ + 891.5, + 41.0 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 450.0, + 66.0 + ], + [ + 469.0, + 65.0 + ], + [ + 472.0, + 69.0 + ], + [ + 455.0, + 70.0 + ] + ], + "center_px": [ + 461.5, + 67.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 475.0, + 69.0 + ], + [ + 492.0, + 68.0 + ], + [ + 497.0, + 72.0 + ], + [ + 478.0, + 73.0 + ] + ], + "center_px": [ + 485.5, + 70.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 293.0, + 81.0 + ], + [ + 274.0, + 82.0 + ], + [ + 272.0, + 78.0 + ], + [ + 290.0, + 76.0 + ] + ], + "center_px": [ + 282.25, + 79.25 + ], + "area_px": 87.0 + }, + { + "image_points_px": [ + [ + 499.0, + 73.0 + ], + [ + 517.0, + 72.0 + ], + [ + 521.0, + 76.0 + ], + [ + 503.0, + 77.0 + ] + ], + "center_px": [ + 510.0, + 74.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 436.0, + 73.0 + ], + [ + 454.0, + 72.0 + ], + [ + 458.0, + 76.0 + ], + [ + 440.0, + 77.0 + ] + ], + "center_px": [ + 447.0, + 74.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 488.0, + 62.0 + ], + [ + 506.0, + 61.0 + ], + [ + 510.0, + 65.0 + ], + [ + 492.0, + 66.0 + ] + ], + "center_px": [ + 499.0, + 63.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 523.0, + 76.0 + ], + [ + 541.0, + 75.0 + ], + [ + 545.0, + 79.0 + ], + [ + 527.0, + 80.0 + ] + ], + "center_px": [ + 534.0, + 77.5 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 169.0, + 88.0 + ], + [ + 170.0, + 93.0 + ], + [ + 151.0, + 94.0 + ], + [ + 150.0, + 90.0 + ] + ], + "center_px": [ + 160.0, + 91.25 + ], + "area_px": 87.0 + }, + { + "image_points_px": [ + [ + 954.0, + 27.0 + ], + [ + 970.0, + 26.0 + ], + [ + 977.0, + 29.0 + ], + [ + 961.0, + 30.0 + ] + ], + "center_px": [ + 965.5, + 28.0 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 896.0, + 27.0 + ], + [ + 912.0, + 26.0 + ], + [ + 919.0, + 29.0 + ], + [ + 903.0, + 30.0 + ] + ], + "center_px": [ + 907.5, + 28.0 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 871.0, + 24.0 + ], + [ + 887.0, + 23.0 + ], + [ + 894.0, + 26.0 + ], + [ + 878.0, + 27.0 + ] + ], + "center_px": [ + 882.5, + 25.0 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 997.0, + 435.0 + ], + [ + 1001.0, + 445.0 + ], + [ + 990.0, + 450.0 + ], + [ + 985.0, + 440.0 + ] + ], + "center_px": [ + 993.25, + 442.5 + ], + "area_px": 137.5 + }, + { + "image_points_px": [ + [ + 309.0, + 73.0 + ], + [ + 290.0, + 74.0 + ], + [ + 288.0, + 70.0 + ], + [ + 307.0, + 69.0 + ] + ], + "center_px": [ + 298.5, + 71.5 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 316.0, + 84.0 + ], + [ + 298.0, + 86.0 + ], + [ + 295.0, + 81.0 + ], + [ + 313.0, + 80.0 + ] + ], + "center_px": [ + 305.5, + 82.75 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 356.0, + 80.0 + ], + [ + 338.0, + 82.0 + ], + [ + 335.0, + 77.0 + ], + [ + 353.0, + 76.0 + ] + ], + "center_px": [ + 345.5, + 78.75 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 534.0, + 68.0 + ], + [ + 518.0, + 70.0 + ], + [ + 512.0, + 66.0 + ], + [ + 529.0, + 64.0 + ] + ], + "center_px": [ + 523.25, + 67.0 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 364.0, + 123.0 + ], + [ + 345.0, + 126.0 + ], + [ + 343.0, + 122.0 + ], + [ + 360.0, + 119.0 + ] + ], + "center_px": [ + 353.0, + 122.5 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 562.0, + 55.0 + ], + [ + 580.0, + 54.0 + ], + [ + 584.0, + 57.0 + ], + [ + 567.0, + 59.0 + ] + ], + "center_px": [ + 573.25, + 56.25 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 132.0, + 108.0 + ], + [ + 113.0, + 110.0 + ], + [ + 111.0, + 107.0 + ], + [ + 130.0, + 104.0 + ] + ], + "center_px": [ + 121.5, + 107.25 + ], + "area_px": 71.5 + }, + { + "image_points_px": [ + [ + 23.0, + 122.0 + ], + [ + 22.0, + 126.0 + ], + [ + 3.0, + 127.0 + ], + [ + 4.0, + 123.0 + ] + ], + "center_px": [ + 13.0, + 124.5 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 609.0, + 79.0 + ], + [ + 590.0, + 80.0 + ], + [ + 587.0, + 77.0 + ], + [ + 605.0, + 76.0 + ] + ], + "center_px": [ + 597.75, + 78.0 + ], + "area_px": 59.0 + }, + { + "image_points_px": [ + [ + 443.0, + 83.0 + ], + [ + 425.0, + 85.0 + ], + [ + 422.0, + 81.0 + ], + [ + 440.0, + 79.0 + ] + ], + "center_px": [ + 432.5, + 82.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 395.0, + 76.0 + ], + [ + 377.0, + 78.0 + ], + [ + 374.0, + 74.0 + ], + [ + 392.0, + 72.0 + ] + ], + "center_px": [ + 384.5, + 75.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 389.0, + 66.0 + ], + [ + 407.0, + 65.0 + ], + [ + 410.0, + 69.0 + ], + [ + 392.0, + 70.0 + ] + ], + "center_px": [ + 399.5, + 67.5 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 348.0, + 69.0 + ], + [ + 331.0, + 71.0 + ], + [ + 327.0, + 67.0 + ], + [ + 345.0, + 65.0 + ] + ], + "center_px": [ + 337.75, + 68.0 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 920.0, + 52.0 + ], + [ + 904.0, + 53.0 + ], + [ + 898.0, + 50.0 + ], + [ + 912.0, + 48.0 + ] + ], + "center_px": [ + 908.5, + 50.75 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 972.0, + 36.0 + ], + [ + 987.0, + 35.0 + ], + [ + 994.0, + 39.0 + ], + [ + 978.0, + 39.0 + ] + ], + "center_px": [ + 982.75, + 37.25 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 547.0, + 61.0 + ], + [ + 529.0, + 62.0 + ], + [ + 526.0, + 58.0 + ], + [ + 543.0, + 57.0 + ] + ], + "center_px": [ + 536.25, + 59.5 + ], + "area_px": 73.5 + }, + { + "image_points_px": [ + [ + 929.0, + 24.0 + ], + [ + 945.0, + 23.0 + ], + [ + 951.0, + 26.0 + ], + [ + 936.0, + 27.0 + ] + ], + "center_px": [ + 940.25, + 25.0 + ], + "area_px": 53.0 + }, + { + "image_points_px": [ + [ + 888.0, + 12.0 + ], + [ + 903.0, + 11.0 + ], + [ + 910.0, + 14.0 + ], + [ + 894.0, + 15.0 + ] + ], + "center_px": [ + 898.75, + 13.0 + ], + "area_px": 53.0 + }, + { + "image_points_px": [ + [ + 912.0, + 15.0 + ], + [ + 927.0, + 14.0 + ], + [ + 934.0, + 17.0 + ], + [ + 919.0, + 18.0 + ] + ], + "center_px": [ + 923.0, + 16.0 + ], + "area_px": 52.0 + }, + { + "image_points_px": [ + [ + 244.0, + 477.0 + ], + [ + 229.0, + 481.0 + ], + [ + 222.0, + 480.0 + ], + [ + 237.0, + 476.0 + ] + ], + "center_px": [ + 233.0, + 478.5 + ], + "area_px": 43.0 + }, + { + "image_points_px": [ + [ + 305.0, + 652.0 + ], + [ + 289.0, + 656.0 + ], + [ + 283.0, + 655.0 + ], + [ + 298.0, + 651.0 + ] + ], + "center_px": [ + 293.75, + 653.5 + ], + "area_px": 41.5 + }, + { + "image_points_px": [ + [ + 463.0, + 58.0 + ], + [ + 444.0, + 59.0 + ], + [ + 442.0, + 56.0 + ], + [ + 458.0, + 54.0 + ] + ], + "center_px": [ + 451.75, + 56.75 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 448.0, + 65.0 + ], + [ + 430.0, + 66.0 + ], + [ + 427.0, + 63.0 + ], + [ + 444.0, + 61.0 + ] + ], + "center_px": [ + 437.25, + 63.75 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 478.0, + 52.0 + ], + [ + 496.0, + 51.0 + ], + [ + 499.0, + 54.0 + ], + [ + 482.0, + 56.0 + ] + ], + "center_px": [ + 488.75, + 53.25 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 386.0, + 66.0 + ], + [ + 369.0, + 67.0 + ], + [ + 366.0, + 63.0 + ], + [ + 383.0, + 61.0 + ] + ], + "center_px": [ + 376.0, + 64.25 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 509.0, + 194.0 + ], + [ + 506.0, + 202.0 + ], + [ + 497.0, + 203.0 + ], + [ + 491.0, + 196.0 + ] + ], + "center_px": [ + 500.75, + 198.75 + ], + "area_px": 103.5 + }, + { + "image_points_px": [ + [ + 550.0, + 62.0 + ], + [ + 567.0, + 61.0 + ], + [ + 571.0, + 64.0 + ], + [ + 554.0, + 66.0 + ] + ], + "center_px": [ + 560.5, + 63.25 + ], + "area_px": 65.5 + }, + { + "image_points_px": [ + [ + 385.0, + 117.0 + ], + [ + 403.0, + 115.0 + ], + [ + 405.0, + 119.0 + ], + [ + 388.0, + 121.0 + ] + ], + "center_px": [ + 395.25, + 118.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 1053.0, + 113.0 + ], + [ + 1068.0, + 111.0 + ], + [ + 1074.0, + 115.0 + ], + [ + 1059.0, + 117.0 + ] + ], + "center_px": [ + 1063.5, + 114.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 574.0, + 48.0 + ], + [ + 592.0, + 47.0 + ], + [ + 595.0, + 50.0 + ], + [ + 580.0, + 52.0 + ] + ], + "center_px": [ + 585.25, + 49.25 + ], + "area_px": 64.5 + }, + { + "image_points_px": [ + [ + 678.0, + 37.0 + ], + [ + 661.0, + 38.0 + ], + [ + 657.0, + 35.0 + ], + [ + 673.0, + 33.0 + ] + ], + "center_px": [ + 667.25, + 35.75 + ], + "area_px": 64.5 + }, + { + "image_points_px": [ + [ + 712.0, + 33.0 + ], + [ + 696.0, + 35.0 + ], + [ + 691.0, + 31.0 + ], + [ + 707.0, + 30.0 + ] + ], + "center_px": [ + 701.5, + 32.25 + ], + "area_px": 63.5 + }, + { + "image_points_px": [ + [ + 505.0, + 125.0 + ], + [ + 522.0, + 123.0 + ], + [ + 525.0, + 127.0 + ], + [ + 508.0, + 129.0 + ] + ], + "center_px": [ + 515.0, + 126.0 + ], + "area_px": 74.0 + }, + { + "image_points_px": [ + [ + 447.0, + 114.0 + ], + [ + 430.0, + 117.0 + ], + [ + 427.0, + 113.0 + ], + [ + 443.0, + 110.0 + ] + ], + "center_px": [ + 436.75, + 113.5 + ], + "area_px": 76.5 + }, + { + "image_points_px": [ + [ + 725.0, + 28.0 + ], + [ + 741.0, + 27.0 + ], + [ + 746.0, + 30.0 + ], + [ + 728.0, + 31.0 + ] + ], + "center_px": [ + 735.0, + 29.0 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 551.0, + 45.0 + ], + [ + 568.0, + 44.0 + ], + [ + 572.0, + 47.0 + ], + [ + 555.0, + 48.0 + ] + ], + "center_px": [ + 561.5, + 46.0 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 401.0, + 109.0 + ], + [ + 419.0, + 107.0 + ], + [ + 421.0, + 110.0 + ], + [ + 404.0, + 113.0 + ] + ], + "center_px": [ + 411.25, + 109.75 + ], + "area_px": 67.5 + }, + { + "image_points_px": [ + [ + 376.0, + 105.0 + ], + [ + 394.0, + 103.0 + ], + [ + 396.0, + 106.0 + ], + [ + 379.0, + 109.0 + ] + ], + "center_px": [ + 386.25, + 105.75 + ], + "area_px": 67.5 + }, + { + "image_points_px": [ + [ + 157.0, + 518.0 + ], + [ + 147.0, + 522.0 + ], + [ + 136.0, + 522.0 + ], + [ + 138.0, + 520.0 + ] + ], + "center_px": [ + 144.5, + 520.5 + ], + "area_px": 39.0 + }, + { + "image_points_px": [ + [ + 905.0, + 21.0 + ], + [ + 920.0, + 20.0 + ], + [ + 926.0, + 23.0 + ], + [ + 911.0, + 24.0 + ] + ], + "center_px": [ + 915.5, + 22.0 + ], + "area_px": 51.0 + }, + { + "image_points_px": [ + [ + 127.0, + 87.0 + ], + [ + 145.0, + 85.0 + ], + [ + 147.0, + 88.0 + ], + [ + 129.0, + 90.0 + ] + ], + "center_px": [ + 137.0, + 87.5 + ], + "area_px": 58.0 + }, + { + "image_points_px": [ + [ + 937.0, + 18.0 + ], + [ + 952.0, + 17.0 + ], + [ + 958.0, + 20.0 + ], + [ + 944.0, + 21.0 + ] + ], + "center_px": [ + 947.75, + 19.0 + ], + "area_px": 50.0 + }, + { + "image_points_px": [ + [ + 920.0, + 9.0 + ], + [ + 934.0, + 8.0 + ], + [ + 941.0, + 11.0 + ], + [ + 926.0, + 12.0 + ] + ], + "center_px": [ + 930.25, + 10.0 + ], + "area_px": 50.0 + }, + { + "image_points_px": [ + [ + 87.0, + 384.0 + ], + [ + 82.0, + 387.0 + ], + [ + 66.0, + 387.0 + ], + [ + 74.0, + 384.0 + ] + ], + "center_px": [ + 77.25, + 385.5 + ], + "area_px": 43.5 + }, + { + "image_points_px": [ + [ + 392.0, + 97.0 + ], + [ + 409.0, + 95.0 + ], + [ + 412.0, + 98.0 + ], + [ + 396.0, + 101.0 + ] + ], + "center_px": [ + 402.25, + 97.75 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 452.0, + 94.0 + ], + [ + 435.0, + 96.0 + ], + [ + 432.0, + 93.0 + ], + [ + 448.0, + 90.0 + ] + ], + "center_px": [ + 441.75, + 93.25 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 758.0, + 25.0 + ], + [ + 774.0, + 24.0 + ], + [ + 779.0, + 26.0 + ], + [ + 764.0, + 28.0 + ] + ], + "center_px": [ + 768.75, + 25.75 + ], + "area_px": 47.0 + }, + { + "image_points_px": [ + [ + 607.0, + 43.0 + ], + [ + 591.0, + 45.0 + ], + [ + 587.0, + 41.0 + ], + [ + 603.0, + 40.0 + ] + ], + "center_px": [ + 597.0, + 42.25 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 995.0, + 105.0 + ], + [ + 1009.0, + 103.0 + ], + [ + 1015.0, + 107.0 + ], + [ + 1001.0, + 109.0 + ] + ], + "center_px": [ + 1005.0, + 106.0 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 86.0, + 93.0 + ], + [ + 87.0, + 90.0 + ], + [ + 105.0, + 90.0 + ], + [ + 104.0, + 93.0 + ] + ], + "center_px": [ + 95.5, + 91.5 + ], + "area_px": 54.0 + }, + { + "image_points_px": [ + [ + 877.0, + 17.0 + ], + [ + 862.0, + 18.0 + ], + [ + 857.0, + 15.0 + ], + [ + 871.0, + 14.0 + ] + ], + "center_px": [ + 866.75, + 16.0 + ], + "area_px": 49.0 + }, + { + "image_points_px": [ + [ + 53.0, + 376.0 + ], + [ + 46.0, + 379.0 + ], + [ + 33.0, + 379.0 + ], + [ + 40.0, + 376.0 + ] + ], + "center_px": [ + 43.0, + 377.5 + ], + "area_px": 39.0 + }, + { + "image_points_px": [ + [ + 322.0, + 370.0 + ], + [ + 323.0, + 382.0 + ], + [ + 317.0, + 383.0 + ], + [ + 312.0, + 371.0 + ] + ], + "center_px": [ + 318.5, + 376.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 1025.0, + 109.0 + ], + [ + 1038.0, + 107.0 + ], + [ + 1044.0, + 111.0 + ], + [ + 1030.0, + 113.0 + ] + ], + "center_px": [ + 1034.25, + 110.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 295.0, + 394.0 + ], + [ + 298.0, + 391.0 + ], + [ + 314.0, + 391.0 + ], + [ + 311.0, + 394.0 + ] + ], + "center_px": [ + 304.5, + 392.5 + ], + "area_px": 48.0 + }, + { + "image_points_px": [ + [ + 268.0, + 74.0 + ], + [ + 267.0, + 77.0 + ], + [ + 250.0, + 77.0 + ], + [ + 251.0, + 74.0 + ] + ], + "center_px": [ + 259.0, + 75.5 + ], + "area_px": 51.0 + }, + { + "image_points_px": [ + [ + 335.0, + 424.0 + ], + [ + 341.0, + 424.0 + ], + [ + 346.0, + 437.0 + ], + [ + 340.0, + 437.0 + ] + ], + "center_px": [ + 340.5, + 430.5 + ], + "area_px": 78.0 + } + ] +} \ No newline at end of file diff --git a/pipeline/2_Multiview_Trial/render_2b.png b/pipeline/2_Multiview_Trial/render_2b.png new file mode 100644 index 0000000..cbac9c4 Binary files /dev/null and b/pipeline/2_Multiview_Trial/render_2b.png differ diff --git a/pipeline/2_Multiview_Trial/render_2b_aruco_detection.json b/pipeline/2_Multiview_Trial/render_2b_aruco_detection.json new file mode 100644 index 0000000..cd6aecc --- /dev/null +++ b/pipeline/2_Multiview_Trial/render_2b_aruco_detection.json @@ -0,0 +1,22195 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-28T22:45:51Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2b.png", + "image_sha256": "fe994c75bae1a3b2027081a26d8ec2485698dba33584333b320c471c18010cdb", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 11, + "num_rejected_candidates": 862 + }, + "detections": [ + { + "observation_id": "b4cb8f7c-37ca-4094-9410-0807ae91d4ed", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 440.0, + 355.0 + ], + [ + 423.0, + 332.0 + ], + [ + 442.0, + 304.0 + ], + [ + 461.0, + 328.0 + ] + ], + "center_px": [ + 441.5, + 329.75 + ], + "quality": { + "area_px": 965.0, + "perimeter_px": 127.25426483154297, + "sharpness": { + "laplacian_var": 963.7451423324151 + }, + "contrast": { + "p05": 5.0, + "p95": 105.0, + "dynamic_range": 100.0, + "mean_gray": 30.30909090909091, + "std_gray": 38.91040496223432 + }, + "geometry": { + "distance_to_center_norm": 0.2734455466270447, + "distance_to_border_px": 304.0 + }, + "edge_ratio": 1.1959589471239185, + "edge_lengths_px": [ + 28.600698471069336, + 33.83784866333008, + 30.610456466674805, + 34.20526123046875 + ] + }, + "confidence": 0.5379225891327144 + }, + { + "observation_id": "9dc943be-b319-4800-a14d-794f3e34e650", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 371.0, + 451.0 + ], + [ + 355.0, + 429.0 + ], + [ + 373.0, + 403.0 + ], + [ + 389.0, + 426.0 + ] + ], + "center_px": [ + 372.0, + 427.25 + ], + "quality": { + "area_px": 813.0, + "perimeter_px": 117.64941215515137, + "sharpness": { + "laplacian_var": 1725.383748744125 + }, + "contrast": { + "p05": 6.0, + "p95": 103.0, + "dynamic_range": 97.0, + "mean_gray": 41.19929453262787, + "std_gray": 40.747263348619946 + }, + "geometry": { + "distance_to_center_norm": 0.3762875199317932, + "distance_to_border_px": 269.0 + }, + "edge_ratio": 1.162476328997763, + "edge_lengths_px": [ + 27.20294189453125, + 31.62277603149414, + 28.017850875854492, + 30.805843353271484 + ] + }, + "confidence": 0.46624605291299914 + }, + { + "observation_id": "d3a1ed81-c6b5-4449-9b90-40ecf5cf7907", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 550.0, + 245.0 + ], + [ + 541.0, + 217.0 + ], + [ + 565.0, + 214.0 + ], + [ + 575.0, + 243.0 + ] + ], + "center_px": [ + 557.75, + 229.75 + ], + "quality": { + "area_px": 722.0, + "perimeter_px": 109.35325241088867, + "sharpness": { + "laplacian_var": 3255.6417126981264 + }, + "contrast": { + "p05": 61.0, + "p95": 194.0, + "dynamic_range": 133.0, + "mean_gray": 109.87651821862349, + "std_gray": 57.40828749316114 + }, + "geometry": { + "distance_to_center_norm": 0.2097853124141693, + "distance_to_border_px": 214.0 + }, + "edge_ratio": 1.268285093213499, + "edge_lengths_px": [ + 29.4108829498291, + 24.1867733001709, + 30.675724029541016, + 25.079872131347656 + ] + }, + "confidence": 0.3795150916059117 + }, + { + "observation_id": "bdcd30b1-feee-48c2-a881-c2eb022c75b2", + "type": "aruco", + "marker_id": 247, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 446.0, + 265.0 + ], + [ + 429.0, + 245.0 + ], + [ + 457.0, + 242.0 + ], + [ + 474.0, + 262.0 + ] + ], + "center_px": [ + 451.5, + 253.5 + ], + "quality": { + "area_px": 611.0, + "perimeter_px": 108.81813049316406, + "sharpness": { + "laplacian_var": 5059.009879204021 + }, + "contrast": { + "p05": 20.0, + "p95": 185.0, + "dynamic_range": 165.0, + "mean_gray": 105.56769596199526, + "std_gray": 70.38741318638907 + }, + "geometry": { + "distance_to_center_norm": 0.29484474658966064, + "distance_to_border_px": 242.0 + }, + "edge_ratio": 1.0728202776121034, + "edge_lengths_px": [ + 26.248809814453125, + 28.160255432128906, + 26.248809814453125, + 28.160255432128906 + ] + }, + "confidence": 0.37968459567149576 + }, + { + "observation_id": "af1aad22-6ad6-455b-a130-b4ba219e5cae", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 516.0, + 533.0 + ], + [ + 501.0, + 513.0 + ], + [ + 526.0, + 500.0 + ], + [ + 541.0, + 520.0 + ] + ], + "center_px": [ + 521.0, + 516.5 + ], + "quality": { + "area_px": 695.0, + "perimeter_px": 106.35601043701172, + "sharpness": { + "laplacian_var": 4369.211595731346 + }, + "contrast": { + "p05": 20.0, + "p95": 178.0, + "dynamic_range": 158.0, + "mean_gray": 82.85239085239085, + "std_gray": 69.68379009778339 + }, + "geometry": { + "distance_to_center_norm": 0.26774296164512634, + "distance_to_border_px": 187.0 + }, + "edge_ratio": 1.1271202087402343, + "edge_lengths_px": [ + 25.0, + 28.17800521850586, + 25.0, + 28.17800521850586 + ] + }, + "confidence": 0.41107712357601517 + }, + { + "observation_id": "a343da63-49e4-41eb-b59c-e16e11b61e89", + "type": "aruco", + "marker_id": 246, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 421.0, + 234.0 + ], + [ + 404.0, + 214.0 + ], + [ + 431.0, + 212.0 + ], + [ + 448.0, + 231.0 + ] + ], + "center_px": [ + 426.0, + 222.75 + ], + "quality": { + "area_px": 569.0, + "perimeter_px": 105.98403549194336, + "sharpness": { + "laplacian_var": 4516.469387755102 + }, + "contrast": { + "p05": 17.0, + "p95": 184.0, + "dynamic_range": 167.0, + "mean_gray": 71.87755102040816, + "std_gray": 68.54289068452142 + }, + "geometry": { + "distance_to_center_norm": 0.34622156620025635, + "distance_to_border_px": 212.0 + }, + "edge_ratio": 1.0655442367769516, + "edge_lengths_px": [ + 26.248809814453125, + 27.073972702026367, + 25.495098114013672, + 27.166154861450195 + ] + }, + "confidence": 0.35599961056589946 + }, + { + "observation_id": "647e2651-a265-4ba6-84db-28d3e11822d8", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 656.0, + 233.0 + ], + [ + 647.0, + 206.0 + ], + [ + 669.0, + 204.0 + ], + [ + 678.0, + 231.0 + ] + ], + "center_px": [ + 662.5, + 218.5 + ], + "quality": { + "area_px": 612.0, + "perimeter_px": 101.1024398803711, + "sharpness": { + "laplacian_var": 4263.320071621976 + }, + "contrast": { + "p05": 59.0, + "p95": 195.0, + "dynamic_range": 136.0, + "mean_gray": 115.80841121495327, + "std_gray": 59.14362152112974 + }, + "geometry": { + "distance_to_center_norm": 0.19512085616588593, + "distance_to_border_px": 204.0 + }, + "edge_ratio": 1.2883462989664909, + "edge_lengths_px": [ + 28.460498809814453, + 22.090721130371094, + 28.460498809814453, + 22.090721130371094 + ] + }, + "confidence": 0.3166850406038321 + }, + { + "observation_id": "98f1ae7f-a028-4fff-8f7e-4b854f7f4555", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 501.0, + 307.0 + ], + [ + 483.0, + 287.0 + ], + [ + 504.0, + 292.0 + ], + [ + 522.0, + 312.0 + ] + ], + "center_px": [ + 502.5, + 299.5 + ], + "quality": { + "area_px": 330.0, + "perimeter_px": 96.98855972290039, + "sharpness": { + "laplacian_var": 4812.180202920881 + }, + "contrast": { + "p05": 41.0, + "p95": 188.0, + "dynamic_range": 147.0, + "mean_gray": 99.66396761133603, + "std_gray": 60.73814205297635 + }, + "geometry": { + "distance_to_center_norm": 0.20457716286182404, + "distance_to_border_px": 287.0 + }, + "edge_ratio": 1.246454220608877, + "edge_lengths_px": [ + 26.90724754333496, + 21.587032318115234, + 26.90724754333496, + 21.587032318115234 + ] + }, + "confidence": 0.17650066593904493 + }, + { + "observation_id": "638496c0-af5a-4abc-a7d5-ed307a563c02", + "type": "aruco", + "marker_id": 124, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 538.0, + 212.0 + ], + [ + 519.0, + 201.0 + ], + [ + 544.0, + 199.0 + ], + [ + 562.0, + 210.0 + ] + ], + "center_px": [ + 540.75, + 205.5 + ], + "quality": { + "area_px": 306.5, + "perimeter_px": 92.21258163452148, + "sharpness": { + "laplacian_var": 6205.9189333333325 + }, + "contrast": { + "p05": 21.0, + "p95": 174.0, + "dynamic_range": 153.0, + "mean_gray": 94.76, + "std_gray": 61.03612919137867 + }, + "geometry": { + "distance_to_center_norm": 0.25007718801498413, + "distance_to_border_px": 199.0 + }, + "edge_ratio": 1.1889000111845829, + "edge_lengths_px": [ + 21.954498291015625, + 25.079872131347656, + 21.095022201538086, + 24.083189010620117 + ] + }, + "confidence": 0.1718675510228501 + }, + { + "observation_id": "2cb36aab-2b87-40d1-b1a1-80834759cff6", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 292.0, + 239.0 + ], + [ + 281.0, + 224.0 + ], + [ + 304.0, + 214.0 + ], + [ + 315.0, + 229.0 + ] + ], + "center_px": [ + 298.0, + 226.5 + ], + "quality": { + "area_px": 455.0, + "perimeter_px": 87.36189651489258, + "sharpness": { + "laplacian_var": 5430.93808109255 + }, + "contrast": { + "p05": 10.0, + "p95": 162.0, + "dynamic_range": 152.0, + "mean_gray": 65.6832298136646, + "std_gray": 61.441475699661986 + }, + "geometry": { + "distance_to_center_norm": 0.4999745190143585, + "distance_to_border_px": 214.0 + }, + "edge_ratio": 1.3483022144164452, + "edge_lengths_px": [ + 18.601076126098633, + 25.079872131347656, + 18.601076126098633, + 25.079872131347656 + ] + }, + "confidence": 0.2249742899551776 + }, + { + "observation_id": "42ba0205-68be-437c-9662-57c9e90384bc", + "type": "aruco", + "marker_id": 205, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 245.0, + 177.0 + ], + [ + 234.0, + 163.0 + ], + [ + 257.0, + 154.0 + ], + [ + 268.0, + 167.0 + ] + ], + "center_px": [ + 251.0, + 165.25 + ], + "quality": { + "area_px": 415.0, + "perimeter_px": 84.61192893981934, + "sharpness": { + "laplacian_var": 6429.502369959987 + }, + "contrast": { + "p05": 11.0, + "p95": 161.0, + "dynamic_range": 150.0, + "mean_gray": 74.3859649122807, + "std_gray": 61.556237127785046 + }, + "geometry": { + "distance_to_center_norm": 0.592435896396637, + "distance_to_border_px": 154.0 + }, + "edge_ratio": 1.4727407884790649, + "edge_lengths_px": [ + 17.804492950439453, + 24.698177337646484, + 17.029386520385742, + 25.079872131347656 + ] + }, + "confidence": 0.18785835826030667 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 1236.0, + 683.0 + ], + [ + 1254.0, + 701.0 + ], + [ + 1237.0, + 713.0 + ], + [ + 1219.0, + 695.0 + ] + ], + "center_px": [ + 1236.5, + 698.0 + ], + "area_px": 522.0 + }, + { + "image_points_px": [ + [ + 95.0, + 683.0 + ], + [ + 104.0, + 701.0 + ], + [ + 81.0, + 713.0 + ], + [ + 72.0, + 695.0 + ] + ], + "center_px": [ + 88.0, + 698.0 + ], + "area_px": 522.0 + }, + { + "image_points_px": [ + [ + 61.0, + 677.0 + ], + [ + 70.0, + 695.0 + ], + [ + 47.0, + 707.0 + ], + [ + 38.0, + 689.0 + ] + ], + "center_px": [ + 54.0, + 692.0 + ], + "area_px": 522.0 + }, + { + "image_points_px": [ + [ + 27.0, + 671.0 + ], + [ + 36.0, + 689.0 + ], + [ + 13.0, + 701.0 + ], + [ + 4.0, + 683.0 + ] + ], + "center_px": [ + 20.0, + 686.0 + ], + "area_px": 522.0 + }, + { + "image_points_px": [ + [ + 210.0, + 670.0 + ], + [ + 221.0, + 687.0 + ], + [ + 199.0, + 700.0 + ], + [ + 188.0, + 682.0 + ] + ], + "center_px": [ + 204.5, + 684.75 + ], + "area_px": 522.5 + }, + { + "image_points_px": [ + [ + 1016.0, + 678.0 + ], + [ + 1032.0, + 696.0 + ], + [ + 1013.0, + 707.0 + ], + [ + 997.0, + 690.0 + ] + ], + "center_px": [ + 1014.5, + 692.75 + ], + "area_px": 516.5 + }, + { + "image_points_px": [ + [ + 1053.0, + 685.0 + ], + [ + 1069.0, + 702.0 + ], + [ + 1051.0, + 714.0 + ], + [ + 1034.0, + 696.0 + ] + ], + "center_px": [ + 1051.75, + 699.25 + ], + "area_px": 513.5 + }, + { + "image_points_px": [ + [ + 979.0, + 672.0 + ], + [ + 995.0, + 690.0 + ], + [ + 977.0, + 702.0 + ], + [ + 961.0, + 684.0 + ] + ], + "center_px": [ + 978.0, + 687.0 + ], + "area_px": 516.0 + }, + { + "image_points_px": [ + [ + 280.0, + 683.0 + ], + [ + 290.0, + 700.0 + ], + [ + 268.0, + 712.0 + ], + [ + 257.0, + 694.0 + ] + ], + "center_px": [ + 273.75, + 697.25 + ], + "area_px": 514.5 + }, + { + "image_points_px": [ + [ + 176.0, + 664.0 + ], + [ + 186.0, + 682.0 + ], + [ + 164.0, + 694.0 + ], + [ + 154.0, + 676.0 + ] + ], + "center_px": [ + 170.0, + 679.0 + ], + "area_px": 516.0 + }, + { + "image_points_px": [ + [ + 1199.0, + 677.0 + ], + [ + 1217.0, + 695.0 + ], + [ + 1201.0, + 706.0 + ], + [ + 1182.0, + 689.0 + ] + ], + "center_px": [ + 1199.75, + 691.75 + ], + "area_px": 501.5 + }, + { + "image_points_px": [ + [ + 75.0, + 646.0 + ], + [ + 84.0, + 664.0 + ], + [ + 61.0, + 675.0 + ], + [ + 52.0, + 658.0 + ] + ], + "center_px": [ + 68.0, + 660.75 + ], + "area_px": 506.0 + }, + { + "image_points_px": [ + [ + 869.0, + 686.0 + ], + [ + 883.0, + 703.0 + ], + [ + 864.0, + 715.0 + ], + [ + 849.0, + 697.0 + ] + ], + "center_px": [ + 866.25, + 700.25 + ], + "area_px": 508.0 + }, + { + "image_points_px": [ + [ + 725.0, + 661.0 + ], + [ + 739.0, + 678.0 + ], + [ + 719.0, + 690.0 + ], + [ + 705.0, + 673.0 + ] + ], + "center_px": [ + 722.0, + 675.5 + ], + "area_px": 508.0 + }, + { + "image_points_px": [ + [ + 831.0, + 679.0 + ], + [ + 846.0, + 697.0 + ], + [ + 827.0, + 708.0 + ], + [ + 812.0, + 691.0 + ] + ], + "center_px": [ + 829.0, + 693.75 + ], + "area_px": 505.0 + }, + { + "image_points_px": [ + [ + 142.0, + 658.0 + ], + [ + 152.0, + 676.0 + ], + [ + 129.0, + 687.0 + ], + [ + 120.0, + 670.0 + ] + ], + "center_px": [ + 135.75, + 672.75 + ], + "area_px": 503.0 + }, + { + "image_points_px": [ + [ + 1199.0, + 646.0 + ], + [ + 1216.0, + 664.0 + ], + [ + 1199.0, + 675.0 + ], + [ + 1182.0, + 657.0 + ] + ], + "center_px": [ + 1199.0, + 660.5 + ], + "area_px": 493.0 + }, + { + "image_points_px": [ + [ + 1089.0, + 659.0 + ], + [ + 1106.0, + 677.0 + ], + [ + 1088.0, + 688.0 + ], + [ + 1072.0, + 671.0 + ] + ], + "center_px": [ + 1088.75, + 673.75 + ], + "area_px": 496.0 + }, + { + "image_points_px": [ + [ + 1126.0, + 665.0 + ], + [ + 1143.0, + 682.0 + ], + [ + 1125.0, + 694.0 + ], + [ + 1109.0, + 676.0 + ] + ], + "center_px": [ + 1125.75, + 679.25 + ], + "area_px": 496.0 + }, + { + "image_points_px": [ + [ + 1053.0, + 653.0 + ], + [ + 1070.0, + 670.0 + ], + [ + 1052.0, + 682.0 + ], + [ + 1036.0, + 664.0 + ] + ], + "center_px": [ + 1052.75, + 667.25 + ], + "area_px": 496.0 + }, + { + "image_points_px": [ + [ + 245.0, + 676.0 + ], + [ + 255.0, + 694.0 + ], + [ + 233.0, + 705.0 + ], + [ + 223.0, + 688.0 + ] + ], + "center_px": [ + 239.0, + 690.75 + ], + "area_px": 500.0 + }, + { + "image_points_px": [ + [ + 42.0, + 641.0 + ], + [ + 50.0, + 658.0 + ], + [ + 27.0, + 669.0 + ], + [ + 18.0, + 652.0 + ] + ], + "center_px": [ + 34.25, + 655.0 + ], + "area_px": 493.0 + }, + { + "image_points_px": [ + [ + 797.0, + 674.0 + ], + [ + 810.0, + 691.0 + ], + [ + 791.0, + 703.0 + ], + [ + 777.0, + 684.0 + ] + ], + "center_px": [ + 793.75, + 688.0 + ], + "area_px": 499.5 + }, + { + "image_points_px": [ + [ + 1161.0, + 641.0 + ], + [ + 1180.0, + 657.0 + ], + [ + 1163.0, + 669.0 + ], + [ + 1145.0, + 652.0 + ] + ], + "center_px": [ + 1162.25, + 654.75 + ], + "area_px": 485.0 + }, + { + "image_points_px": [ + [ + 1162.0, + 671.0 + ], + [ + 1179.0, + 688.0 + ], + [ + 1164.0, + 700.0 + ], + [ + 1145.0, + 683.0 + ] + ], + "center_px": [ + 1162.5, + 685.5 + ], + "area_px": 488.0 + }, + { + "image_points_px": [ + [ + 1235.0, + 652.0 + ], + [ + 1253.0, + 669.0 + ], + [ + 1236.0, + 681.0 + ], + [ + 1219.0, + 665.0 + ] + ], + "center_px": [ + 1235.75, + 666.75 + ], + "area_px": 491.0 + }, + { + "image_points_px": [ + [ + 590.0, + 195.0 + ], + [ + 614.0, + 193.0 + ], + [ + 632.0, + 203.0 + ], + [ + 607.0, + 205.0 + ] + ], + "center_px": [ + 610.75, + 199.0 + ], + "area_px": 280.0 + }, + { + "image_points_px": [ + [ + 109.0, + 653.0 + ], + [ + 118.0, + 670.0 + ], + [ + 95.0, + 681.0 + ], + [ + 86.0, + 664.0 + ] + ], + "center_px": [ + 102.0, + 667.0 + ], + "area_px": 490.0 + }, + { + "image_points_px": [ + [ + 760.0, + 667.0 + ], + [ + 774.0, + 685.0 + ], + [ + 755.0, + 696.0 + ], + [ + 741.0, + 679.0 + ] + ], + "center_px": [ + 757.5, + 681.75 + ], + "area_px": 493.5 + }, + { + "image_points_px": [ + [ + 836.0, + 649.0 + ], + [ + 851.0, + 666.0 + ], + [ + 832.0, + 677.0 + ], + [ + 817.0, + 660.0 + ] + ], + "center_px": [ + 834.0, + 663.0 + ], + "area_px": 488.0 + }, + { + "image_points_px": [ + [ + 911.0, + 630.0 + ], + [ + 926.0, + 647.0 + ], + [ + 907.0, + 658.0 + ], + [ + 892.0, + 641.0 + ] + ], + "center_px": [ + 909.0, + 644.0 + ], + "area_px": 488.0 + }, + { + "image_points_px": [ + [ + 907.0, + 660.0 + ], + [ + 922.0, + 678.0 + ], + [ + 904.0, + 689.0 + ], + [ + 889.0, + 671.0 + ] + ], + "center_px": [ + 905.5, + 674.5 + ], + "area_px": 489.0 + }, + { + "image_points_px": [ + [ + 943.0, + 666.0 + ], + [ + 958.0, + 684.0 + ], + [ + 940.0, + 695.0 + ], + [ + 925.0, + 677.0 + ] + ], + "center_px": [ + 941.5, + 680.5 + ], + "area_px": 489.0 + }, + { + "image_points_px": [ + [ + 122.0, + 622.0 + ], + [ + 131.0, + 639.0 + ], + [ + 109.0, + 651.0 + ], + [ + 100.0, + 633.0 + ] + ], + "center_px": [ + 115.5, + 636.25 + ], + "area_px": 488.5 + }, + { + "image_points_px": [ + [ + 1055.0, + 623.0 + ], + [ + 1071.0, + 640.0 + ], + [ + 1053.0, + 651.0 + ], + [ + 1037.0, + 634.0 + ] + ], + "center_px": [ + 1054.0, + 637.0 + ], + "area_px": 482.0 + }, + { + "image_points_px": [ + [ + 1091.0, + 629.0 + ], + [ + 1107.0, + 646.0 + ], + [ + 1089.0, + 657.0 + ], + [ + 1073.0, + 640.0 + ] + ], + "center_px": [ + 1090.0, + 643.0 + ], + "area_px": 482.0 + }, + { + "image_points_px": [ + [ + 871.0, + 654.0 + ], + [ + 886.0, + 672.0 + ], + [ + 868.0, + 683.0 + ], + [ + 853.0, + 666.0 + ] + ], + "center_px": [ + 869.5, + 668.75 + ], + "area_px": 487.5 + }, + { + "image_points_px": [ + [ + 1127.0, + 635.0 + ], + [ + 1143.0, + 652.0 + ], + [ + 1126.0, + 663.0 + ], + [ + 1109.0, + 646.0 + ] + ], + "center_px": [ + 1126.25, + 649.0 + ], + "area_px": 479.0 + }, + { + "image_points_px": [ + [ + 257.0, + 646.0 + ], + [ + 267.0, + 663.0 + ], + [ + 245.0, + 674.0 + ], + [ + 235.0, + 657.0 + ] + ], + "center_px": [ + 251.0, + 660.0 + ], + "area_px": 484.0 + }, + { + "image_points_px": [ + [ + 155.0, + 628.0 + ], + [ + 165.0, + 645.0 + ], + [ + 142.0, + 656.0 + ], + [ + 133.0, + 640.0 + ] + ], + "center_px": [ + 148.75, + 642.25 + ], + "area_px": 480.5 + }, + { + "image_points_px": [ + [ + 690.0, + 656.0 + ], + [ + 703.0, + 673.0 + ], + [ + 683.0, + 684.0 + ], + [ + 670.0, + 667.0 + ] + ], + "center_px": [ + 686.5, + 670.0 + ], + "area_px": 483.0 + }, + { + "image_points_px": [ + [ + 696.0, + 625.0 + ], + [ + 709.0, + 642.0 + ], + [ + 689.0, + 653.0 + ], + [ + 676.0, + 636.0 + ] + ], + "center_px": [ + 692.5, + 639.0 + ], + "area_px": 483.0 + }, + { + "image_points_px": [ + [ + 1234.0, + 622.0 + ], + [ + 1252.0, + 639.0 + ], + [ + 1236.0, + 650.0 + ], + [ + 1218.0, + 634.0 + ] + ], + "center_px": [ + 1235.0, + 636.25 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 235.0, + 610.0 + ], + [ + 245.0, + 626.0 + ], + [ + 223.0, + 638.0 + ], + [ + 213.0, + 621.0 + ] + ], + "center_px": [ + 229.0, + 623.75 + ], + "area_px": 478.0 + }, + { + "image_points_px": [ + [ + 766.0, + 637.0 + ], + [ + 779.0, + 654.0 + ], + [ + 760.0, + 665.0 + ], + [ + 746.0, + 648.0 + ] + ], + "center_px": [ + 762.75, + 651.0 + ], + "area_px": 480.0 + }, + { + "image_points_px": [ + [ + 56.0, + 611.0 + ], + [ + 64.0, + 628.0 + ], + [ + 42.0, + 639.0 + ], + [ + 33.0, + 622.0 + ] + ], + "center_px": [ + 48.75, + 625.0 + ], + "area_px": 476.0 + }, + { + "image_points_px": [ + [ + 730.0, + 631.0 + ], + [ + 744.0, + 648.0 + ], + [ + 725.0, + 659.0 + ], + [ + 711.0, + 642.0 + ] + ], + "center_px": [ + 727.5, + 645.0 + ], + "area_px": 477.0 + }, + { + "image_points_px": [ + [ + 801.0, + 643.0 + ], + [ + 815.0, + 660.0 + ], + [ + 796.0, + 671.0 + ], + [ + 782.0, + 654.0 + ] + ], + "center_px": [ + 798.5, + 657.0 + ], + "area_px": 477.0 + }, + { + "image_points_px": [ + [ + 985.0, + 612.0 + ], + [ + 1000.0, + 628.0 + ], + [ + 981.0, + 639.0 + ], + [ + 966.0, + 623.0 + ] + ], + "center_px": [ + 983.0, + 625.5 + ], + "area_px": 469.0 + }, + { + "image_points_px": [ + [ + 947.0, + 636.0 + ], + [ + 961.0, + 653.0 + ], + [ + 943.0, + 664.0 + ], + [ + 928.0, + 647.0 + ] + ], + "center_px": [ + 944.75, + 650.0 + ], + "area_px": 474.0 + }, + { + "image_points_px": [ + [ + 875.0, + 624.0 + ], + [ + 890.0, + 641.0 + ], + [ + 871.0, + 652.0 + ], + [ + 857.0, + 635.0 + ] + ], + "center_px": [ + 873.25, + 638.0 + ], + "area_px": 474.0 + }, + { + "image_points_px": [ + [ + 840.0, + 618.0 + ], + [ + 855.0, + 635.0 + ], + [ + 836.0, + 646.0 + ], + [ + 822.0, + 629.0 + ] + ], + "center_px": [ + 838.25, + 632.0 + ], + "area_px": 474.0 + }, + { + "image_points_px": [ + [ + 89.0, + 617.0 + ], + [ + 98.0, + 633.0 + ], + [ + 75.0, + 644.0 + ], + [ + 66.0, + 628.0 + ] + ], + "center_px": [ + 82.0, + 630.5 + ], + "area_px": 467.0 + }, + { + "image_points_px": [ + [ + 1018.0, + 648.0 + ], + [ + 1033.0, + 665.0 + ], + [ + 1016.0, + 676.0 + ], + [ + 1000.0, + 658.0 + ] + ], + "center_px": [ + 1016.75, + 661.75 + ], + "area_px": 469.0 + }, + { + "image_points_px": [ + [ + 982.0, + 642.0 + ], + [ + 997.0, + 659.0 + ], + [ + 979.0, + 670.0 + ], + [ + 964.0, + 653.0 + ] + ], + "center_px": [ + 980.5, + 656.0 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 914.0, + 600.0 + ], + [ + 929.0, + 617.0 + ], + [ + 911.0, + 628.0 + ], + [ + 896.0, + 611.0 + ] + ], + "center_px": [ + 912.5, + 614.0 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 949.0, + 606.0 + ], + [ + 964.0, + 623.0 + ], + [ + 946.0, + 634.0 + ], + [ + 931.0, + 617.0 + ] + ], + "center_px": [ + 947.5, + 620.0 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 558.0, + 602.0 + ], + [ + 570.0, + 619.0 + ], + [ + 550.0, + 630.0 + ], + [ + 538.0, + 613.0 + ] + ], + "center_px": [ + 554.0, + 616.0 + ], + "area_px": 472.0 + }, + { + "image_points_px": [ + [ + 585.0, + 638.0 + ], + [ + 597.0, + 655.0 + ], + [ + 577.0, + 666.0 + ], + [ + 565.0, + 649.0 + ] + ], + "center_px": [ + 581.0, + 652.0 + ], + "area_px": 472.0 + }, + { + "image_points_px": [ + [ + 201.0, + 604.0 + ], + [ + 211.0, + 621.0 + ], + [ + 189.0, + 632.0 + ], + [ + 180.0, + 615.0 + ] + ], + "center_px": [ + 195.25, + 618.0 + ], + "area_px": 470.0 + }, + { + "image_points_px": [ + [ + 1092.0, + 599.0 + ], + [ + 1108.0, + 616.0 + ], + [ + 1091.0, + 627.0 + ], + [ + 1075.0, + 610.0 + ] + ], + "center_px": [ + 1091.5, + 613.0 + ], + "area_px": 465.0 + }, + { + "image_points_px": [ + [ + 1197.0, + 617.0 + ], + [ + 1216.0, + 633.0 + ], + [ + 1199.0, + 644.0 + ], + [ + 1182.0, + 628.0 + ] + ], + "center_px": [ + 1198.5, + 630.5 + ], + "area_px": 454.0 + }, + { + "image_points_px": [ + [ + 1233.0, + 593.0 + ], + [ + 1251.0, + 609.0 + ], + [ + 1235.0, + 620.0 + ], + [ + 1217.0, + 604.0 + ] + ], + "center_px": [ + 1234.0, + 606.5 + ], + "area_px": 454.0 + }, + { + "image_points_px": [ + [ + 806.0, + 613.0 + ], + [ + 820.0, + 629.0 + ], + [ + 800.0, + 640.0 + ], + [ + 787.0, + 623.0 + ] + ], + "center_px": [ + 803.25, + 626.25 + ], + "area_px": 463.5 + }, + { + "image_points_px": [ + [ + 661.0, + 620.0 + ], + [ + 674.0, + 636.0 + ], + [ + 654.0, + 647.0 + ], + [ + 641.0, + 631.0 + ] + ], + "center_px": [ + 657.5, + 633.5 + ], + "area_px": 463.0 + }, + { + "image_points_px": [ + [ + 168.0, + 598.0 + ], + [ + 177.0, + 615.0 + ], + [ + 156.0, + 626.0 + ], + [ + 146.0, + 610.0 + ] + ], + "center_px": [ + 161.75, + 612.25 + ], + "area_px": 464.0 + }, + { + "image_points_px": [ + [ + 1126.0, + 605.0 + ], + [ + 1143.0, + 621.0 + ], + [ + 1127.0, + 633.0 + ], + [ + 1110.0, + 616.0 + ] + ], + "center_px": [ + 1126.5, + 618.75 + ], + "area_px": 459.5 + }, + { + "image_points_px": [ + [ + 879.0, + 595.0 + ], + [ + 894.0, + 611.0 + ], + [ + 875.0, + 622.0 + ], + [ + 861.0, + 605.0 + ] + ], + "center_px": [ + 877.25, + 608.25 + ], + "area_px": 457.5 + }, + { + "image_points_px": [ + [ + 771.0, + 607.0 + ], + [ + 784.0, + 624.0 + ], + [ + 766.0, + 635.0 + ], + [ + 752.0, + 618.0 + ] + ], + "center_px": [ + 768.25, + 621.0 + ], + "area_px": 463.0 + }, + { + "image_points_px": [ + [ + 736.0, + 601.0 + ], + [ + 749.0, + 618.0 + ], + [ + 731.0, + 629.0 + ], + [ + 717.0, + 612.0 + ] + ], + "center_px": [ + 733.25, + 615.0 + ], + "area_px": 463.0 + }, + { + "image_points_px": [ + [ + 70.0, + 582.0 + ], + [ + 78.0, + 598.0 + ], + [ + 56.0, + 609.0 + ], + [ + 47.0, + 593.0 + ] + ], + "center_px": [ + 62.75, + 595.5 + ], + "area_px": 453.5 + }, + { + "image_points_px": [ + [ + 37.0, + 576.0 + ], + [ + 45.0, + 592.0 + ], + [ + 23.0, + 603.0 + ], + [ + 14.0, + 587.0 + ] + ], + "center_px": [ + 29.75, + 589.5 + ], + "area_px": 453.5 + }, + { + "image_points_px": [ + [ + 1020.0, + 618.0 + ], + [ + 1035.0, + 634.0 + ], + [ + 1017.0, + 645.0 + ], + [ + 1002.0, + 628.0 + ] + ], + "center_px": [ + 1018.5, + 631.25 + ], + "area_px": 454.5 + }, + { + "image_points_px": [ + [ + 952.0, + 577.0 + ], + [ + 967.0, + 593.0 + ], + [ + 949.0, + 604.0 + ], + [ + 934.0, + 587.0 + ] + ], + "center_px": [ + 950.5, + 590.25 + ], + "area_px": 454.5 + }, + { + "image_points_px": [ + [ + 844.0, + 589.0 + ], + [ + 859.0, + 605.0 + ], + [ + 840.0, + 616.0 + ], + [ + 826.0, + 600.0 + ] + ], + "center_px": [ + 842.25, + 602.5 + ], + "area_px": 455.5 + }, + { + "image_points_px": [ + [ + 986.0, + 582.0 + ], + [ + 1002.0, + 599.0 + ], + [ + 984.0, + 609.0 + ], + [ + 969.0, + 593.0 + ] + ], + "center_px": [ + 985.25, + 595.75 + ], + "area_px": 451.5 + }, + { + "image_points_px": [ + [ + 1022.0, + 588.0 + ], + [ + 1037.0, + 604.0 + ], + [ + 1019.0, + 615.0 + ], + [ + 1004.0, + 599.0 + ] + ], + "center_px": [ + 1020.5, + 601.5 + ], + "area_px": 453.0 + }, + { + "image_points_px": [ + [ + 1128.0, + 576.0 + ], + [ + 1144.0, + 592.0 + ], + [ + 1127.0, + 603.0 + ], + [ + 1111.0, + 586.0 + ] + ], + "center_px": [ + 1127.5, + 589.25 + ], + "area_px": 448.5 + }, + { + "image_points_px": [ + [ + 148.0, + 564.0 + ], + [ + 157.0, + 580.0 + ], + [ + 135.0, + 591.0 + ], + [ + 126.0, + 575.0 + ] + ], + "center_px": [ + 141.5, + 577.5 + ], + "area_px": 451.0 + }, + { + "image_points_px": [ + [ + 83.0, + 553.0 + ], + [ + 92.0, + 569.0 + ], + [ + 70.0, + 580.0 + ], + [ + 61.0, + 564.0 + ] + ], + "center_px": [ + 76.5, + 566.5 + ], + "area_px": 451.0 + }, + { + "image_points_px": [ + [ + 135.0, + 593.0 + ], + [ + 144.0, + 609.0 + ], + [ + 122.0, + 620.0 + ], + [ + 113.0, + 604.0 + ] + ], + "center_px": [ + 128.5, + 606.5 + ], + "area_px": 451.0 + }, + { + "image_points_px": [ + [ + 102.0, + 587.0 + ], + [ + 111.0, + 603.0 + ], + [ + 89.0, + 614.0 + ], + [ + 80.0, + 598.0 + ] + ], + "center_px": [ + 95.5, + 600.5 + ], + "area_px": 451.0 + }, + { + "image_points_px": [ + [ + 1057.0, + 594.0 + ], + [ + 1072.0, + 610.0 + ], + [ + 1055.0, + 621.0 + ], + [ + 1039.0, + 605.0 + ] + ], + "center_px": [ + 1055.75, + 607.5 + ], + "area_px": 450.5 + }, + { + "image_points_px": [ + [ + 1162.0, + 582.0 + ], + [ + 1180.0, + 598.0 + ], + [ + 1164.0, + 608.0 + ], + [ + 1146.0, + 592.0 + ] + ], + "center_px": [ + 1163.0, + 595.0 + ], + "area_px": 436.0 + }, + { + "image_points_px": [ + [ + 633.0, + 584.0 + ], + [ + 646.0, + 601.0 + ], + [ + 626.0, + 611.0 + ], + [ + 614.0, + 595.0 + ] + ], + "center_px": [ + 629.75, + 597.75 + ], + "area_px": 453.0 + }, + { + "image_points_px": [ + [ + 213.0, + 575.0 + ], + [ + 223.0, + 591.0 + ], + [ + 201.0, + 602.0 + ], + [ + 192.0, + 586.0 + ] + ], + "center_px": [ + 207.25, + 588.5 + ], + "area_px": 448.5 + }, + { + "image_points_px": [ + [ + 810.0, + 584.0 + ], + [ + 824.0, + 600.0 + ], + [ + 805.0, + 610.0 + ], + [ + 791.0, + 594.0 + ] + ], + "center_px": [ + 807.5, + 597.0 + ], + "area_px": 444.0 + }, + { + "image_points_px": [ + [ + 1198.0, + 587.0 + ], + [ + 1215.0, + 603.0 + ], + [ + 1200.0, + 614.0 + ], + [ + 1182.0, + 598.0 + ] + ], + "center_px": [ + 1198.75, + 600.5 + ], + "area_px": 440.5 + }, + { + "image_points_px": [ + [ + 1162.0, + 611.0 + ], + [ + 1179.0, + 627.0 + ], + [ + 1164.0, + 638.0 + ], + [ + 1146.0, + 622.0 + ] + ], + "center_px": [ + 1162.75, + 624.5 + ], + "area_px": 440.5 + }, + { + "image_points_px": [ + [ + 702.0, + 596.0 + ], + [ + 715.0, + 612.0 + ], + [ + 696.0, + 623.0 + ], + [ + 683.0, + 606.0 + ] + ], + "center_px": [ + 699.0, + 609.25 + ], + "area_px": 450.0 + }, + { + "image_points_px": [ + [ + 667.0, + 590.0 + ], + [ + 680.0, + 607.0 + ], + [ + 661.0, + 617.0 + ], + [ + 648.0, + 601.0 + ] + ], + "center_px": [ + 664.0, + 603.75 + ], + "area_px": 450.0 + }, + { + "image_points_px": [ + [ + 849.0, + 561.0 + ], + [ + 863.0, + 576.0 + ], + [ + 844.0, + 587.0 + ], + [ + 830.0, + 571.0 + ] + ], + "center_px": [ + 846.5, + 573.75 + ], + "area_px": 441.5 + }, + { + "image_points_px": [ + [ + 192.0, + 541.0 + ], + [ + 202.0, + 557.0 + ], + [ + 181.0, + 568.0 + ], + [ + 171.0, + 552.0 + ] + ], + "center_px": [ + 186.5, + 554.5 + ], + "area_px": 446.0 + }, + { + "image_points_px": [ + [ + 918.0, + 572.0 + ], + [ + 932.0, + 587.0 + ], + [ + 914.0, + 598.0 + ], + [ + 899.0, + 582.0 + ] + ], + "center_px": [ + 915.75, + 584.75 + ], + "area_px": 439.0 + }, + { + "image_points_px": [ + [ + 741.0, + 572.0 + ], + [ + 755.0, + 588.0 + ], + [ + 736.0, + 599.0 + ], + [ + 723.0, + 583.0 + ] + ], + "center_px": [ + 738.75, + 585.5 + ], + "area_px": 444.5 + }, + { + "image_points_px": [ + [ + 1024.0, + 560.0 + ], + [ + 1039.0, + 575.0 + ], + [ + 1021.0, + 586.0 + ], + [ + 1006.0, + 570.0 + ] + ], + "center_px": [ + 1022.5, + 572.75 + ], + "area_px": 436.5 + }, + { + "image_points_px": [ + [ + 775.0, + 578.0 + ], + [ + 789.0, + 594.0 + ], + [ + 771.0, + 605.0 + ], + [ + 757.0, + 589.0 + ] + ], + "center_px": [ + 773.0, + 591.5 + ], + "area_px": 442.0 + }, + { + "image_points_px": [ + [ + 180.0, + 570.0 + ], + [ + 190.0, + 586.0 + ], + [ + 168.0, + 596.0 + ], + [ + 159.0, + 580.0 + ] + ], + "center_px": [ + 174.25, + 583.0 + ], + "area_px": 439.0 + }, + { + "image_points_px": [ + [ + 1059.0, + 537.0 + ], + [ + 1075.0, + 552.0 + ], + [ + 1058.0, + 563.0 + ], + [ + 1042.0, + 547.0 + ] + ], + "center_px": [ + 1058.5, + 549.75 + ], + "area_px": 431.5 + }, + { + "image_points_px": [ + [ + 1232.0, + 536.0 + ], + [ + 1249.0, + 551.0 + ], + [ + 1233.0, + 562.0 + ], + [ + 1216.0, + 546.0 + ] + ], + "center_px": [ + 1232.5, + 548.75 + ], + "area_px": 426.5 + }, + { + "image_points_px": [ + [ + 1163.0, + 553.0 + ], + [ + 1179.0, + 569.0 + ], + [ + 1163.0, + 580.0 + ], + [ + 1147.0, + 563.0 + ] + ], + "center_px": [ + 1163.0, + 566.25 + ], + "area_px": 432.0 + }, + { + "image_points_px": [ + [ + 707.0, + 567.0 + ], + [ + 721.0, + 583.0 + ], + [ + 701.0, + 593.0 + ], + [ + 689.0, + 577.0 + ] + ], + "center_px": [ + 704.5, + 580.0 + ], + "area_px": 434.0 + }, + { + "image_points_px": [ + [ + 646.0, + 528.0 + ], + [ + 659.0, + 544.0 + ], + [ + 640.0, + 554.0 + ], + [ + 627.0, + 538.0 + ] + ], + "center_px": [ + 643.0, + 541.0 + ], + "area_px": 434.0 + }, + { + "image_points_px": [ + [ + 1232.0, + 564.0 + ], + [ + 1250.0, + 580.0 + ], + [ + 1235.0, + 590.0 + ], + [ + 1217.0, + 575.0 + ] + ], + "center_px": [ + 1233.5, + 577.25 + ], + "area_px": 421.5 + }, + { + "image_points_px": [ + [ + 1197.0, + 559.0 + ], + [ + 1215.0, + 574.0 + ], + [ + 1199.0, + 585.0 + ], + [ + 1182.0, + 570.0 + ] + ], + "center_px": [ + 1198.25, + 572.0 + ], + "area_px": 425.0 + }, + { + "image_points_px": [ + [ + 51.0, + 548.0 + ], + [ + 59.0, + 564.0 + ], + [ + 37.0, + 574.0 + ], + [ + 29.0, + 558.0 + ] + ], + "center_px": [ + 44.0, + 561.0 + ], + "area_px": 432.0 + }, + { + "image_points_px": [ + [ + 590.0, + 609.0 + ], + [ + 603.0, + 626.0 + ], + [ + 585.0, + 636.0 + ], + [ + 572.0, + 619.0 + ] + ], + "center_px": [ + 587.5, + 622.5 + ], + "area_px": 436.0 + }, + { + "image_points_px": [ + [ + 616.0, + 644.0 + ], + [ + 630.0, + 663.0 + ], + [ + 612.0, + 672.0 + ], + [ + 600.0, + 655.0 + ] + ], + "center_px": [ + 614.5, + 658.5 + ], + "area_px": 436.0 + }, + { + "image_points_px": [ + [ + 883.0, + 566.0 + ], + [ + 897.0, + 582.0 + ], + [ + 878.0, + 592.0 + ], + [ + 865.0, + 576.0 + ] + ], + "center_px": [ + 880.75, + 579.0 + ], + "area_px": 431.0 + }, + { + "image_points_px": [ + [ + 747.0, + 544.0 + ], + [ + 760.0, + 560.0 + ], + [ + 741.0, + 570.0 + ], + [ + 728.0, + 555.0 + ] + ], + "center_px": [ + 744.0, + 557.25 + ], + "area_px": 431.0 + }, + { + "image_points_px": [ + [ + 257.0, + 552.0 + ], + [ + 267.0, + 568.0 + ], + [ + 246.0, + 579.0 + ], + [ + 237.0, + 563.0 + ] + ], + "center_px": [ + 251.75, + 565.5 + ], + "area_px": 432.5 + }, + { + "image_points_px": [ + [ + 781.0, + 550.0 + ], + [ + 794.0, + 565.0 + ], + [ + 776.0, + 576.0 + ], + [ + 762.0, + 560.0 + ] + ], + "center_px": [ + 778.25, + 562.75 + ], + "area_px": 428.5 + }, + { + "image_points_px": [ + [ + 115.0, + 559.0 + ], + [ + 124.0, + 575.0 + ], + [ + 102.0, + 585.0 + ], + [ + 94.0, + 569.0 + ] + ], + "center_px": [ + 108.75, + 572.0 + ], + "area_px": 429.0 + }, + { + "image_points_px": [ + [ + 955.0, + 549.0 + ], + [ + 969.0, + 565.0 + ], + [ + 952.0, + 575.0 + ], + [ + 937.0, + 559.0 + ] + ], + "center_px": [ + 953.25, + 562.0 + ], + "area_px": 425.0 + }, + { + "image_points_px": [ + [ + 920.0, + 543.0 + ], + [ + 935.0, + 559.0 + ], + [ + 917.0, + 569.0 + ], + [ + 903.0, + 553.0 + ] + ], + "center_px": [ + 918.75, + 556.0 + ], + "area_px": 425.0 + }, + { + "image_points_px": [ + [ + 814.0, + 555.0 + ], + [ + 828.0, + 571.0 + ], + [ + 810.0, + 581.0 + ], + [ + 796.0, + 566.0 + ] + ], + "center_px": [ + 812.0, + 568.25 + ], + "area_px": 426.0 + }, + { + "image_points_px": [ + [ + 991.0, + 526.0 + ], + [ + 1006.0, + 542.0 + ], + [ + 989.0, + 552.0 + ], + [ + 974.0, + 536.0 + ] + ], + "center_px": [ + 990.0, + 539.0 + ], + "area_px": 422.0 + }, + { + "image_points_px": [ + [ + 128.0, + 531.0 + ], + [ + 137.0, + 546.0 + ], + [ + 115.0, + 557.0 + ], + [ + 107.0, + 541.0 + ] + ], + "center_px": [ + 121.75, + 543.75 + ], + "area_px": 422.5 + }, + { + "image_points_px": [ + [ + 32.0, + 515.0 + ], + [ + 41.0, + 530.0 + ], + [ + 19.0, + 541.0 + ], + [ + 11.0, + 525.0 + ] + ], + "center_px": [ + 25.75, + 527.75 + ], + "area_px": 422.5 + }, + { + "image_points_px": [ + [ + 225.0, + 547.0 + ], + [ + 234.0, + 563.0 + ], + [ + 213.0, + 573.0 + ], + [ + 204.0, + 557.0 + ] + ], + "center_px": [ + 219.0, + 560.0 + ], + "area_px": 426.0 + }, + { + "image_points_px": [ + [ + 160.0, + 536.0 + ], + [ + 169.0, + 552.0 + ], + [ + 148.0, + 562.0 + ], + [ + 139.0, + 546.0 + ] + ], + "center_px": [ + 154.0, + 549.0 + ], + "area_px": 426.0 + }, + { + "image_points_px": [ + [ + 1129.0, + 548.0 + ], + [ + 1144.0, + 564.0 + ], + [ + 1128.0, + 574.0 + ], + [ + 1112.0, + 558.0 + ] + ], + "center_px": [ + 1128.25, + 561.0 + ], + "area_px": 419.0 + }, + { + "image_points_px": [ + [ + 1092.0, + 543.0 + ], + [ + 1110.0, + 558.0 + ], + [ + 1094.0, + 568.0 + ], + [ + 1077.0, + 553.0 + ] + ], + "center_px": [ + 1093.25, + 555.5 + ], + "area_px": 407.5 + }, + { + "image_points_px": [ + [ + 1197.0, + 531.0 + ], + [ + 1214.0, + 546.0 + ], + [ + 1199.0, + 556.0 + ], + [ + 1181.0, + 541.0 + ] + ], + "center_px": [ + 1197.75, + 543.5 + ], + "area_px": 407.5 + }, + { + "image_points_px": [ + [ + 640.0, + 556.0 + ], + [ + 652.0, + 572.0 + ], + [ + 633.0, + 582.0 + ], + [ + 621.0, + 566.0 + ] + ], + "center_px": [ + 636.5, + 569.0 + ], + "area_px": 424.0 + }, + { + "image_points_px": [ + [ + 606.0, + 551.0 + ], + [ + 618.0, + 567.0 + ], + [ + 599.0, + 577.0 + ], + [ + 587.0, + 561.0 + ] + ], + "center_px": [ + 602.5, + 564.0 + ], + "area_px": 424.0 + }, + { + "image_points_px": [ + [ + 752.0, + 517.0 + ], + [ + 765.0, + 532.0 + ], + [ + 746.0, + 542.0 + ], + [ + 733.0, + 527.0 + ] + ], + "center_px": [ + 749.0, + 529.5 + ], + "area_px": 415.0 + }, + { + "image_points_px": [ + [ + 713.0, + 539.0 + ], + [ + 726.0, + 554.0 + ], + [ + 707.0, + 564.0 + ], + [ + 694.0, + 549.0 + ] + ], + "center_px": [ + 710.0, + 551.5 + ], + "area_px": 415.0 + }, + { + "image_points_px": [ + [ + 674.0, + 562.0 + ], + [ + 686.0, + 577.0 + ], + [ + 667.0, + 588.0 + ], + [ + 655.0, + 572.0 + ] + ], + "center_px": [ + 670.5, + 574.75 + ], + "area_px": 420.5 + }, + { + "image_points_px": [ + [ + 580.0, + 518.0 + ], + [ + 592.0, + 533.0 + ], + [ + 573.0, + 544.0 + ], + [ + 561.0, + 528.0 + ] + ], + "center_px": [ + 576.5, + 530.75 + ], + "area_px": 420.5 + }, + { + "image_points_px": [ + [ + 204.0, + 514.0 + ], + [ + 214.0, + 529.0 + ], + [ + 192.0, + 539.0 + ], + [ + 183.0, + 525.0 + ] + ], + "center_px": [ + 198.25, + 526.75 + ], + "area_px": 411.5 + }, + { + "image_points_px": [ + [ + 990.0, + 555.0 + ], + [ + 1004.0, + 570.0 + ], + [ + 986.0, + 580.0 + ], + [ + 972.0, + 564.0 + ] + ], + "center_px": [ + 988.0, + 567.25 + ], + "area_px": 412.0 + }, + { + "image_points_px": [ + [ + 236.0, + 519.0 + ], + [ + 246.0, + 534.0 + ], + [ + 225.0, + 545.0 + ], + [ + 216.0, + 529.0 + ] + ], + "center_px": [ + 230.75, + 531.75 + ], + "area_px": 417.5 + }, + { + "image_points_px": [ + [ + 785.0, + 522.0 + ], + [ + 799.0, + 537.0 + ], + [ + 780.0, + 547.0 + ], + [ + 767.0, + 532.0 + ] + ], + "center_px": [ + 782.75, + 534.5 + ], + "area_px": 412.5 + }, + { + "image_points_px": [ + [ + 924.0, + 516.0 + ], + [ + 938.0, + 531.0 + ], + [ + 920.0, + 541.0 + ], + [ + 906.0, + 526.0 + ] + ], + "center_px": [ + 922.0, + 528.5 + ], + "area_px": 410.0 + }, + { + "image_points_px": [ + [ + 818.0, + 527.0 + ], + [ + 832.0, + 543.0 + ], + [ + 814.0, + 553.0 + ], + [ + 801.0, + 537.0 + ] + ], + "center_px": [ + 816.25, + 540.0 + ], + "area_px": 415.0 + }, + { + "image_points_px": [ + [ + 957.0, + 521.0 + ], + [ + 972.0, + 536.0 + ], + [ + 954.0, + 546.0 + ], + [ + 940.0, + 531.0 + ] + ], + "center_px": [ + 955.75, + 533.5 + ], + "area_px": 407.5 + }, + { + "image_points_px": [ + [ + 993.0, + 499.0 + ], + [ + 1008.0, + 514.0 + ], + [ + 990.0, + 524.0 + ], + [ + 976.0, + 509.0 + ] + ], + "center_px": [ + 991.75, + 511.5 + ], + "area_px": 407.5 + }, + { + "image_points_px": [ + [ + 886.0, + 538.0 + ], + [ + 900.0, + 554.0 + ], + [ + 883.0, + 564.0 + ], + [ + 869.0, + 548.0 + ] + ], + "center_px": [ + 884.5, + 551.0 + ], + "area_px": 412.0 + }, + { + "image_points_px": [ + [ + 890.0, + 510.0 + ], + [ + 903.0, + 526.0 + ], + [ + 886.0, + 536.0 + ], + [ + 872.0, + 521.0 + ] + ], + "center_px": [ + 887.75, + 523.25 + ], + "area_px": 413.0 + }, + { + "image_points_px": [ + [ + 77.0, + 493.0 + ], + [ + 86.0, + 508.0 + ], + [ + 64.0, + 518.0 + ], + [ + 56.0, + 503.0 + ] + ], + "center_px": [ + 70.75, + 505.5 + ], + "area_px": 407.5 + }, + { + "image_points_px": [ + [ + 1095.0, + 515.0 + ], + [ + 1110.0, + 530.0 + ], + [ + 1093.0, + 540.0 + ], + [ + 1078.0, + 525.0 + ] + ], + "center_px": [ + 1094.0, + 527.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 1025.0, + 532.0 + ], + [ + 1040.0, + 547.0 + ], + [ + 1023.0, + 557.0 + ], + [ + 1008.0, + 542.0 + ] + ], + "center_px": [ + 1024.0, + 544.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 1061.0, + 510.0 + ], + [ + 1076.0, + 525.0 + ], + [ + 1059.0, + 535.0 + ], + [ + 1044.0, + 520.0 + ] + ], + "center_px": [ + 1060.0, + 522.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 959.0, + 494.0 + ], + [ + 974.0, + 509.0 + ], + [ + 957.0, + 519.0 + ], + [ + 942.0, + 504.0 + ] + ], + "center_px": [ + 958.0, + 506.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 1096.0, + 488.0 + ], + [ + 1111.0, + 503.0 + ], + [ + 1095.0, + 513.0 + ], + [ + 1079.0, + 498.0 + ] + ], + "center_px": [ + 1095.25, + 500.5 + ], + "area_px": 402.5 + }, + { + "image_points_px": [ + [ + 563.0, + 574.0 + ], + [ + 576.0, + 592.0 + ], + [ + 558.0, + 600.0 + ], + [ + 546.0, + 584.0 + ] + ], + "center_px": [ + 560.75, + 587.5 + ], + "area_px": 410.0 + }, + { + "image_points_px": [ + [ + 184.0, + 482.0 + ], + [ + 193.0, + 497.0 + ], + [ + 172.0, + 507.0 + ], + [ + 163.0, + 492.0 + ] + ], + "center_px": [ + 178.0, + 494.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 121.0, + 472.0 + ], + [ + 130.0, + 487.0 + ], + [ + 109.0, + 497.0 + ], + [ + 100.0, + 482.0 + ] + ], + "center_px": [ + 115.0, + 484.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 172.0, + 509.0 + ], + [ + 181.0, + 524.0 + ], + [ + 160.0, + 534.0 + ], + [ + 151.0, + 519.0 + ] + ], + "center_px": [ + 166.0, + 521.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 140.0, + 504.0 + ], + [ + 149.0, + 519.0 + ], + [ + 128.0, + 529.0 + ], + [ + 119.0, + 514.0 + ] + ], + "center_px": [ + 134.0, + 516.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 1129.0, + 493.0 + ], + [ + 1145.0, + 508.0 + ], + [ + 1130.0, + 518.0 + ], + [ + 1113.0, + 503.0 + ] + ], + "center_px": [ + 1129.25, + 505.5 + ], + "area_px": 397.5 + }, + { + "image_points_px": [ + [ + 1231.0, + 509.0 + ], + [ + 1248.0, + 524.0 + ], + [ + 1233.0, + 534.0 + ], + [ + 1216.0, + 519.0 + ] + ], + "center_px": [ + 1232.0, + 521.5 + ], + "area_px": 395.0 + }, + { + "image_points_px": [ + [ + 620.0, + 496.0 + ], + [ + 632.0, + 511.0 + ], + [ + 613.0, + 521.0 + ], + [ + 601.0, + 506.0 + ] + ], + "center_px": [ + 616.5, + 508.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 680.0, + 534.0 + ], + [ + 692.0, + 549.0 + ], + [ + 673.0, + 559.0 + ], + [ + 661.0, + 544.0 + ] + ], + "center_px": [ + 676.5, + 546.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 613.0, + 523.0 + ], + [ + 625.0, + 538.0 + ], + [ + 606.0, + 548.0 + ], + [ + 594.0, + 533.0 + ] + ], + "center_px": [ + 609.5, + 535.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 587.0, + 491.0 + ], + [ + 599.0, + 506.0 + ], + [ + 580.0, + 516.0 + ], + [ + 568.0, + 501.0 + ] + ], + "center_px": [ + 583.5, + 503.5 + ], + "area_px": 405.0 + }, + { + "image_points_px": [ + [ + 1161.0, + 526.0 + ], + [ + 1179.0, + 540.0 + ], + [ + 1164.0, + 551.0 + ], + [ + 1147.0, + 536.0 + ] + ], + "center_px": [ + 1162.75, + 538.25 + ], + "area_px": 394.0 + }, + { + "image_points_px": [ + [ + 215.0, + 487.0 + ], + [ + 225.0, + 502.0 + ], + [ + 204.0, + 512.0 + ], + [ + 195.0, + 497.0 + ] + ], + "center_px": [ + 209.75, + 499.5 + ], + "area_px": 402.5 + }, + { + "image_points_px": [ + [ + 719.0, + 512.0 + ], + [ + 731.0, + 527.0 + ], + [ + 713.0, + 537.0 + ], + [ + 700.0, + 522.0 + ] + ], + "center_px": [ + 715.75, + 524.5 + ], + "area_px": 402.5 + }, + { + "image_points_px": [ + [ + 685.0, + 506.0 + ], + [ + 698.0, + 521.0 + ], + [ + 679.0, + 531.0 + ], + [ + 667.0, + 516.0 + ] + ], + "center_px": [ + 682.25, + 518.5 + ], + "area_px": 402.5 + }, + { + "image_points_px": [ + [ + 652.0, + 501.0 + ], + [ + 665.0, + 516.0 + ], + [ + 646.0, + 526.0 + ], + [ + 634.0, + 511.0 + ] + ], + "center_px": [ + 649.25, + 513.5 + ], + "area_px": 402.5 + }, + { + "image_points_px": [ + [ + 109.0, + 499.0 + ], + [ + 117.0, + 514.0 + ], + [ + 96.0, + 524.0 + ], + [ + 88.0, + 508.0 + ] + ], + "center_px": [ + 102.5, + 511.25 + ], + "area_px": 401.5 + }, + { + "image_points_px": [ + [ + 853.0, + 533.0 + ], + [ + 866.0, + 548.0 + ], + [ + 848.0, + 558.0 + ], + [ + 835.0, + 543.0 + ] + ], + "center_px": [ + 850.5, + 545.5 + ], + "area_px": 400.0 + }, + { + "image_points_px": [ + [ + 790.0, + 495.0 + ], + [ + 803.0, + 510.0 + ], + [ + 785.0, + 520.0 + ], + [ + 772.0, + 505.0 + ] + ], + "center_px": [ + 787.5, + 507.5 + ], + "area_px": 400.0 + }, + { + "image_points_px": [ + [ + 1027.0, + 505.0 + ], + [ + 1042.0, + 519.0 + ], + [ + 1024.0, + 529.0 + ], + [ + 1010.0, + 514.0 + ] + ], + "center_px": [ + 1025.75, + 516.75 + ], + "area_px": 391.5 + }, + { + "image_points_px": [ + [ + 856.0, + 505.0 + ], + [ + 870.0, + 520.0 + ], + [ + 852.0, + 530.0 + ], + [ + 839.0, + 515.0 + ] + ], + "center_px": [ + 854.25, + 517.5 + ], + "area_px": 397.5 + }, + { + "image_points_px": [ + [ + 822.0, + 500.0 + ], + [ + 836.0, + 515.0 + ], + [ + 818.0, + 525.0 + ], + [ + 805.0, + 510.0 + ] + ], + "center_px": [ + 820.25, + 512.5 + ], + "area_px": 397.5 + }, + { + "image_points_px": [ + [ + 1062.0, + 483.0 + ], + [ + 1077.0, + 498.0 + ], + [ + 1061.0, + 508.0 + ], + [ + 1046.0, + 492.0 + ] + ], + "center_px": [ + 1061.5, + 495.25 + ], + "area_px": 390.5 + }, + { + "image_points_px": [ + [ + 1028.0, + 478.0 + ], + [ + 1043.0, + 493.0 + ], + [ + 1027.0, + 503.0 + ], + [ + 1012.0, + 487.0 + ] + ], + "center_px": [ + 1027.5, + 490.25 + ], + "area_px": 390.5 + }, + { + "image_points_px": [ + [ + 555.0, + 486.0 + ], + [ + 566.0, + 500.0 + ], + [ + 547.0, + 511.0 + ], + [ + 536.0, + 495.0 + ] + ], + "center_px": [ + 551.0, + 498.0 + ], + "area_px": 395.0 + }, + { + "image_points_px": [ + [ + 1197.0, + 477.0 + ], + [ + 1213.0, + 491.0 + ], + [ + 1198.0, + 501.0 + ], + [ + 1181.0, + 487.0 + ] + ], + "center_px": [ + 1197.25, + 489.0 + ], + "area_px": 382.0 + }, + { + "image_points_px": [ + [ + 659.0, + 475.0 + ], + [ + 671.0, + 489.0 + ], + [ + 652.0, + 499.0 + ], + [ + 640.0, + 484.0 + ] + ], + "center_px": [ + 655.5, + 486.75 + ], + "area_px": 389.5 + }, + { + "image_points_px": [ + [ + 1231.0, + 482.0 + ], + [ + 1247.0, + 496.0 + ], + [ + 1233.0, + 506.0 + ], + [ + 1215.0, + 492.0 + ] + ], + "center_px": [ + 1231.5, + 494.0 + ], + "area_px": 380.0 + }, + { + "image_points_px": [ + [ + 1127.0, + 521.0 + ], + [ + 1144.0, + 534.0 + ], + [ + 1130.0, + 545.0 + ], + [ + 1112.0, + 530.0 + ] + ], + "center_px": [ + 1128.25, + 532.5 + ], + "area_px": 378.0 + }, + { + "image_points_px": [ + [ + 1162.0, + 499.0 + ], + [ + 1179.0, + 513.0 + ], + [ + 1164.0, + 523.0 + ], + [ + 1147.0, + 509.0 + ] + ], + "center_px": [ + 1163.0, + 511.0 + ], + "area_px": 380.0 + }, + { + "image_points_px": [ + [ + 757.0, + 490.0 + ], + [ + 770.0, + 505.0 + ], + [ + 751.0, + 514.0 + ], + [ + 739.0, + 500.0 + ] + ], + "center_px": [ + 754.25, + 502.25 + ], + "area_px": 387.0 + }, + { + "image_points_px": [ + [ + 1196.0, + 504.0 + ], + [ + 1213.0, + 518.0 + ], + [ + 1198.0, + 529.0 + ], + [ + 1182.0, + 514.0 + ] + ], + "center_px": [ + 1197.25, + 516.25 + ], + "area_px": 383.5 + }, + { + "image_points_px": [ + [ + 893.0, + 484.0 + ], + [ + 907.0, + 499.0 + ], + [ + 889.0, + 508.0 + ], + [ + 876.0, + 493.0 + ] + ], + "center_px": [ + 891.25, + 496.0 + ], + "area_px": 384.0 + }, + { + "image_points_px": [ + [ + 152.0, + 477.0 + ], + [ + 161.0, + 492.0 + ], + [ + 141.0, + 502.0 + ], + [ + 132.0, + 487.0 + ] + ], + "center_px": [ + 146.5, + 489.5 + ], + "area_px": 390.0 + }, + { + "image_points_px": [ + [ + 762.0, + 464.0 + ], + [ + 775.0, + 478.0 + ], + [ + 757.0, + 488.0 + ], + [ + 744.0, + 473.0 + ] + ], + "center_px": [ + 759.5, + 475.75 + ], + "area_px": 384.5 + }, + { + "image_points_px": [ + [ + 729.0, + 459.0 + ], + [ + 742.0, + 473.0 + ], + [ + 724.0, + 483.0 + ], + [ + 711.0, + 468.0 + ] + ], + "center_px": [ + 726.5, + 470.75 + ], + "area_px": 384.5 + }, + { + "image_points_px": [ + [ + 799.0, + 443.0 + ], + [ + 812.0, + 457.0 + ], + [ + 794.0, + 467.0 + ], + [ + 781.0, + 452.0 + ] + ], + "center_px": [ + 796.5, + 454.75 + ], + "area_px": 384.5 + }, + { + "image_points_px": [ + [ + 691.0, + 480.0 + ], + [ + 704.0, + 494.0 + ], + [ + 685.0, + 504.0 + ], + [ + 673.0, + 490.0 + ] + ], + "center_px": [ + 688.25, + 492.0 + ], + "area_px": 384.0 + }, + { + "image_points_px": [ + [ + 860.0, + 479.0 + ], + [ + 874.0, + 493.0 + ], + [ + 856.0, + 503.0 + ], + [ + 843.0, + 488.0 + ] + ], + "center_px": [ + 858.25, + 490.75 + ], + "area_px": 382.0 + }, + { + "image_points_px": [ + [ + 926.0, + 489.0 + ], + [ + 940.0, + 504.0 + ], + [ + 922.0, + 513.0 + ], + [ + 909.0, + 499.0 + ] + ], + "center_px": [ + 924.25, + 501.25 + ], + "area_px": 382.0 + }, + { + "image_points_px": [ + [ + 996.0, + 473.0 + ], + [ + 1010.0, + 487.0 + ], + [ + 993.0, + 497.0 + ], + [ + 979.0, + 482.0 + ] + ], + "center_px": [ + 994.5, + 484.75 + ], + "area_px": 379.5 + }, + { + "image_points_px": [ + [ + 929.0, + 463.0 + ], + [ + 943.0, + 477.0 + ], + [ + 926.0, + 487.0 + ], + [ + 912.0, + 472.0 + ] + ], + "center_px": [ + 927.5, + 474.75 + ], + "area_px": 379.5 + }, + { + "image_points_px": [ + [ + 896.0, + 458.0 + ], + [ + 910.0, + 472.0 + ], + [ + 893.0, + 482.0 + ], + [ + 879.0, + 467.0 + ] + ], + "center_px": [ + 894.5, + 469.75 + ], + "area_px": 379.5 + }, + { + "image_points_px": [ + [ + 59.0, + 462.0 + ], + [ + 67.0, + 477.0 + ], + [ + 46.0, + 486.0 + ], + [ + 38.0, + 472.0 + ] + ], + "center_px": [ + 52.5, + 474.25 + ], + "area_px": 380.5 + }, + { + "image_points_px": [ + [ + 90.0, + 467.0 + ], + [ + 98.0, + 482.0 + ], + [ + 77.0, + 491.0 + ], + [ + 69.0, + 477.0 + ] + ], + "center_px": [ + 83.5, + 479.25 + ], + "area_px": 380.5 + }, + { + "image_points_px": [ + [ + 964.0, + 442.0 + ], + [ + 979.0, + 456.0 + ], + [ + 962.0, + 466.0 + ], + [ + 948.0, + 451.0 + ] + ], + "center_px": [ + 963.25, + 453.75 + ], + "area_px": 377.0 + }, + { + "image_points_px": [ + [ + 1097.0, + 436.0 + ], + [ + 1112.0, + 451.0 + ], + [ + 1096.0, + 460.0 + ], + [ + 1081.0, + 446.0 + ] + ], + "center_px": [ + 1096.5, + 448.25 + ], + "area_px": 374.5 + }, + { + "image_points_px": [ + [ + 1063.0, + 457.0 + ], + [ + 1078.0, + 471.0 + ], + [ + 1062.0, + 481.0 + ], + [ + 1047.0, + 466.0 + ] + ], + "center_px": [ + 1062.5, + 468.75 + ], + "area_px": 374.5 + }, + { + "image_points_px": [ + [ + 1030.0, + 452.0 + ], + [ + 1045.0, + 466.0 + ], + [ + 1029.0, + 476.0 + ], + [ + 1014.0, + 461.0 + ] + ], + "center_px": [ + 1029.5, + 463.75 + ], + "area_px": 374.5 + }, + { + "image_points_px": [ + [ + 594.0, + 465.0 + ], + [ + 606.0, + 479.0 + ], + [ + 587.0, + 488.0 + ], + [ + 575.0, + 474.0 + ] + ], + "center_px": [ + 590.5, + 476.5 + ], + "area_px": 374.0 + }, + { + "image_points_px": [ + [ + 1096.0, + 462.0 + ], + [ + 1112.0, + 476.0 + ], + [ + 1096.0, + 486.0 + ], + [ + 1081.0, + 471.0 + ] + ], + "center_px": [ + 1096.25, + 473.75 + ], + "area_px": 372.0 + }, + { + "image_points_px": [ + [ + 1197.0, + 451.0 + ], + [ + 1212.0, + 466.0 + ], + [ + 1197.0, + 475.0 + ], + [ + 1181.0, + 461.0 + ] + ], + "center_px": [ + 1196.75, + 463.25 + ], + "area_px": 372.0 + }, + { + "image_points_px": [ + [ + 64.0, + 521.0 + ], + [ + 72.0, + 535.0 + ], + [ + 51.0, + 545.0 + ], + [ + 43.0, + 531.0 + ] + ], + "center_px": [ + 57.5, + 533.0 + ], + "area_px": 374.0 + }, + { + "image_points_px": [ + [ + 28.0, + 457.0 + ], + [ + 36.0, + 471.0 + ], + [ + 15.0, + 481.0 + ], + [ + 7.0, + 467.0 + ] + ], + "center_px": [ + 21.5, + 469.0 + ], + "area_px": 374.0 + }, + { + "image_points_px": [ + [ + 724.0, + 485.0 + ], + [ + 736.0, + 500.0 + ], + [ + 718.0, + 509.0 + ], + [ + 706.0, + 494.0 + ] + ], + "center_px": [ + 721.0, + 497.0 + ], + "area_px": 378.0 + }, + { + "image_points_px": [ + [ + 562.0, + 460.0 + ], + [ + 573.0, + 474.0 + ], + [ + 555.0, + 484.0 + ], + [ + 543.0, + 469.0 + ] + ], + "center_px": [ + 558.25, + 471.75 + ], + "area_px": 377.5 + }, + { + "image_points_px": [ + [ + 1163.0, + 472.0 + ], + [ + 1179.0, + 486.0 + ], + [ + 1164.0, + 496.0 + ], + [ + 1148.0, + 482.0 + ] + ], + "center_px": [ + 1163.5, + 484.0 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 1129.0, + 467.0 + ], + [ + 1145.0, + 481.0 + ], + [ + 1130.0, + 491.0 + ], + [ + 1114.0, + 477.0 + ] + ], + "center_px": [ + 1129.5, + 479.0 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 1230.0, + 456.0 + ], + [ + 1246.0, + 470.0 + ], + [ + 1231.0, + 480.0 + ], + [ + 1215.0, + 466.0 + ] + ], + "center_px": [ + 1230.5, + 468.0 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 164.0, + 451.0 + ], + [ + 173.0, + 466.0 + ], + [ + 153.0, + 475.0 + ], + [ + 144.0, + 461.0 + ] + ], + "center_px": [ + 158.5, + 463.25 + ], + "area_px": 375.5 + }, + { + "image_points_px": [ + [ + 195.0, + 456.0 + ], + [ + 204.0, + 471.0 + ], + [ + 184.0, + 480.0 + ], + [ + 175.0, + 466.0 + ] + ], + "center_px": [ + 189.5, + 468.25 + ], + "area_px": 375.5 + }, + { + "image_points_px": [ + [ + 133.0, + 446.0 + ], + [ + 142.0, + 460.0 + ], + [ + 121.0, + 470.0 + ], + [ + 113.0, + 456.0 + ] + ], + "center_px": [ + 127.25, + 458.0 + ], + "area_px": 372.0 + }, + { + "image_points_px": [ + [ + 102.0, + 441.0 + ], + [ + 111.0, + 455.0 + ], + [ + 90.0, + 465.0 + ], + [ + 82.0, + 451.0 + ] + ], + "center_px": [ + 96.25, + 453.0 + ], + "area_px": 372.0 + }, + { + "image_points_px": [ + [ + 626.0, + 470.0 + ], + [ + 638.0, + 484.0 + ], + [ + 620.0, + 494.0 + ], + [ + 608.0, + 479.0 + ] + ], + "center_px": [ + 623.0, + 481.75 + ], + "area_px": 375.0 + }, + { + "image_points_px": [ + [ + 827.0, + 474.0 + ], + [ + 840.0, + 489.0 + ], + [ + 823.0, + 498.0 + ], + [ + 810.0, + 483.0 + ] + ], + "center_px": [ + 825.0, + 486.0 + ], + "area_px": 372.0 + }, + { + "image_points_px": [ + [ + 734.0, + 433.0 + ], + [ + 747.0, + 447.0 + ], + [ + 729.0, + 457.0 + ], + [ + 717.0, + 442.0 + ] + ], + "center_px": [ + 731.75, + 444.75 + ], + "area_px": 372.5 + }, + { + "image_points_px": [ + [ + 997.0, + 447.0 + ], + [ + 1012.0, + 461.0 + ], + [ + 994.0, + 470.0 + ], + [ + 981.0, + 456.0 + ] + ], + "center_px": [ + 996.0, + 458.5 + ], + "area_px": 364.0 + }, + { + "image_points_px": [ + [ + 932.0, + 437.0 + ], + [ + 946.0, + 451.0 + ], + [ + 928.0, + 460.0 + ], + [ + 915.0, + 447.0 + ] + ], + "center_px": [ + 930.25, + 448.75 + ], + "area_px": 364.5 + }, + { + "image_points_px": [ + [ + 868.0, + 428.0 + ], + [ + 881.0, + 441.0 + ], + [ + 864.0, + 451.0 + ], + [ + 850.0, + 437.0 + ] + ], + "center_px": [ + 865.75, + 439.25 + ], + "area_px": 364.5 + }, + { + "image_points_px": [ + [ + 962.0, + 468.0 + ], + [ + 976.0, + 483.0 + ], + [ + 959.0, + 492.0 + ], + [ + 946.0, + 477.0 + ] + ], + "center_px": [ + 960.75, + 480.0 + ], + "area_px": 369.0 + }, + { + "image_points_px": [ + [ + 41.0, + 432.0 + ], + [ + 49.0, + 446.0 + ], + [ + 28.0, + 455.0 + ], + [ + 20.0, + 441.0 + ] + ], + "center_px": [ + 34.5, + 443.5 + ], + "area_px": 366.0 + }, + { + "image_points_px": [ + [ + 831.0, + 448.0 + ], + [ + 844.0, + 462.0 + ], + [ + 827.0, + 472.0 + ], + [ + 814.0, + 457.0 + ] + ], + "center_px": [ + 829.0, + 459.75 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 794.0, + 469.0 + ], + [ + 807.0, + 483.0 + ], + [ + 790.0, + 493.0 + ], + [ + 777.0, + 478.0 + ] + ], + "center_px": [ + 792.0, + 480.75 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 864.0, + 453.0 + ], + [ + 877.0, + 467.0 + ], + [ + 860.0, + 477.0 + ], + [ + 847.0, + 462.0 + ] + ], + "center_px": [ + 862.0, + 464.75 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 530.0, + 455.0 + ], + [ + 541.0, + 469.0 + ], + [ + 522.0, + 478.0 + ], + [ + 511.0, + 464.0 + ] + ], + "center_px": [ + 526.0, + 466.5 + ], + "area_px": 365.0 + }, + { + "image_points_px": [ + [ + 1130.0, + 416.0 + ], + [ + 1146.0, + 430.0 + ], + [ + 1131.0, + 439.0 + ], + [ + 1115.0, + 425.0 + ] + ], + "center_px": [ + 1130.5, + 427.5 + ], + "area_px": 354.0 + }, + { + "image_points_px": [ + [ + 1130.0, + 441.0 + ], + [ + 1145.0, + 456.0 + ], + [ + 1130.0, + 465.0 + ], + [ + 1115.0, + 450.0 + ] + ], + "center_px": [ + 1130.0, + 453.0 + ], + "area_px": 360.0 + }, + { + "image_points_px": [ + [ + 1196.0, + 426.0 + ], + [ + 1212.0, + 439.0 + ], + [ + 1197.0, + 449.0 + ], + [ + 1181.0, + 435.0 + ] + ], + "center_px": [ + 1196.5, + 437.25 + ], + "area_px": 354.5 + }, + { + "image_points_px": [ + [ + 1163.0, + 421.0 + ], + [ + 1179.0, + 434.0 + ], + [ + 1164.0, + 444.0 + ], + [ + 1148.0, + 430.0 + ] + ], + "center_px": [ + 1163.5, + 432.25 + ], + "area_px": 354.5 + }, + { + "image_points_px": [ + [ + 601.0, + 439.0 + ], + [ + 612.0, + 453.0 + ], + [ + 594.0, + 462.0 + ], + [ + 582.0, + 448.0 + ] + ], + "center_px": [ + 597.25, + 450.5 + ], + "area_px": 362.5 + }, + { + "image_points_px": [ + [ + 544.0, + 404.0 + ], + [ + 556.0, + 418.0 + ], + [ + 537.0, + 427.0 + ], + [ + 526.0, + 413.0 + ] + ], + "center_px": [ + 540.75, + 415.5 + ], + "area_px": 362.5 + }, + { + "image_points_px": [ + [ + 665.0, + 449.0 + ], + [ + 677.0, + 463.0 + ], + [ + 658.0, + 472.0 + ], + [ + 647.0, + 458.0 + ] + ], + "center_px": [ + 661.75, + 460.5 + ], + "area_px": 362.5 + }, + { + "image_points_px": [ + [ + 1229.0, + 431.0 + ], + [ + 1245.0, + 444.0 + ], + [ + 1231.0, + 454.0 + ], + [ + 1214.0, + 440.0 + ] + ], + "center_px": [ + 1229.75, + 442.25 + ], + "area_px": 352.5 + }, + { + "image_points_px": [ + [ + 1163.0, + 446.0 + ], + [ + 1179.0, + 460.0 + ], + [ + 1165.0, + 469.0 + ], + [ + 1148.0, + 456.0 + ] + ], + "center_px": [ + 1163.75, + 457.75 + ], + "area_px": 352.5 + }, + { + "image_points_px": [ + [ + 671.0, + 424.0 + ], + [ + 683.0, + 437.0 + ], + [ + 665.0, + 447.0 + ], + [ + 653.0, + 432.0 + ] + ], + "center_px": [ + 668.0, + 435.0 + ], + "area_px": 360.0 + }, + { + "image_points_px": [ + [ + 176.0, + 426.0 + ], + [ + 185.0, + 440.0 + ], + [ + 165.0, + 449.0 + ], + [ + 156.0, + 435.0 + ] + ], + "center_px": [ + 170.5, + 437.5 + ], + "area_px": 361.0 + }, + { + "image_points_px": [ + [ + 697.0, + 454.0 + ], + [ + 709.0, + 468.0 + ], + [ + 691.0, + 477.0 + ], + [ + 679.0, + 463.0 + ] + ], + "center_px": [ + 694.0, + 465.5 + ], + "area_px": 360.0 + }, + { + "image_points_px": [ + [ + 632.0, + 444.0 + ], + [ + 644.0, + 458.0 + ], + [ + 626.0, + 467.0 + ], + [ + 614.0, + 453.0 + ] + ], + "center_px": [ + 629.0, + 455.5 + ], + "area_px": 360.0 + }, + { + "image_points_px": [ + [ + 569.0, + 434.0 + ], + [ + 580.0, + 448.0 + ], + [ + 562.0, + 458.0 + ], + [ + 551.0, + 443.0 + ] + ], + "center_px": [ + 565.5, + 445.75 + ], + "area_px": 365.5 + }, + { + "image_points_px": [ + [ + 145.0, + 421.0 + ], + [ + 154.0, + 435.0 + ], + [ + 133.0, + 444.0 + ], + [ + 125.0, + 431.0 + ] + ], + "center_px": [ + 139.25, + 432.75 + ], + "area_px": 357.5 + }, + { + "image_points_px": [ + [ + 766.0, + 438.0 + ], + [ + 779.0, + 452.0 + ], + [ + 761.0, + 461.0 + ], + [ + 749.0, + 447.0 + ] + ], + "center_px": [ + 763.75, + 449.5 + ], + "area_px": 357.5 + }, + { + "image_points_px": [ + [ + 739.0, + 408.0 + ], + [ + 752.0, + 422.0 + ], + [ + 734.0, + 431.0 + ], + [ + 722.0, + 417.0 + ] + ], + "center_px": [ + 736.75, + 419.5 + ], + "area_px": 357.5 + }, + { + "image_points_px": [ + [ + 702.0, + 428.0 + ], + [ + 714.0, + 443.0 + ], + [ + 697.0, + 452.0 + ], + [ + 685.0, + 437.0 + ] + ], + "center_px": [ + 699.5, + 440.0 + ], + "area_px": 363.0 + }, + { + "image_points_px": [ + [ + 607.0, + 414.0 + ], + [ + 619.0, + 427.0 + ], + [ + 601.0, + 437.0 + ], + [ + 589.0, + 423.0 + ] + ], + "center_px": [ + 604.0, + 425.25 + ], + "area_px": 357.0 + }, + { + "image_points_px": [ + [ + 899.0, + 432.0 + ], + [ + 913.0, + 446.0 + ], + [ + 895.0, + 455.0 + ], + [ + 883.0, + 441.0 + ] + ], + "center_px": [ + 897.5, + 443.5 + ], + "area_px": 355.0 + }, + { + "image_points_px": [ + [ + 835.0, + 423.0 + ], + [ + 848.0, + 437.0 + ], + [ + 831.0, + 446.0 + ], + [ + 818.0, + 432.0 + ] + ], + "center_px": [ + 833.0, + 434.5 + ], + "area_px": 355.0 + }, + { + "image_points_px": [ + [ + 803.0, + 418.0 + ], + [ + 816.0, + 431.0 + ], + [ + 798.0, + 441.0 + ], + [ + 786.0, + 427.0 + ] + ], + "center_px": [ + 800.75, + 429.25 + ], + "area_px": 355.0 + }, + { + "image_points_px": [ + [ + 1065.0, + 432.0 + ], + [ + 1079.0, + 446.0 + ], + [ + 1063.0, + 455.0 + ], + [ + 1049.0, + 440.0 + ] + ], + "center_px": [ + 1064.0, + 443.25 + ], + "area_px": 351.0 + }, + { + "image_points_px": [ + [ + 115.0, + 416.0 + ], + [ + 123.0, + 430.0 + ], + [ + 102.0, + 439.0 + ], + [ + 95.0, + 425.0 + ] + ], + "center_px": [ + 108.75, + 427.5 + ], + "area_px": 354.5 + }, + { + "image_points_px": [ + [ + 1000.0, + 422.0 + ], + [ + 1013.0, + 436.0 + ], + [ + 997.0, + 445.0 + ], + [ + 983.0, + 431.0 + ] + ], + "center_px": [ + 998.25, + 433.5 + ], + "area_px": 352.5 + }, + { + "image_points_px": [ + [ + 874.0, + 378.0 + ], + [ + 887.0, + 392.0 + ], + [ + 871.0, + 401.0 + ], + [ + 857.0, + 387.0 + ] + ], + "center_px": [ + 872.25, + 389.5 + ], + "area_px": 352.5 + }, + { + "image_points_px": [ + [ + 807.0, + 393.0 + ], + [ + 820.0, + 406.0 + ], + [ + 803.0, + 416.0 + ], + [ + 790.0, + 402.0 + ] + ], + "center_px": [ + 805.0, + 404.25 + ], + "area_px": 353.0 + }, + { + "image_points_px": [ + [ + 969.0, + 392.0 + ], + [ + 983.0, + 406.0 + ], + [ + 967.0, + 415.0 + ], + [ + 953.0, + 401.0 + ] + ], + "center_px": [ + 968.0, + 403.5 + ], + "area_px": 350.0 + }, + { + "image_points_px": [ + [ + 1032.0, + 427.0 + ], + [ + 1046.0, + 441.0 + ], + [ + 1030.0, + 450.0 + ], + [ + 1016.0, + 436.0 + ] + ], + "center_px": [ + 1031.0, + 438.5 + ], + "area_px": 350.0 + }, + { + "image_points_px": [ + [ + 967.0, + 417.0 + ], + [ + 981.0, + 431.0 + ], + [ + 965.0, + 440.0 + ], + [ + 951.0, + 426.0 + ] + ], + "center_px": [ + 966.0, + 428.5 + ], + "area_px": 350.0 + }, + { + "image_points_px": [ + [ + 934.0, + 412.0 + ], + [ + 948.0, + 426.0 + ], + [ + 932.0, + 435.0 + ], + [ + 918.0, + 421.0 + ] + ], + "center_px": [ + 933.0, + 423.5 + ], + "area_px": 350.0 + }, + { + "image_points_px": [ + [ + 1162.0, + 397.0 + ], + [ + 1179.0, + 410.0 + ], + [ + 1164.0, + 419.0 + ], + [ + 1148.0, + 405.0 + ] + ], + "center_px": [ + 1163.25, + 407.75 + ], + "area_px": 336.0 + }, + { + "image_points_px": [ + [ + 1098.0, + 411.0 + ], + [ + 1113.0, + 425.0 + ], + [ + 1097.0, + 434.0 + ], + [ + 1083.0, + 420.0 + ] + ], + "center_px": [ + 1097.75, + 422.5 + ], + "area_px": 347.5 + }, + { + "image_points_px": [ + [ + 552.0, + 380.0 + ], + [ + 563.0, + 393.0 + ], + [ + 544.0, + 402.0 + ], + [ + 533.0, + 389.0 + ] + ], + "center_px": [ + 548.0, + 391.0 + ], + "area_px": 346.0 + }, + { + "image_points_px": [ + [ + 576.0, + 409.0 + ], + [ + 587.0, + 423.0 + ], + [ + 569.0, + 432.0 + ], + [ + 558.0, + 418.0 + ] + ], + "center_px": [ + 572.5, + 420.5 + ], + "area_px": 351.0 + }, + { + "image_points_px": [ + [ + 537.0, + 429.0 + ], + [ + 548.0, + 443.0 + ], + [ + 530.0, + 452.0 + ], + [ + 519.0, + 438.0 + ] + ], + "center_px": [ + 533.5, + 440.5 + ], + "area_px": 351.0 + }, + { + "image_points_px": [ + [ + 54.0, + 407.0 + ], + [ + 62.0, + 420.0 + ], + [ + 42.0, + 430.0 + ], + [ + 34.0, + 416.0 + ] + ], + "center_px": [ + 48.0, + 418.25 + ], + "area_px": 346.0 + }, + { + "image_points_px": [ + [ + 157.0, + 396.0 + ], + [ + 165.0, + 410.0 + ], + [ + 145.0, + 419.0 + ], + [ + 137.0, + 406.0 + ] + ], + "center_px": [ + 151.0, + 407.75 + ], + "area_px": 346.0 + }, + { + "image_points_px": [ + [ + 676.0, + 399.0 + ], + [ + 688.0, + 412.0 + ], + [ + 670.0, + 421.0 + ], + [ + 658.0, + 408.0 + ] + ], + "center_px": [ + 673.0, + 410.0 + ], + "area_px": 342.0 + }, + { + "image_points_px": [ + [ + 708.0, + 404.0 + ], + [ + 720.0, + 417.0 + ], + [ + 702.0, + 426.0 + ], + [ + 690.0, + 413.0 + ] + ], + "center_px": [ + 705.0, + 415.0 + ], + "area_px": 342.0 + }, + { + "image_points_px": [ + [ + 639.0, + 419.0 + ], + [ + 650.0, + 433.0 + ], + [ + 633.0, + 442.0 + ], + [ + 621.0, + 428.0 + ] + ], + "center_px": [ + 635.75, + 430.5 + ], + "area_px": 348.5 + }, + { + "image_points_px": [ + [ + 645.0, + 394.0 + ], + [ + 656.0, + 408.0 + ], + [ + 639.0, + 417.0 + ], + [ + 627.0, + 403.0 + ] + ], + "center_px": [ + 641.75, + 405.5 + ], + "area_px": 348.5 + }, + { + "image_points_px": [ + [ + 903.0, + 408.0 + ], + [ + 916.0, + 421.0 + ], + [ + 899.0, + 430.0 + ], + [ + 886.0, + 416.0 + ] + ], + "center_px": [ + 901.0, + 418.75 + ], + "area_px": 340.0 + }, + { + "image_points_px": [ + [ + 871.0, + 403.0 + ], + [ + 884.0, + 416.0 + ], + [ + 867.0, + 425.0 + ], + [ + 854.0, + 411.0 + ] + ], + "center_px": [ + 869.0, + 413.75 + ], + "area_px": 340.0 + }, + { + "image_points_px": [ + [ + 771.0, + 413.0 + ], + [ + 783.0, + 427.0 + ], + [ + 766.0, + 436.0 + ], + [ + 754.0, + 422.0 + ] + ], + "center_px": [ + 768.5, + 424.5 + ], + "area_px": 346.0 + }, + { + "image_points_px": [ + [ + 1034.0, + 402.0 + ], + [ + 1047.0, + 416.0 + ], + [ + 1031.0, + 424.0 + ], + [ + 1017.0, + 411.0 + ] + ], + "center_px": [ + 1032.25, + 413.25 + ], + "area_px": 337.5 + }, + { + "image_points_px": [ + [ + 1001.0, + 397.0 + ], + [ + 1015.0, + 411.0 + ], + [ + 998.0, + 419.0 + ], + [ + 985.0, + 406.0 + ] + ], + "center_px": [ + 999.75, + 408.25 + ], + "area_px": 337.5 + }, + { + "image_points_px": [ + [ + 938.0, + 388.0 + ], + [ + 951.0, + 401.0 + ], + [ + 934.0, + 410.0 + ], + [ + 921.0, + 397.0 + ] + ], + "center_px": [ + 936.0, + 399.0 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 909.0, + 359.0 + ], + [ + 922.0, + 372.0 + ], + [ + 905.0, + 381.0 + ], + [ + 892.0, + 368.0 + ] + ], + "center_px": [ + 907.0, + 370.0 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 839.0, + 398.0 + ], + [ + 852.0, + 411.0 + ], + [ + 835.0, + 420.0 + ], + [ + 822.0, + 407.0 + ] + ], + "center_px": [ + 837.0, + 409.0 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 906.0, + 383.0 + ], + [ + 919.0, + 396.0 + ], + [ + 902.0, + 405.0 + ], + [ + 889.0, + 392.0 + ] + ], + "center_px": [ + 904.0, + 394.0 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 1036.0, + 378.0 + ], + [ + 1049.0, + 391.0 + ], + [ + 1034.0, + 400.0 + ], + [ + 1019.0, + 386.0 + ] + ], + "center_px": [ + 1034.5, + 388.75 + ], + "area_px": 335.0 + }, + { + "image_points_px": [ + [ + 1066.0, + 407.0 + ], + [ + 1080.0, + 421.0 + ], + [ + 1064.0, + 429.0 + ], + [ + 1050.0, + 416.0 + ] + ], + "center_px": [ + 1065.0, + 418.25 + ], + "area_px": 335.0 + }, + { + "image_points_px": [ + [ + 1067.0, + 382.0 + ], + [ + 1081.0, + 396.0 + ], + [ + 1065.0, + 404.0 + ], + [ + 1051.0, + 391.0 + ] + ], + "center_px": [ + 1066.0, + 393.25 + ], + "area_px": 335.0 + }, + { + "image_points_px": [ + [ + 1132.0, + 392.0 + ], + [ + 1146.0, + 405.0 + ], + [ + 1131.0, + 414.0 + ], + [ + 1116.0, + 400.0 + ] + ], + "center_px": [ + 1131.25, + 402.75 + ], + "area_px": 332.5 + }, + { + "image_points_px": [ + [ + 1005.0, + 349.0 + ], + [ + 1019.0, + 362.0 + ], + [ + 1003.0, + 371.0 + ], + [ + 989.0, + 358.0 + ] + ], + "center_px": [ + 1004.0, + 360.0 + ], + "area_px": 334.0 + }, + { + "image_points_px": [ + [ + 139.0, + 368.0 + ], + [ + 147.0, + 381.0 + ], + [ + 127.0, + 390.0 + ], + [ + 119.0, + 376.0 + ] + ], + "center_px": [ + 133.0, + 378.75 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 79.0, + 359.0 + ], + [ + 87.0, + 372.0 + ], + [ + 67.0, + 381.0 + ], + [ + 59.0, + 367.0 + ] + ], + "center_px": [ + 73.0, + 369.75 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 714.0, + 380.0 + ], + [ + 725.0, + 393.0 + ], + [ + 708.0, + 401.0 + ], + [ + 695.0, + 388.0 + ] + ], + "center_px": [ + 710.5, + 390.5 + ], + "area_px": 330.0 + }, + { + "image_points_px": [ + [ + 37.0, + 378.0 + ], + [ + 45.0, + 391.0 + ], + [ + 24.0, + 400.0 + ], + [ + 17.0, + 387.0 + ] + ], + "center_px": [ + 30.75, + 389.0 + ], + "area_px": 334.0 + }, + { + "image_points_px": [ + [ + 1164.0, + 372.0 + ], + [ + 1179.0, + 385.0 + ], + [ + 1163.0, + 394.0 + ], + [ + 1149.0, + 381.0 + ] + ], + "center_px": [ + 1163.75, + 383.0 + ], + "area_px": 332.0 + }, + { + "image_points_px": [ + [ + 614.0, + 390.0 + ], + [ + 625.0, + 403.0 + ], + [ + 607.0, + 412.0 + ], + [ + 596.0, + 398.0 + ] + ], + "center_px": [ + 610.5, + 400.75 + ], + "area_px": 336.5 + }, + { + "image_points_px": [ + [ + 583.0, + 385.0 + ], + [ + 594.0, + 398.0 + ], + [ + 576.0, + 407.0 + ], + [ + 565.0, + 393.0 + ] + ], + "center_px": [ + 579.5, + 395.75 + ], + "area_px": 336.5 + }, + { + "image_points_px": [ + [ + 1098.0, + 387.0 + ], + [ + 1114.0, + 400.0 + ], + [ + 1099.0, + 409.0 + ], + [ + 1084.0, + 396.0 + ] + ], + "center_px": [ + 1098.75, + 398.0 + ], + "area_px": 328.0 + }, + { + "image_points_px": [ + [ + 1195.0, + 377.0 + ], + [ + 1211.0, + 390.0 + ], + [ + 1196.0, + 399.0 + ], + [ + 1181.0, + 386.0 + ] + ], + "center_px": [ + 1195.75, + 388.0 + ], + "area_px": 328.0 + }, + { + "image_points_px": [ + [ + 1195.0, + 353.0 + ], + [ + 1211.0, + 366.0 + ], + [ + 1196.0, + 375.0 + ], + [ + 1181.0, + 362.0 + ] + ], + "center_px": [ + 1195.75, + 364.0 + ], + "area_px": 328.0 + }, + { + "image_points_px": [ + [ + 1196.0, + 401.0 + ], + [ + 1211.0, + 414.0 + ], + [ + 1198.0, + 423.0 + ], + [ + 1181.0, + 410.0 + ] + ], + "center_px": [ + 1196.5, + 412.0 + ], + "area_px": 326.0 + }, + { + "image_points_px": [ + [ + 1261.0, + 386.0 + ], + [ + 1276.0, + 399.0 + ], + [ + 1263.0, + 408.0 + ], + [ + 1246.0, + 395.0 + ] + ], + "center_px": [ + 1261.5, + 397.0 + ], + "area_px": 326.0 + }, + { + "image_points_px": [ + [ + 1228.0, + 406.0 + ], + [ + 1244.0, + 419.0 + ], + [ + 1231.0, + 428.0 + ], + [ + 1214.0, + 415.0 + ] + ], + "center_px": [ + 1229.25, + 417.0 + ], + "area_px": 324.0 + }, + { + "image_points_px": [ + [ + 67.0, + 383.0 + ], + [ + 75.0, + 395.0 + ], + [ + 55.0, + 405.0 + ], + [ + 47.0, + 391.0 + ] + ], + "center_px": [ + 61.0, + 393.5 + ], + "area_px": 332.0 + }, + { + "image_points_px": [ + [ + 127.0, + 392.0 + ], + [ + 135.0, + 405.0 + ], + [ + 115.0, + 414.0 + ], + [ + 107.0, + 401.0 + ] + ], + "center_px": [ + 121.0, + 403.0 + ], + "area_px": 332.0 + }, + { + "image_points_px": [ + [ + 97.0, + 387.0 + ], + [ + 105.0, + 400.0 + ], + [ + 85.0, + 409.0 + ], + [ + 77.0, + 396.0 + ] + ], + "center_px": [ + 91.0, + 398.0 + ], + "area_px": 332.0 + }, + { + "image_points_px": [ + [ + 940.0, + 364.0 + ], + [ + 954.0, + 377.0 + ], + [ + 936.0, + 385.0 + ], + [ + 924.0, + 372.0 + ] + ], + "center_px": [ + 938.5, + 374.5 + ], + "area_px": 325.0 + }, + { + "image_points_px": [ + [ + 1037.0, + 354.0 + ], + [ + 1051.0, + 367.0 + ], + [ + 1034.0, + 375.0 + ], + [ + 1021.0, + 362.0 + ] + ], + "center_px": [ + 1035.75, + 364.5 + ], + "area_px": 322.5 + }, + { + "image_points_px": [ + [ + 776.0, + 389.0 + ], + [ + 788.0, + 402.0 + ], + [ + 771.0, + 411.0 + ], + [ + 759.0, + 397.0 + ] + ], + "center_px": [ + 773.5, + 399.75 + ], + "area_px": 331.5 + }, + { + "image_points_px": [ + [ + 558.0, + 356.0 + ], + [ + 569.0, + 369.0 + ], + [ + 552.0, + 378.0 + ], + [ + 540.0, + 365.0 + ] + ], + "center_px": [ + 554.75, + 367.0 + ], + "area_px": 331.0 + }, + { + "image_points_px": [ + [ + 108.0, + 363.0 + ], + [ + 117.0, + 376.0 + ], + [ + 97.0, + 385.0 + ], + [ + 89.0, + 372.0 + ] + ], + "center_px": [ + 102.75, + 374.0 + ], + "area_px": 330.0 + }, + { + "image_points_px": [ + [ + 843.0, + 374.0 + ], + [ + 855.0, + 387.0 + ], + [ + 839.0, + 396.0 + ], + [ + 826.0, + 382.0 + ] + ], + "center_px": [ + 840.75, + 384.75 + ], + "area_px": 329.0 + }, + { + "image_points_px": [ + [ + 749.0, + 360.0 + ], + [ + 761.0, + 373.0 + ], + [ + 744.0, + 382.0 + ], + [ + 732.0, + 369.0 + ] + ], + "center_px": [ + 746.5, + 371.0 + ], + "area_px": 329.0 + }, + { + "image_points_px": [ + [ + 723.0, + 332.0 + ], + [ + 735.0, + 345.0 + ], + [ + 718.0, + 354.0 + ], + [ + 706.0, + 341.0 + ] + ], + "center_px": [ + 720.5, + 343.0 + ], + "area_px": 329.0 + }, + { + "image_points_px": [ + [ + 744.0, + 384.0 + ], + [ + 756.0, + 397.0 + ], + [ + 739.0, + 406.0 + ], + [ + 727.0, + 393.0 + ] + ], + "center_px": [ + 741.5, + 395.0 + ], + "area_px": 329.0 + }, + { + "image_points_px": [ + [ + 650.0, + 370.0 + ], + [ + 662.0, + 383.0 + ], + [ + 645.0, + 392.0 + ], + [ + 633.0, + 379.0 + ] + ], + "center_px": [ + 647.5, + 381.0 + ], + "area_px": 329.0 + }, + { + "image_points_px": [ + [ + 687.0, + 351.0 + ], + [ + 699.0, + 364.0 + ], + [ + 682.0, + 373.0 + ], + [ + 670.0, + 360.0 + ] + ], + "center_px": [ + 684.5, + 362.0 + ], + "area_px": 329.0 + }, + { + "image_points_px": [ + [ + 1132.0, + 344.0 + ], + [ + 1147.0, + 357.0 + ], + [ + 1131.0, + 365.0 + ], + [ + 1117.0, + 352.0 + ] + ], + "center_px": [ + 1131.75, + 354.5 + ], + "area_px": 317.5 + }, + { + "image_points_px": [ + [ + 1007.0, + 326.0 + ], + [ + 1021.0, + 339.0 + ], + [ + 1005.0, + 347.0 + ], + [ + 991.0, + 335.0 + ] + ], + "center_px": [ + 1006.0, + 336.75 + ], + "area_px": 319.0 + }, + { + "image_points_px": [ + [ + 1245.0, + 371.0 + ], + [ + 1261.0, + 363.0 + ], + [ + 1275.0, + 376.0 + ], + [ + 1261.0, + 384.0 + ] + ], + "center_px": [ + 1260.5, + 373.5 + ], + "area_px": 315.0 + }, + { + "image_points_px": [ + [ + 1101.0, + 340.0 + ], + [ + 1115.0, + 352.0 + ], + [ + 1100.0, + 361.0 + ], + [ + 1085.0, + 348.0 + ] + ], + "center_px": [ + 1100.25, + 350.25 + ], + "area_px": 317.0 + }, + { + "image_points_px": [ + [ + 1102.0, + 317.0 + ], + [ + 1116.0, + 329.0 + ], + [ + 1101.0, + 338.0 + ], + [ + 1086.0, + 325.0 + ] + ], + "center_px": [ + 1101.25, + 327.25 + ], + "area_px": 317.0 + }, + { + "image_points_px": [ + [ + 1165.0, + 349.0 + ], + [ + 1179.0, + 361.0 + ], + [ + 1164.0, + 370.0 + ], + [ + 1149.0, + 357.0 + ] + ], + "center_px": [ + 1164.25, + 359.25 + ], + "area_px": 317.0 + }, + { + "image_points_px": [ + [ + 846.0, + 350.0 + ], + [ + 859.0, + 363.0 + ], + [ + 842.0, + 372.0 + ], + [ + 830.0, + 359.0 + ] + ], + "center_px": [ + 844.25, + 361.0 + ], + "area_px": 327.0 + }, + { + "image_points_px": [ + [ + 811.0, + 369.0 + ], + [ + 824.0, + 382.0 + ], + [ + 807.0, + 391.0 + ], + [ + 795.0, + 378.0 + ] + ], + "center_px": [ + 809.25, + 380.0 + ], + "area_px": 327.0 + }, + { + "image_points_px": [ + [ + 1003.0, + 373.0 + ], + [ + 1017.0, + 386.0 + ], + [ + 1001.0, + 395.0 + ], + [ + 988.0, + 381.0 + ] + ], + "center_px": [ + 1002.25, + 383.75 + ], + "area_px": 324.0 + }, + { + "image_points_px": [ + [ + 1164.0, + 303.0 + ], + [ + 1179.0, + 315.0 + ], + [ + 1164.0, + 324.0 + ], + [ + 1149.0, + 311.0 + ] + ], + "center_px": [ + 1164.0, + 313.25 + ], + "area_px": 315.0 + }, + { + "image_points_px": [ + [ + 1227.0, + 358.0 + ], + [ + 1243.0, + 371.0 + ], + [ + 1229.0, + 379.0 + ], + [ + 1213.0, + 366.0 + ] + ], + "center_px": [ + 1228.0, + 368.5 + ], + "area_px": 310.0 + }, + { + "image_points_px": [ + [ + 620.0, + 366.0 + ], + [ + 631.0, + 379.0 + ], + [ + 613.0, + 387.0 + ], + [ + 602.0, + 374.0 + ] + ], + "center_px": [ + 616.5, + 376.5 + ], + "area_px": 322.0 + }, + { + "image_points_px": [ + [ + 1100.0, + 363.0 + ], + [ + 1114.0, + 376.0 + ], + [ + 1099.0, + 385.0 + ], + [ + 1085.0, + 371.0 + ] + ], + "center_px": [ + 1099.5, + 373.75 + ], + "area_px": 321.5 + }, + { + "image_points_px": [ + [ + 1068.0, + 358.0 + ], + [ + 1082.0, + 372.0 + ], + [ + 1067.0, + 380.0 + ], + [ + 1053.0, + 367.0 + ] + ], + "center_px": [ + 1067.5, + 369.25 + ], + "area_px": 321.5 + }, + { + "image_points_px": [ + [ + 50.0, + 354.0 + ], + [ + 57.0, + 367.0 + ], + [ + 37.0, + 376.0 + ], + [ + 30.0, + 363.0 + ] + ], + "center_px": [ + 43.5, + 365.0 + ], + "area_px": 323.0 + }, + { + "image_points_px": [ + [ + 1257.0, + 316.0 + ], + [ + 1273.0, + 328.0 + ], + [ + 1259.0, + 337.0 + ], + [ + 1243.0, + 324.0 + ] + ], + "center_px": [ + 1258.0, + 326.25 + ], + "area_px": 311.0 + }, + { + "image_points_px": [ + [ + 1258.0, + 339.0 + ], + [ + 1274.0, + 351.0 + ], + [ + 1260.0, + 360.0 + ], + [ + 1244.0, + 347.0 + ] + ], + "center_px": [ + 1259.0, + 349.25 + ], + "area_px": 311.0 + }, + { + "image_points_px": [ + [ + 121.0, + 340.0 + ], + [ + 129.0, + 352.0 + ], + [ + 109.0, + 361.0 + ], + [ + 101.0, + 348.0 + ] + ], + "center_px": [ + 115.0, + 350.25 + ], + "area_px": 318.0 + }, + { + "image_points_px": [ + [ + 596.0, + 338.0 + ], + [ + 607.0, + 350.0 + ], + [ + 589.0, + 359.0 + ], + [ + 578.0, + 346.0 + ] + ], + "center_px": [ + 592.5, + 348.25 + ], + "area_px": 318.5 + }, + { + "image_points_px": [ + [ + 780.0, + 365.0 + ], + [ + 792.0, + 378.0 + ], + [ + 775.0, + 386.0 + ], + [ + 763.0, + 373.0 + ] + ], + "center_px": [ + 777.5, + 375.5 + ], + "area_px": 317.0 + }, + { + "image_points_px": [ + [ + 657.0, + 347.0 + ], + [ + 668.0, + 359.0 + ], + [ + 651.0, + 368.0 + ], + [ + 639.0, + 355.0 + ] + ], + "center_px": [ + 653.75, + 357.25 + ], + "area_px": 316.5 + }, + { + "image_points_px": [ + [ + 662.0, + 323.0 + ], + [ + 674.0, + 336.0 + ], + [ + 656.0, + 344.0 + ], + [ + 645.0, + 332.0 + ] + ], + "center_px": [ + 659.25, + 333.75 + ], + "area_px": 316.5 + }, + { + "image_points_px": [ + [ + 1227.0, + 382.0 + ], + [ + 1243.0, + 394.0 + ], + [ + 1229.0, + 404.0 + ], + [ + 1214.0, + 391.0 + ] + ], + "center_px": [ + 1228.25, + 392.75 + ], + "area_px": 316.0 + }, + { + "image_points_px": [ + [ + 589.0, + 361.0 + ], + [ + 600.0, + 374.0 + ], + [ + 583.0, + 383.0 + ], + [ + 572.0, + 369.0 + ] + ], + "center_px": [ + 586.0, + 371.75 + ], + "area_px": 323.0 + }, + { + "image_points_px": [ + [ + 682.0, + 375.0 + ], + [ + 693.0, + 388.0 + ], + [ + 676.0, + 397.0 + ], + [ + 665.0, + 383.0 + ] + ], + "center_px": [ + 679.0, + 385.75 + ], + "area_px": 323.0 + }, + { + "image_points_px": [ + [ + 878.0, + 355.0 + ], + [ + 890.0, + 368.0 + ], + [ + 874.0, + 376.0 + ], + [ + 861.0, + 363.0 + ] + ], + "center_px": [ + 875.75, + 365.5 + ], + "area_px": 314.5 + }, + { + "image_points_px": [ + [ + 784.0, + 341.0 + ], + [ + 797.0, + 354.0 + ], + [ + 779.0, + 362.0 + ], + [ + 768.0, + 350.0 + ] + ], + "center_px": [ + 782.0, + 351.75 + ], + "area_px": 314.5 + }, + { + "image_points_px": [ + [ + 816.0, + 346.0 + ], + [ + 828.0, + 358.0 + ], + [ + 811.0, + 367.0 + ], + [ + 799.0, + 354.0 + ] + ], + "center_px": [ + 813.5, + 356.25 + ], + "area_px": 314.5 + }, + { + "image_points_px": [ + [ + 754.0, + 337.0 + ], + [ + 766.0, + 349.0 + ], + [ + 749.0, + 358.0 + ], + [ + 737.0, + 345.0 + ] + ], + "center_px": [ + 751.5, + 347.25 + ], + "area_px": 314.5 + }, + { + "image_points_px": [ + [ + 718.0, + 356.0 + ], + [ + 730.0, + 368.0 + ], + [ + 713.0, + 377.0 + ], + [ + 701.0, + 364.0 + ] + ], + "center_px": [ + 715.5, + 366.25 + ], + "area_px": 314.5 + }, + { + "image_points_px": [ + [ + 91.0, + 335.0 + ], + [ + 99.0, + 348.0 + ], + [ + 80.0, + 357.0 + ], + [ + 72.0, + 344.0 + ] + ], + "center_px": [ + 85.5, + 346.0 + ], + "area_px": 319.0 + }, + { + "image_points_px": [ + [ + 972.0, + 369.0 + ], + [ + 985.0, + 382.0 + ], + [ + 969.0, + 390.0 + ], + [ + 956.0, + 377.0 + ] + ], + "center_px": [ + 970.5, + 379.5 + ], + "area_px": 312.0 + }, + { + "image_points_px": [ + [ + 974.0, + 345.0 + ], + [ + 987.0, + 358.0 + ], + [ + 971.0, + 366.0 + ], + [ + 958.0, + 353.0 + ] + ], + "center_px": [ + 972.5, + 355.5 + ], + "area_px": 312.0 + }, + { + "image_points_px": [ + [ + 1212.0, + 343.0 + ], + [ + 1228.0, + 335.0 + ], + [ + 1242.0, + 347.0 + ], + [ + 1227.0, + 355.0 + ] + ], + "center_px": [ + 1227.25, + 345.0 + ], + "area_px": 302.0 + }, + { + "image_points_px": [ + [ + 1149.0, + 334.0 + ], + [ + 1164.0, + 326.0 + ], + [ + 1179.0, + 338.0 + ], + [ + 1163.0, + 346.0 + ] + ], + "center_px": [ + 1163.75, + 336.0 + ], + "area_px": 302.0 + }, + { + "image_points_px": [ + [ + 976.0, + 322.0 + ], + [ + 989.0, + 335.0 + ], + [ + 974.0, + 343.0 + ], + [ + 960.0, + 330.0 + ] + ], + "center_px": [ + 974.75, + 332.5 + ], + "area_px": 309.5 + }, + { + "image_points_px": [ + [ + 942.0, + 340.0 + ], + [ + 956.0, + 353.0 + ], + [ + 939.0, + 361.0 + ], + [ + 927.0, + 349.0 + ] + ], + "center_px": [ + 941.0, + 350.75 + ], + "area_px": 310.5 + }, + { + "image_points_px": [ + [ + 1133.0, + 321.0 + ], + [ + 1147.0, + 334.0 + ], + [ + 1132.0, + 342.0 + ], + [ + 1118.0, + 329.0 + ] + ], + "center_px": [ + 1132.5, + 331.5 + ], + "area_px": 307.0 + }, + { + "image_points_px": [ + [ + 1038.0, + 331.0 + ], + [ + 1052.0, + 343.0 + ], + [ + 1037.0, + 352.0 + ], + [ + 1023.0, + 339.0 + ] + ], + "center_px": [ + 1037.5, + 341.25 + ], + "area_px": 306.5 + }, + { + "image_points_px": [ + [ + 1069.0, + 335.0 + ], + [ + 1083.0, + 348.0 + ], + [ + 1068.0, + 356.0 + ], + [ + 1054.0, + 344.0 + ] + ], + "center_px": [ + 1068.5, + 345.75 + ], + "area_px": 306.5 + }, + { + "image_points_px": [ + [ + 565.0, + 333.0 + ], + [ + 576.0, + 346.0 + ], + [ + 558.0, + 354.0 + ], + [ + 548.0, + 341.0 + ] + ], + "center_px": [ + 561.75, + 343.5 + ], + "area_px": 311.5 + }, + { + "image_points_px": [ + [ + 62.0, + 331.0 + ], + [ + 69.0, + 344.0 + ], + [ + 50.0, + 352.0 + ], + [ + 42.0, + 340.0 + ] + ], + "center_px": [ + 55.75, + 341.75 + ], + "area_px": 307.5 + }, + { + "image_points_px": [ + [ + 1195.0, + 330.0 + ], + [ + 1210.0, + 342.0 + ], + [ + 1196.0, + 351.0 + ], + [ + 1181.0, + 339.0 + ] + ], + "center_px": [ + 1195.5, + 340.5 + ], + "area_px": 303.0 + }, + { + "image_points_px": [ + [ + 1131.0, + 368.0 + ], + [ + 1146.0, + 380.0 + ], + [ + 1132.0, + 389.0 + ], + [ + 1117.0, + 377.0 + ] + ], + "center_px": [ + 1131.5, + 378.5 + ], + "area_px": 303.0 + }, + { + "image_points_px": [ + [ + 626.0, + 342.0 + ], + [ + 637.0, + 355.0 + ], + [ + 620.0, + 363.0 + ], + [ + 609.0, + 350.0 + ] + ], + "center_px": [ + 623.0, + 352.5 + ], + "area_px": 309.0 + }, + { + "image_points_px": [ + [ + 728.0, + 310.0 + ], + [ + 740.0, + 322.0 + ], + [ + 723.0, + 330.0 + ], + [ + 711.0, + 318.0 + ] + ], + "center_px": [ + 725.5, + 320.0 + ], + "area_px": 300.0 + }, + { + "image_points_px": [ + [ + 793.0, + 296.0 + ], + [ + 805.0, + 308.0 + ], + [ + 788.0, + 316.0 + ], + [ + 776.0, + 304.0 + ] + ], + "center_px": [ + 790.5, + 306.0 + ], + "area_px": 300.0 + }, + { + "image_points_px": [ + [ + 698.0, + 305.0 + ], + [ + 709.0, + 318.0 + ], + [ + 693.0, + 326.0 + ], + [ + 681.0, + 313.0 + ] + ], + "center_px": [ + 695.25, + 315.5 + ], + "area_px": 306.5 + }, + { + "image_points_px": [ + [ + 819.0, + 323.0 + ], + [ + 832.0, + 335.0 + ], + [ + 815.0, + 343.0 + ], + [ + 803.0, + 331.0 + ] + ], + "center_px": [ + 817.25, + 333.0 + ], + "area_px": 298.0 + }, + { + "image_points_px": [ + [ + 693.0, + 328.0 + ], + [ + 704.0, + 340.0 + ], + [ + 687.0, + 349.0 + ], + [ + 676.0, + 336.0 + ] + ], + "center_px": [ + 690.0, + 338.25 + ], + "area_px": 306.0 + }, + { + "image_points_px": [ + [ + 632.0, + 319.0 + ], + [ + 643.0, + 331.0 + ], + [ + 626.0, + 340.0 + ], + [ + 615.0, + 327.0 + ] + ], + "center_px": [ + 629.0, + 329.25 + ], + "area_px": 306.0 + }, + { + "image_points_px": [ + [ + 917.0, + 291.0 + ], + [ + 930.0, + 303.0 + ], + [ + 914.0, + 311.0 + ], + [ + 901.0, + 299.0 + ] + ], + "center_px": [ + 915.5, + 301.0 + ], + "area_px": 296.0 + }, + { + "image_points_px": [ + [ + 850.0, + 327.0 + ], + [ + 862.0, + 340.0 + ], + [ + 846.0, + 348.0 + ], + [ + 834.0, + 335.0 + ] + ], + "center_px": [ + 848.0, + 337.5 + ], + "area_px": 304.0 + }, + { + "image_points_px": [ + [ + 945.0, + 318.0 + ], + [ + 958.0, + 330.0 + ], + [ + 942.0, + 338.0 + ], + [ + 929.0, + 326.0 + ] + ], + "center_px": [ + 943.5, + 328.0 + ], + "area_px": 296.0 + }, + { + "image_points_px": [ + [ + 823.0, + 300.0 + ], + [ + 835.0, + 313.0 + ], + [ + 819.0, + 321.0 + ], + [ + 807.0, + 308.0 + ] + ], + "center_px": [ + 821.0, + 310.5 + ], + "area_px": 304.0 + }, + { + "image_points_px": [ + [ + 608.0, + 292.0 + ], + [ + 619.0, + 304.0 + ], + [ + 602.0, + 313.0 + ], + [ + 591.0, + 301.0 + ] + ], + "center_px": [ + 605.0, + 302.5 + ], + "area_px": 303.0 + }, + { + "image_points_px": [ + [ + 1011.0, + 282.0 + ], + [ + 1024.0, + 294.0 + ], + [ + 1009.0, + 302.0 + ], + [ + 995.0, + 290.0 + ] + ], + "center_px": [ + 1009.75, + 292.0 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 950.0, + 273.0 + ], + [ + 963.0, + 285.0 + ], + [ + 948.0, + 293.0 + ], + [ + 934.0, + 281.0 + ] + ], + "center_px": [ + 948.75, + 283.0 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 911.0, + 336.0 + ], + [ + 924.0, + 349.0 + ], + [ + 908.0, + 357.0 + ], + [ + 896.0, + 344.0 + ] + ], + "center_px": [ + 909.75, + 346.5 + ], + "area_px": 301.5 + }, + { + "image_points_px": [ + [ + 758.0, + 314.0 + ], + [ + 770.0, + 326.0 + ], + [ + 754.0, + 335.0 + ], + [ + 742.0, + 322.0 + ] + ], + "center_px": [ + 756.0, + 324.25 + ], + "area_px": 302.0 + }, + { + "image_points_px": [ + [ + 1041.0, + 286.0 + ], + [ + 1055.0, + 298.0 + ], + [ + 1040.0, + 306.0 + ], + [ + 1026.0, + 294.0 + ] + ], + "center_px": [ + 1040.5, + 296.0 + ], + "area_px": 292.0 + }, + { + "image_points_px": [ + [ + 33.0, + 327.0 + ], + [ + 40.0, + 339.0 + ], + [ + 20.0, + 347.0 + ], + [ + 13.0, + 335.0 + ] + ], + "center_px": [ + 26.5, + 337.0 + ], + "area_px": 296.0 + }, + { + "image_points_px": [ + [ + 914.0, + 313.0 + ], + [ + 927.0, + 326.0 + ], + [ + 912.0, + 334.0 + ], + [ + 899.0, + 321.0 + ] + ], + "center_px": [ + 913.0, + 323.5 + ], + "area_px": 299.0 + }, + { + "image_points_px": [ + [ + 978.0, + 299.0 + ], + [ + 991.0, + 312.0 + ], + [ + 976.0, + 320.0 + ], + [ + 963.0, + 307.0 + ] + ], + "center_px": [ + 977.0, + 309.5 + ], + "area_px": 299.0 + }, + { + "image_points_px": [ + [ + 348.0, + 325.0 + ], + [ + 357.0, + 337.0 + ], + [ + 339.0, + 346.0 + ], + [ + 330.0, + 333.0 + ] + ], + "center_px": [ + 343.5, + 335.25 + ], + "area_px": 301.5 + }, + { + "image_points_px": [ + [ + 1039.0, + 308.0 + ], + [ + 1053.0, + 321.0 + ], + [ + 1038.0, + 329.0 + ], + [ + 1025.0, + 316.0 + ] + ], + "center_px": [ + 1038.75, + 318.5 + ], + "area_px": 296.5 + }, + { + "image_points_px": [ + [ + 1256.0, + 294.0 + ], + [ + 1272.0, + 306.0 + ], + [ + 1258.0, + 314.0 + ], + [ + 1243.0, + 302.0 + ] + ], + "center_px": [ + 1257.25, + 304.0 + ], + "area_px": 286.0 + }, + { + "image_points_px": [ + [ + 1255.0, + 272.0 + ], + [ + 1271.0, + 284.0 + ], + [ + 1257.0, + 292.0 + ], + [ + 1242.0, + 280.0 + ] + ], + "center_px": [ + 1256.25, + 282.0 + ], + "area_px": 286.0 + }, + { + "image_points_px": [ + [ + 1226.0, + 289.0 + ], + [ + 1241.0, + 301.0 + ], + [ + 1228.0, + 309.0 + ], + [ + 1212.0, + 298.0 + ] + ], + "center_px": [ + 1226.75, + 299.25 + ], + "area_px": 287.0 + }, + { + "image_points_px": [ + [ + 542.0, + 306.0 + ], + [ + 553.0, + 318.0 + ], + [ + 535.0, + 327.0 + ], + [ + 526.0, + 313.0 + ] + ], + "center_px": [ + 539.0, + 316.0 + ], + "area_px": 301.0 + }, + { + "image_points_px": [ + [ + 1225.0, + 312.0 + ], + [ + 1241.0, + 323.0 + ], + [ + 1228.0, + 332.0 + ], + [ + 1212.0, + 320.0 + ] + ], + "center_px": [ + 1226.5, + 321.75 + ], + "area_px": 285.5 + }, + { + "image_points_px": [ + [ + 45.0, + 304.0 + ], + [ + 53.0, + 316.0 + ], + [ + 33.0, + 324.0 + ], + [ + 26.0, + 312.0 + ] + ], + "center_px": [ + 39.25, + 314.0 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 86.0, + 286.0 + ], + [ + 94.0, + 298.0 + ], + [ + 74.0, + 306.0 + ], + [ + 67.0, + 294.0 + ] + ], + "center_px": [ + 80.25, + 296.0 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 1102.0, + 294.0 + ], + [ + 1116.0, + 307.0 + ], + [ + 1102.0, + 315.0 + ], + [ + 1088.0, + 302.0 + ] + ], + "center_px": [ + 1102.0, + 304.5 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 602.0, + 315.0 + ], + [ + 613.0, + 327.0 + ], + [ + 595.0, + 335.0 + ], + [ + 585.0, + 323.0 + ] + ], + "center_px": [ + 598.75, + 325.0 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 579.0, + 288.0 + ], + [ + 589.0, + 300.0 + ], + [ + 572.0, + 308.0 + ], + [ + 561.0, + 296.0 + ] + ], + "center_px": [ + 575.25, + 298.0 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 572.0, + 310.0 + ], + [ + 582.0, + 323.0 + ], + [ + 565.0, + 331.0 + ], + [ + 555.0, + 318.0 + ] + ], + "center_px": [ + 568.5, + 320.5 + ], + "area_px": 301.0 + }, + { + "image_points_px": [ + [ + 74.0, + 308.0 + ], + [ + 81.0, + 321.0 + ], + [ + 62.0, + 329.0 + ], + [ + 55.0, + 317.0 + ] + ], + "center_px": [ + 68.0, + 318.75 + ], + "area_px": 297.0 + }, + { + "image_points_px": [ + [ + 638.0, + 297.0 + ], + [ + 649.0, + 309.0 + ], + [ + 632.0, + 317.0 + ], + [ + 621.0, + 305.0 + ] + ], + "center_px": [ + 635.0, + 307.0 + ], + "area_px": 292.0 + }, + { + "image_points_px": [ + [ + 703.0, + 283.0 + ], + [ + 714.0, + 295.0 + ], + [ + 697.0, + 303.0 + ], + [ + 686.0, + 291.0 + ] + ], + "center_px": [ + 700.0, + 293.0 + ], + "area_px": 292.0 + }, + { + "image_points_px": [ + [ + 668.0, + 301.0 + ], + [ + 679.0, + 313.0 + ], + [ + 662.0, + 321.0 + ], + [ + 651.0, + 309.0 + ] + ], + "center_px": [ + 665.0, + 311.0 + ], + "area_px": 292.0 + }, + { + "image_points_px": [ + [ + 57.0, + 282.0 + ], + [ + 65.0, + 294.0 + ], + [ + 46.0, + 302.0 + ], + [ + 38.0, + 290.0 + ] + ], + "center_px": [ + 51.5, + 292.0 + ], + "area_px": 292.0 + }, + { + "image_points_px": [ + [ + 69.0, + 260.0 + ], + [ + 77.0, + 272.0 + ], + [ + 58.0, + 280.0 + ], + [ + 50.0, + 268.0 + ] + ], + "center_px": [ + 63.5, + 270.0 + ], + "area_px": 292.0 + }, + { + "image_points_px": [ + [ + 1181.0, + 315.0 + ], + [ + 1196.0, + 308.0 + ], + [ + 1210.0, + 320.0 + ], + [ + 1195.0, + 327.0 + ] + ], + "center_px": [ + 1195.5, + 317.5 + ], + "area_px": 278.0 + }, + { + "image_points_px": [ + [ + 1119.0, + 285.0 + ], + [ + 1134.0, + 277.0 + ], + [ + 1148.0, + 289.0 + ], + [ + 1132.0, + 296.0 + ] + ], + "center_px": [ + 1133.25, + 286.75 + ], + "area_px": 279.5 + }, + { + "image_points_px": [ + [ + 789.0, + 319.0 + ], + [ + 800.0, + 331.0 + ], + [ + 784.0, + 339.0 + ], + [ + 772.0, + 327.0 + ] + ], + "center_px": [ + 786.25, + 329.0 + ], + "area_px": 290.0 + }, + { + "image_points_px": [ + [ + 1181.0, + 293.0 + ], + [ + 1196.0, + 286.0 + ], + [ + 1210.0, + 297.0 + ], + [ + 1195.0, + 305.0 + ] + ], + "center_px": [ + 1195.5, + 295.25 + ], + "area_px": 277.5 + }, + { + "image_points_px": [ + [ + 854.0, + 305.0 + ], + [ + 865.0, + 317.0 + ], + [ + 850.0, + 325.0 + ], + [ + 837.0, + 313.0 + ] + ], + "center_px": [ + 851.5, + 315.0 + ], + "area_px": 288.0 + }, + { + "image_points_px": [ + [ + 884.0, + 309.0 + ], + [ + 896.0, + 321.0 + ], + [ + 880.0, + 329.0 + ], + [ + 868.0, + 317.0 + ] + ], + "center_px": [ + 882.0, + 319.0 + ], + "area_px": 288.0 + }, + { + "image_points_px": [ + [ + 827.0, + 278.0 + ], + [ + 839.0, + 290.0 + ], + [ + 823.0, + 298.0 + ], + [ + 811.0, + 286.0 + ] + ], + "center_px": [ + 825.0, + 288.0 + ], + "area_px": 288.0 + }, + { + "image_points_px": [ + [ + 797.0, + 274.0 + ], + [ + 809.0, + 286.0 + ], + [ + 793.0, + 294.0 + ], + [ + 781.0, + 282.0 + ] + ], + "center_px": [ + 795.0, + 284.0 + ], + "area_px": 288.0 + }, + { + "image_points_px": [ + [ + 881.0, + 332.0 + ], + [ + 893.0, + 344.0 + ], + [ + 877.0, + 352.0 + ], + [ + 865.0, + 340.0 + ] + ], + "center_px": [ + 879.0, + 342.0 + ], + "area_px": 288.0 + }, + { + "image_points_px": [ + [ + 1241.0, + 258.0 + ], + [ + 1255.0, + 250.0 + ], + [ + 1270.0, + 262.0 + ], + [ + 1255.0, + 269.0 + ] + ], + "center_px": [ + 1255.25, + 259.75 + ], + "area_px": 275.5 + }, + { + "image_points_px": [ + [ + 1071.0, + 313.0 + ], + [ + 1084.0, + 325.0 + ], + [ + 1069.0, + 333.0 + ], + [ + 1056.0, + 320.0 + ] + ], + "center_px": [ + 1070.0, + 322.75 + ], + "area_px": 285.0 + }, + { + "image_points_px": [ + [ + 1009.0, + 304.0 + ], + [ + 1022.0, + 316.0 + ], + [ + 1007.0, + 324.0 + ], + [ + 994.0, + 311.0 + ] + ], + "center_px": [ + 1008.0, + 313.75 + ], + "area_px": 285.0 + }, + { + "image_points_px": [ + [ + 947.0, + 295.0 + ], + [ + 960.0, + 308.0 + ], + [ + 945.0, + 315.0 + ], + [ + 932.0, + 303.0 + ] + ], + "center_px": [ + 946.0, + 305.25 + ], + "area_px": 285.0 + }, + { + "image_points_px": [ + [ + 1072.0, + 290.0 + ], + [ + 1085.0, + 303.0 + ], + [ + 1070.0, + 310.0 + ], + [ + 1057.0, + 298.0 + ] + ], + "center_px": [ + 1071.0, + 300.25 + ], + "area_px": 285.0 + }, + { + "image_points_px": [ + [ + 643.0, + 274.0 + ], + [ + 654.0, + 287.0 + ], + [ + 638.0, + 295.0 + ], + [ + 627.0, + 283.0 + ] + ], + "center_px": [ + 640.5, + 284.75 + ], + "area_px": 293.5 + }, + { + "image_points_px": [ + [ + 887.0, + 287.0 + ], + [ + 899.0, + 299.0 + ], + [ + 884.0, + 307.0 + ], + [ + 871.0, + 295.0 + ] + ], + "center_px": [ + 885.25, + 297.0 + ], + "area_px": 286.0 + }, + { + "image_points_px": [ + [ + 890.0, + 265.0 + ], + [ + 902.0, + 277.0 + ], + [ + 887.0, + 285.0 + ], + [ + 874.0, + 273.0 + ] + ], + "center_px": [ + 888.25, + 275.0 + ], + "area_px": 286.0 + }, + { + "image_points_px": [ + [ + 1043.0, + 264.0 + ], + [ + 1056.0, + 276.0 + ], + [ + 1041.0, + 284.0 + ], + [ + 1028.0, + 272.0 + ] + ], + "center_px": [ + 1042.0, + 274.0 + ], + "area_px": 284.0 + }, + { + "image_points_px": [ + [ + 1074.0, + 247.0 + ], + [ + 1087.0, + 259.0 + ], + [ + 1073.0, + 267.0 + ], + [ + 1059.0, + 255.0 + ] + ], + "center_px": [ + 1073.25, + 257.0 + ], + "area_px": 282.0 + }, + { + "image_points_px": [ + [ + 1134.0, + 299.0 + ], + [ + 1147.0, + 311.0 + ], + [ + 1133.0, + 319.0 + ], + [ + 1119.0, + 307.0 + ] + ], + "center_px": [ + 1133.25, + 309.0 + ], + "area_px": 282.0 + }, + { + "image_points_px": [ + [ + 1103.0, + 272.0 + ], + [ + 1117.0, + 284.0 + ], + [ + 1102.0, + 292.0 + ], + [ + 1089.0, + 280.0 + ] + ], + "center_px": [ + 1102.75, + 282.0 + ], + "area_px": 282.0 + }, + { + "image_points_px": [ + [ + 29.0, + 278.0 + ], + [ + 36.0, + 290.0 + ], + [ + 17.0, + 298.0 + ], + [ + 10.0, + 286.0 + ] + ], + "center_px": [ + 23.0, + 288.0 + ], + "area_px": 284.0 + }, + { + "image_points_px": [ + [ + 733.0, + 288.0 + ], + [ + 744.0, + 300.0 + ], + [ + 727.0, + 307.0 + ], + [ + 716.0, + 296.0 + ] + ], + "center_px": [ + 730.0, + 297.75 + ], + "area_px": 278.0 + }, + { + "image_points_px": [ + [ + 1164.0, + 281.0 + ], + [ + 1178.0, + 292.0 + ], + [ + 1165.0, + 301.0 + ], + [ + 1150.0, + 289.0 + ] + ], + "center_px": [ + 1164.25, + 290.75 + ], + "area_px": 278.5 + }, + { + "image_points_px": [ + [ + 708.0, + 262.0 + ], + [ + 719.0, + 273.0 + ], + [ + 703.0, + 281.0 + ], + [ + 691.0, + 269.0 + ] + ], + "center_px": [ + 705.25, + 271.25 + ], + "area_px": 276.0 + }, + { + "image_points_px": [ + [ + 981.0, + 278.0 + ], + [ + 993.0, + 290.0 + ], + [ + 978.0, + 297.0 + ], + [ + 965.0, + 285.0 + ] + ], + "center_px": [ + 979.25, + 287.5 + ], + "area_px": 273.5 + }, + { + "image_points_px": [ + [ + 763.0, + 292.0 + ], + [ + 774.0, + 304.0 + ], + [ + 758.0, + 312.0 + ], + [ + 747.0, + 299.0 + ] + ], + "center_px": [ + 760.5, + 301.75 + ], + "area_px": 282.5 + }, + { + "image_points_px": [ + [ + 41.0, + 256.0 + ], + [ + 48.0, + 268.0 + ], + [ + 30.0, + 276.0 + ], + [ + 22.0, + 264.0 + ] + ], + "center_px": [ + 35.25, + 266.0 + ], + "area_px": 282.0 + }, + { + "image_points_px": [ + [ + 1240.0, + 237.0 + ], + [ + 1255.0, + 230.0 + ], + [ + 1269.0, + 241.0 + ], + [ + 1255.0, + 248.0 + ] + ], + "center_px": [ + 1254.75, + 239.0 + ], + "area_px": 261.0 + }, + { + "image_points_px": [ + [ + 864.0, + 240.0 + ], + [ + 876.0, + 251.0 + ], + [ + 860.0, + 259.0 + ], + [ + 848.0, + 247.0 + ] + ], + "center_px": [ + 862.0, + 249.25 + ], + "area_px": 274.0 + }, + { + "image_points_px": [ + [ + 857.0, + 283.0 + ], + [ + 869.0, + 294.0 + ], + [ + 853.0, + 302.0 + ], + [ + 841.0, + 290.0 + ] + ], + "center_px": [ + 855.0, + 292.25 + ], + "area_px": 274.0 + }, + { + "image_points_px": [ + [ + 1074.0, + 269.0 + ], + [ + 1086.0, + 280.0 + ], + [ + 1071.0, + 288.0 + ], + [ + 1058.0, + 276.0 + ] + ], + "center_px": [ + 1072.25, + 278.25 + ], + "area_px": 272.0 + }, + { + "image_points_px": [ + [ + 982.0, + 256.0 + ], + [ + 995.0, + 268.0 + ], + [ + 979.0, + 275.0 + ], + [ + 967.0, + 264.0 + ] + ], + "center_px": [ + 980.75, + 265.75 + ], + "area_px": 272.0 + }, + { + "image_points_px": [ + [ + 926.0, + 227.0 + ], + [ + 938.0, + 238.0 + ], + [ + 923.0, + 246.0 + ], + [ + 910.0, + 234.0 + ] + ], + "center_px": [ + 924.25, + 236.25 + ], + "area_px": 272.0 + }, + { + "image_points_px": [ + [ + 985.0, + 235.0 + ], + [ + 997.0, + 246.0 + ], + [ + 982.0, + 254.0 + ], + [ + 969.0, + 242.0 + ] + ], + "center_px": [ + 983.25, + 244.25 + ], + "area_px": 272.0 + }, + { + "image_points_px": [ + [ + 1212.0, + 275.0 + ], + [ + 1226.0, + 268.0 + ], + [ + 1240.0, + 280.0 + ], + [ + 1225.0, + 287.0 + ] + ], + "center_px": [ + 1225.75, + 277.5 + ], + "area_px": 268.5 + }, + { + "image_points_px": [ + [ + 673.0, + 279.0 + ], + [ + 684.0, + 291.0 + ], + [ + 668.0, + 299.0 + ], + [ + 657.0, + 287.0 + ] + ], + "center_px": [ + 670.5, + 289.0 + ], + "area_px": 280.0 + }, + { + "image_points_px": [ + [ + 1044.0, + 243.0 + ], + [ + 1057.0, + 255.0 + ], + [ + 1042.0, + 262.0 + ], + [ + 1029.0, + 251.0 + ] + ], + "center_px": [ + 1043.0, + 252.75 + ], + "area_px": 270.0 + }, + { + "image_points_px": [ + [ + 1014.0, + 239.0 + ], + [ + 1027.0, + 250.0 + ], + [ + 1012.0, + 258.0 + ], + [ + 999.0, + 246.0 + ] + ], + "center_px": [ + 1013.0, + 248.25 + ], + "area_px": 270.0 + }, + { + "image_points_px": [ + [ + 1012.0, + 260.0 + ], + [ + 1025.0, + 272.0 + ], + [ + 1010.0, + 279.0 + ], + [ + 997.0, + 268.0 + ] + ], + "center_px": [ + 1011.0, + 269.75 + ], + "area_px": 270.0 + }, + { + "image_points_px": [ + [ + 1104.0, + 251.0 + ], + [ + 1117.0, + 263.0 + ], + [ + 1103.0, + 270.0 + ], + [ + 1089.0, + 259.0 + ] + ], + "center_px": [ + 1103.25, + 260.75 + ], + "area_px": 268.0 + }, + { + "image_points_px": [ + [ + 1015.0, + 218.0 + ], + [ + 1029.0, + 229.0 + ], + [ + 1014.0, + 237.0 + ], + [ + 1001.0, + 225.0 + ] + ], + "center_px": [ + 1014.75, + 227.25 + ], + "area_px": 268.0 + }, + { + "image_points_px": [ + [ + 1134.0, + 255.0 + ], + [ + 1148.0, + 267.0 + ], + [ + 1133.0, + 274.0 + ], + [ + 1120.0, + 263.0 + ] + ], + "center_px": [ + 1133.75, + 264.75 + ], + "area_px": 268.0 + }, + { + "image_points_px": [ + [ + 767.0, + 270.0 + ], + [ + 778.0, + 282.0 + ], + [ + 763.0, + 290.0 + ], + [ + 751.0, + 278.0 + ] + ], + "center_px": [ + 764.75, + 280.0 + ], + "area_px": 278.0 + }, + { + "image_points_px": [ + [ + 1105.0, + 230.0 + ], + [ + 1118.0, + 241.0 + ], + [ + 1104.0, + 249.0 + ], + [ + 1090.0, + 238.0 + ] + ], + "center_px": [ + 1104.25, + 239.5 + ], + "area_px": 267.5 + }, + { + "image_points_px": [ + [ + 920.0, + 269.0 + ], + [ + 932.0, + 281.0 + ], + [ + 917.0, + 289.0 + ], + [ + 905.0, + 277.0 + ] + ], + "center_px": [ + 918.5, + 279.0 + ], + "area_px": 276.0 + }, + { + "image_points_px": [ + [ + 375.0, + 330.0 + ], + [ + 385.0, + 344.0 + ], + [ + 369.0, + 350.0 + ], + [ + 359.0, + 338.0 + ] + ], + "center_px": [ + 372.0, + 340.5 + ], + "area_px": 278.0 + }, + { + "image_points_px": [ + [ + 1164.0, + 238.0 + ], + [ + 1178.0, + 249.0 + ], + [ + 1165.0, + 257.0 + ], + [ + 1150.0, + 246.0 + ] + ], + "center_px": [ + 1164.25, + 247.5 + ], + "area_px": 264.5 + }, + { + "image_points_px": [ + [ + 1134.0, + 234.0 + ], + [ + 1148.0, + 245.0 + ], + [ + 1135.0, + 253.0 + ], + [ + 1120.0, + 242.0 + ] + ], + "center_px": [ + 1134.25, + 243.5 + ], + "area_px": 264.5 + }, + { + "image_points_px": [ + [ + 327.0, + 298.0 + ], + [ + 336.0, + 310.0 + ], + [ + 318.0, + 318.0 + ], + [ + 310.0, + 307.0 + ] + ], + "center_px": [ + 322.75, + 308.25 + ], + "area_px": 273.5 + }, + { + "image_points_px": [ + [ + 834.0, + 236.0 + ], + [ + 846.0, + 247.0 + ], + [ + 830.0, + 254.0 + ], + [ + 818.0, + 243.0 + ] + ], + "center_px": [ + 832.0, + 245.0 + ], + "area_px": 260.0 + }, + { + "image_points_px": [ + [ + 1181.0, + 249.0 + ], + [ + 1196.0, + 243.0 + ], + [ + 1209.0, + 254.0 + ], + [ + 1194.0, + 261.0 + ] + ], + "center_px": [ + 1195.0, + 251.75 + ], + "area_px": 257.0 + }, + { + "image_points_px": [ + [ + 738.0, + 266.0 + ], + [ + 749.0, + 277.0 + ], + [ + 732.0, + 285.0 + ], + [ + 722.0, + 273.0 + ] + ], + "center_px": [ + 735.25, + 275.25 + ], + "area_px": 268.5 + }, + { + "image_points_px": [ + [ + 742.0, + 244.0 + ], + [ + 753.0, + 256.0 + ], + [ + 736.0, + 263.0 + ], + [ + 726.0, + 252.0 + ] + ], + "center_px": [ + 739.25, + 253.75 + ], + "area_px": 268.5 + }, + { + "image_points_px": [ + [ + 53.0, + 235.0 + ], + [ + 60.0, + 246.0 + ], + [ + 41.0, + 254.0 + ], + [ + 34.0, + 243.0 + ] + ], + "center_px": [ + 47.0, + 244.5 + ], + "area_px": 265.0 + }, + { + "image_points_px": [ + [ + 860.0, + 261.0 + ], + [ + 872.0, + 273.0 + ], + [ + 856.0, + 280.0 + ], + [ + 845.0, + 268.0 + ] + ], + "center_px": [ + 858.25, + 270.5 + ], + "area_px": 266.5 + }, + { + "image_points_px": [ + [ + 831.0, + 257.0 + ], + [ + 842.0, + 269.0 + ], + [ + 827.0, + 276.0 + ], + [ + 815.0, + 264.0 + ] + ], + "center_px": [ + 828.75, + 266.5 + ], + "area_px": 266.5 + }, + { + "image_points_px": [ + [ + 772.0, + 249.0 + ], + [ + 783.0, + 260.0 + ], + [ + 767.0, + 268.0 + ], + [ + 756.0, + 256.0 + ] + ], + "center_px": [ + 769.5, + 258.25 + ], + "area_px": 266.5 + }, + { + "image_points_px": [ + [ + 1076.0, + 206.0 + ], + [ + 1089.0, + 217.0 + ], + [ + 1074.0, + 224.0 + ], + [ + 1061.0, + 213.0 + ] + ], + "center_px": [ + 1075.0, + 215.0 + ], + "area_px": 256.0 + }, + { + "image_points_px": [ + [ + 870.0, + 199.0 + ], + [ + 882.0, + 209.0 + ], + [ + 867.0, + 217.0 + ], + [ + 854.0, + 206.0 + ] + ], + "center_px": [ + 868.25, + 207.75 + ], + "area_px": 256.5 + }, + { + "image_points_px": [ + [ + 1211.0, + 254.0 + ], + [ + 1226.0, + 247.0 + ], + [ + 1239.0, + 258.0 + ], + [ + 1225.0, + 265.0 + ] + ], + "center_px": [ + 1225.25, + 256.0 + ], + "area_px": 254.0 + }, + { + "image_points_px": [ + [ + 1091.0, + 217.0 + ], + [ + 1106.0, + 210.0 + ], + [ + 1119.0, + 221.0 + ], + [ + 1105.0, + 228.0 + ] + ], + "center_px": [ + 1105.25, + 219.0 + ], + "area_px": 254.0 + }, + { + "image_points_px": [ + [ + 867.0, + 219.0 + ], + [ + 879.0, + 230.0 + ], + [ + 863.0, + 238.0 + ], + [ + 852.0, + 226.0 + ] + ], + "center_px": [ + 865.25, + 228.25 + ], + "area_px": 264.5 + }, + { + "image_points_px": [ + [ + 801.0, + 253.0 + ], + [ + 812.0, + 264.0 + ], + [ + 797.0, + 272.0 + ], + [ + 785.0, + 260.0 + ] + ], + "center_px": [ + 798.75, + 262.25 + ], + "area_px": 264.5 + }, + { + "image_points_px": [ + [ + 780.0, + 207.0 + ], + [ + 791.0, + 218.0 + ], + [ + 776.0, + 226.0 + ], + [ + 764.0, + 214.0 + ] + ], + "center_px": [ + 777.75, + 216.25 + ], + "area_px": 264.5 + }, + { + "image_points_px": [ + [ + 1210.0, + 212.0 + ], + [ + 1224.0, + 205.0 + ], + [ + 1238.0, + 216.0 + ], + [ + 1224.0, + 223.0 + ] + ], + "center_px": [ + 1224.0, + 214.0 + ], + "area_px": 252.0 + }, + { + "image_points_px": [ + [ + 1240.0, + 216.0 + ], + [ + 1254.0, + 209.0 + ], + [ + 1268.0, + 220.0 + ], + [ + 1254.0, + 227.0 + ] + ], + "center_px": [ + 1254.0, + 218.0 + ], + "area_px": 252.0 + }, + { + "image_points_px": [ + [ + 1180.0, + 188.0 + ], + [ + 1194.0, + 181.0 + ], + [ + 1208.0, + 192.0 + ], + [ + 1194.0, + 199.0 + ] + ], + "center_px": [ + 1194.0, + 190.0 + ], + "area_px": 252.0 + }, + { + "image_points_px": [ + [ + 952.0, + 252.0 + ], + [ + 965.0, + 264.0 + ], + [ + 950.0, + 271.0 + ], + [ + 938.0, + 259.0 + ] + ], + "center_px": [ + 951.25, + 261.5 + ], + "area_px": 261.5 + }, + { + "image_points_px": [ + [ + 955.0, + 231.0 + ], + [ + 967.0, + 243.0 + ], + [ + 953.0, + 250.0 + ], + [ + 940.0, + 238.0 + ] + ], + "center_px": [ + 953.75, + 240.5 + ], + "area_px": 261.5 + }, + { + "image_points_px": [ + [ + 923.0, + 248.0 + ], + [ + 935.0, + 259.0 + ], + [ + 920.0, + 267.0 + ], + [ + 908.0, + 255.0 + ] + ], + "center_px": [ + 921.5, + 257.25 + ], + "area_px": 262.5 + }, + { + "image_points_px": [ + [ + 893.0, + 244.0 + ], + [ + 905.0, + 255.0 + ], + [ + 890.0, + 263.0 + ], + [ + 878.0, + 251.0 + ] + ], + "center_px": [ + 891.5, + 253.25 + ], + "area_px": 262.5 + }, + { + "image_points_px": [ + [ + 1045.0, + 222.0 + ], + [ + 1058.0, + 234.0 + ], + [ + 1044.0, + 241.0 + ], + [ + 1031.0, + 229.0 + ] + ], + "center_px": [ + 1044.5, + 231.5 + ], + "area_px": 259.0 + }, + { + "image_points_px": [ + [ + 986.0, + 214.0 + ], + [ + 999.0, + 225.0 + ], + [ + 984.0, + 233.0 + ], + [ + 972.0, + 221.0 + ] + ], + "center_px": [ + 985.25, + 223.25 + ], + "area_px": 260.5 + }, + { + "image_points_px": [ + [ + 1075.0, + 226.0 + ], + [ + 1088.0, + 237.0 + ], + [ + 1074.0, + 245.0 + ], + [ + 1061.0, + 233.0 + ] + ], + "center_px": [ + 1074.5, + 235.25 + ], + "area_px": 258.5 + }, + { + "image_points_px": [ + [ + 354.0, + 234.0 + ], + [ + 362.0, + 245.0 + ], + [ + 346.0, + 253.0 + ], + [ + 336.0, + 241.0 + ] + ], + "center_px": [ + 349.5, + 243.25 + ], + "area_px": 263.0 + }, + { + "image_points_px": [ + [ + 25.0, + 231.0 + ], + [ + 32.0, + 242.0 + ], + [ + 13.0, + 250.0 + ], + [ + 7.0, + 238.0 + ] + ], + "center_px": [ + 19.25, + 240.25 + ], + "area_px": 261.5 + }, + { + "image_points_px": [ + [ + 552.0, + 176.0 + ], + [ + 563.0, + 187.0 + ], + [ + 546.0, + 194.0 + ], + [ + 536.0, + 183.0 + ] + ], + "center_px": [ + 549.25, + 185.0 + ], + "area_px": 255.0 + }, + { + "image_points_px": [ + [ + 776.0, + 228.0 + ], + [ + 787.0, + 239.0 + ], + [ + 771.0, + 246.0 + ], + [ + 760.0, + 235.0 + ] + ], + "center_px": [ + 773.5, + 237.0 + ], + "area_px": 253.0 + }, + { + "image_points_px": [ + [ + 809.0, + 211.0 + ], + [ + 820.0, + 222.0 + ], + [ + 804.0, + 229.0 + ], + [ + 793.0, + 218.0 + ] + ], + "center_px": [ + 806.5, + 220.0 + ], + "area_px": 253.0 + }, + { + "image_points_px": [ + [ + 838.0, + 215.0 + ], + [ + 849.0, + 226.0 + ], + [ + 833.0, + 233.0 + ], + [ + 822.0, + 222.0 + ] + ], + "center_px": [ + 835.5, + 224.0 + ], + "area_px": 253.0 + }, + { + "image_points_px": [ + [ + 727.0, + 179.0 + ], + [ + 738.0, + 190.0 + ], + [ + 722.0, + 197.0 + ], + [ + 711.0, + 186.0 + ] + ], + "center_px": [ + 724.5, + 188.0 + ], + "area_px": 253.0 + }, + { + "image_points_px": [ + [ + 805.0, + 232.0 + ], + [ + 816.0, + 243.0 + ], + [ + 800.0, + 250.0 + ], + [ + 789.0, + 239.0 + ] + ], + "center_px": [ + 802.5, + 241.0 + ], + "area_px": 253.0 + }, + { + "image_points_px": [ + [ + 334.0, + 209.0 + ], + [ + 343.0, + 220.0 + ], + [ + 326.0, + 228.0 + ], + [ + 317.0, + 217.0 + ] + ], + "center_px": [ + 330.0, + 218.5 + ], + "area_px": 259.0 + }, + { + "image_points_px": [ + [ + 354.0, + 303.0 + ], + [ + 364.0, + 316.0 + ], + [ + 348.0, + 323.0 + ], + [ + 339.0, + 311.0 + ] + ], + "center_px": [ + 351.25, + 313.25 + ], + "area_px": 265.0 + }, + { + "image_points_px": [ + [ + 896.0, + 223.0 + ], + [ + 908.0, + 234.0 + ], + [ + 892.0, + 241.0 + ], + [ + 881.0, + 230.0 + ] + ], + "center_px": [ + 894.25, + 232.0 + ], + "area_px": 251.0 + }, + { + "image_points_px": [ + [ + 783.0, + 187.0 + ], + [ + 795.0, + 198.0 + ], + [ + 780.0, + 205.0 + ], + [ + 768.0, + 194.0 + ] + ], + "center_px": [ + 781.5, + 196.0 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 844.0, + 175.0 + ], + [ + 856.0, + 186.0 + ], + [ + 841.0, + 193.0 + ], + [ + 829.0, + 182.0 + ] + ], + "center_px": [ + 842.5, + 184.0 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 759.0, + 163.0 + ], + [ + 771.0, + 174.0 + ], + [ + 755.0, + 181.0 + ], + [ + 744.0, + 171.0 + ] + ], + "center_px": [ + 757.25, + 172.25 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 1211.0, + 232.0 + ], + [ + 1225.0, + 226.0 + ], + [ + 1238.0, + 237.0 + ], + [ + 1224.0, + 244.0 + ] + ], + "center_px": [ + 1224.5, + 234.75 + ], + "area_px": 245.5 + }, + { + "image_points_px": [ + [ + 1136.0, + 214.0 + ], + [ + 1148.0, + 225.0 + ], + [ + 1134.0, + 232.0 + ], + [ + 1121.0, + 221.0 + ] + ], + "center_px": [ + 1134.75, + 223.0 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 1047.0, + 202.0 + ], + [ + 1059.0, + 213.0 + ], + [ + 1045.0, + 220.0 + ], + [ + 1032.0, + 209.0 + ] + ], + "center_px": [ + 1045.75, + 211.0 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 988.0, + 194.0 + ], + [ + 1001.0, + 205.0 + ], + [ + 986.0, + 212.0 + ], + [ + 974.0, + 201.0 + ] + ], + "center_px": [ + 987.25, + 203.0 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 1019.0, + 178.0 + ], + [ + 1032.0, + 189.0 + ], + [ + 1017.0, + 196.0 + ], + [ + 1005.0, + 185.0 + ] + ], + "center_px": [ + 1018.25, + 187.0 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 990.0, + 174.0 + ], + [ + 1003.0, + 185.0 + ], + [ + 988.0, + 192.0 + ], + [ + 976.0, + 181.0 + ] + ], + "center_px": [ + 989.25, + 183.0 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 1017.0, + 198.0 + ], + [ + 1030.0, + 209.0 + ], + [ + 1015.0, + 216.0 + ], + [ + 1003.0, + 205.0 + ] + ], + "center_px": [ + 1016.25, + 207.0 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 343.0, + 189.0 + ], + [ + 352.0, + 200.0 + ], + [ + 334.0, + 207.0 + ], + [ + 326.0, + 196.0 + ] + ], + "center_px": [ + 338.75, + 198.0 + ], + "area_px": 252.0 + }, + { + "image_points_px": [ + [ + 928.0, + 207.0 + ], + [ + 940.0, + 217.0 + ], + [ + 925.0, + 225.0 + ], + [ + 913.0, + 214.0 + ] + ], + "center_px": [ + 926.5, + 215.75 + ], + "area_px": 247.5 + }, + { + "image_points_px": [ + [ + 899.0, + 203.0 + ], + [ + 911.0, + 213.0 + ], + [ + 896.0, + 221.0 + ], + [ + 884.0, + 210.0 + ] + ], + "center_px": [ + 897.5, + 211.75 + ], + "area_px": 247.5 + }, + { + "image_points_px": [ + [ + 1181.0, + 229.0 + ], + [ + 1195.0, + 222.0 + ], + [ + 1208.0, + 233.0 + ], + [ + 1194.0, + 240.0 + ] + ], + "center_px": [ + 1194.5, + 231.0 + ], + "area_px": 245.0 + }, + { + "image_points_px": [ + [ + 1151.0, + 225.0 + ], + [ + 1165.0, + 218.0 + ], + [ + 1178.0, + 229.0 + ], + [ + 1164.0, + 236.0 + ] + ], + "center_px": [ + 1164.5, + 227.0 + ], + "area_px": 245.0 + }, + { + "image_points_px": [ + [ + 1049.0, + 162.0 + ], + [ + 1062.0, + 173.0 + ], + [ + 1048.0, + 180.0 + ], + [ + 1035.0, + 169.0 + ] + ], + "center_px": [ + 1048.5, + 171.0 + ], + "area_px": 245.0 + }, + { + "image_points_px": [ + [ + 1107.0, + 190.0 + ], + [ + 1119.0, + 200.0 + ], + [ + 1105.0, + 208.0 + ], + [ + 1092.0, + 197.0 + ] + ], + "center_px": [ + 1105.75, + 198.75 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 1107.0, + 150.0 + ], + [ + 1121.0, + 161.0 + ], + [ + 1107.0, + 168.0 + ], + [ + 1094.0, + 157.0 + ] + ], + "center_px": [ + 1107.25, + 159.0 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 1181.0, + 208.0 + ], + [ + 1194.0, + 201.0 + ], + [ + 1208.0, + 212.0 + ], + [ + 1194.0, + 219.0 + ] + ], + "center_px": [ + 1194.25, + 210.0 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 1151.0, + 204.0 + ], + [ + 1164.0, + 197.0 + ], + [ + 1178.0, + 208.0 + ], + [ + 1164.0, + 215.0 + ] + ], + "center_px": [ + 1164.25, + 206.0 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 1239.0, + 196.0 + ], + [ + 1253.0, + 189.0 + ], + [ + 1266.0, + 200.0 + ], + [ + 1254.0, + 207.0 + ] + ], + "center_px": [ + 1253.0, + 198.0 + ], + "area_px": 241.0 + }, + { + "image_points_px": [ + [ + 1223.0, + 185.0 + ], + [ + 1237.0, + 196.0 + ], + [ + 1224.0, + 203.0 + ], + [ + 1210.0, + 192.0 + ] + ], + "center_px": [ + 1223.5, + 194.0 + ], + "area_px": 241.0 + }, + { + "image_points_px": [ + [ + 1252.0, + 169.0 + ], + [ + 1266.0, + 180.0 + ], + [ + 1253.0, + 187.0 + ], + [ + 1239.0, + 176.0 + ] + ], + "center_px": [ + 1252.5, + 178.0 + ], + "area_px": 241.0 + }, + { + "image_points_px": [ + [ + 399.0, + 197.0 + ], + [ + 408.0, + 207.0 + ], + [ + 390.0, + 215.0 + ], + [ + 382.0, + 204.0 + ] + ], + "center_px": [ + 394.75, + 205.75 + ], + "area_px": 247.5 + }, + { + "image_points_px": [ + [ + 315.0, + 185.0 + ], + [ + 324.0, + 196.0 + ], + [ + 306.0, + 203.0 + ], + [ + 298.0, + 193.0 + ] + ], + "center_px": [ + 310.75, + 194.25 + ], + "area_px": 247.5 + }, + { + "image_points_px": [ + [ + 363.0, + 213.0 + ], + [ + 371.0, + 224.0 + ], + [ + 355.0, + 232.0 + ], + [ + 346.0, + 220.0 + ] + ], + "center_px": [ + 358.75, + 222.25 + ], + "area_px": 253.5 + }, + { + "image_points_px": [ + [ + 371.0, + 193.0 + ], + [ + 380.0, + 203.0 + ], + [ + 363.0, + 211.0 + ], + [ + 354.0, + 200.0 + ] + ], + "center_px": [ + 367.0, + 201.75 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 435.0, + 181.0 + ], + [ + 444.0, + 191.0 + ], + [ + 427.0, + 199.0 + ], + [ + 418.0, + 188.0 + ] + ], + "center_px": [ + 431.0, + 189.75 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 442.0, + 161.0 + ], + [ + 451.0, + 171.0 + ], + [ + 434.0, + 179.0 + ], + [ + 425.0, + 168.0 + ] + ], + "center_px": [ + 438.0, + 169.75 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 379.0, + 173.0 + ], + [ + 388.0, + 183.0 + ], + [ + 371.0, + 191.0 + ], + [ + 362.0, + 180.0 + ] + ], + "center_px": [ + 375.0, + 181.75 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 887.0, + 189.0 + ], + [ + 902.0, + 183.0 + ], + [ + 914.0, + 193.0 + ], + [ + 898.0, + 200.0 + ] + ], + "center_px": [ + 900.25, + 191.25 + ], + "area_px": 237.5 + }, + { + "image_points_px": [ + [ + 947.0, + 177.0 + ], + [ + 962.0, + 171.0 + ], + [ + 974.0, + 181.0 + ], + [ + 959.0, + 188.0 + ] + ], + "center_px": [ + 960.5, + 179.25 + ], + "area_px": 235.5 + }, + { + "image_points_px": [ + [ + 462.0, + 184.0 + ], + [ + 471.0, + 195.0 + ], + [ + 455.0, + 203.0 + ], + [ + 446.0, + 191.0 + ] + ], + "center_px": [ + 458.5, + 193.25 + ], + "area_px": 251.5 + }, + { + "image_points_px": [ + [ + 885.0, + 189.0 + ], + [ + 869.0, + 196.0 + ], + [ + 858.0, + 186.0 + ], + [ + 873.0, + 179.0 + ] + ], + "center_px": [ + 871.25, + 187.5 + ], + "area_px": 235.5 + }, + { + "image_points_px": [ + [ + 1122.0, + 200.0 + ], + [ + 1136.0, + 194.0 + ], + [ + 1149.0, + 204.0 + ], + [ + 1134.0, + 211.0 + ] + ], + "center_px": [ + 1135.25, + 202.25 + ], + "area_px": 233.5 + }, + { + "image_points_px": [ + [ + 1151.0, + 184.0 + ], + [ + 1166.0, + 178.0 + ], + [ + 1178.0, + 188.0 + ], + [ + 1164.0, + 195.0 + ] + ], + "center_px": [ + 1164.75, + 186.25 + ], + "area_px": 233.5 + }, + { + "image_points_px": [ + [ + 531.0, + 153.0 + ], + [ + 541.0, + 163.0 + ], + [ + 525.0, + 171.0 + ], + [ + 515.0, + 160.0 + ] + ], + "center_px": [ + 528.0, + 161.75 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 918.0, + 174.0 + ], + [ + 933.0, + 167.0 + ], + [ + 945.0, + 177.0 + ], + [ + 930.0, + 184.0 + ] + ], + "center_px": [ + 931.5, + 175.5 + ], + "area_px": 234.0 + }, + { + "image_points_px": [ + [ + 904.0, + 163.0 + ], + [ + 916.0, + 173.0 + ], + [ + 901.0, + 180.0 + ], + [ + 889.0, + 170.0 + ] + ], + "center_px": [ + 902.5, + 171.5 + ], + "area_px": 234.0 + }, + { + "image_points_px": [ + [ + 1210.0, + 172.0 + ], + [ + 1224.0, + 166.0 + ], + [ + 1237.0, + 176.0 + ], + [ + 1223.0, + 183.0 + ] + ], + "center_px": [ + 1223.5, + 174.25 + ], + "area_px": 231.5 + }, + { + "image_points_px": [ + [ + 1151.0, + 165.0 + ], + [ + 1165.0, + 158.0 + ], + [ + 1178.0, + 169.0 + ], + [ + 1164.0, + 175.0 + ] + ], + "center_px": [ + 1164.5, + 166.75 + ], + "area_px": 231.5 + }, + { + "image_points_px": [ + [ + 1065.0, + 153.0 + ], + [ + 1079.0, + 147.0 + ], + [ + 1092.0, + 157.0 + ], + [ + 1078.0, + 164.0 + ] + ], + "center_px": [ + 1078.5, + 155.25 + ], + "area_px": 231.5 + }, + { + "image_points_px": [ + [ + 1108.0, + 131.0 + ], + [ + 1121.0, + 142.0 + ], + [ + 1107.0, + 148.0 + ], + [ + 1094.0, + 138.0 + ] + ], + "center_px": [ + 1107.5, + 139.75 + ], + "area_px": 231.5 + }, + { + "image_points_px": [ + [ + 1122.0, + 181.0 + ], + [ + 1136.0, + 174.0 + ], + [ + 1149.0, + 184.0 + ], + [ + 1134.0, + 191.0 + ] + ], + "center_px": [ + 1135.25, + 182.5 + ], + "area_px": 232.5 + }, + { + "image_points_px": [ + [ + 1063.0, + 193.0 + ], + [ + 1077.0, + 186.0 + ], + [ + 1090.0, + 196.0 + ], + [ + 1075.0, + 203.0 + ] + ], + "center_px": [ + 1076.25, + 194.5 + ], + "area_px": 232.5 + }, + { + "image_points_px": [ + [ + 816.0, + 171.0 + ], + [ + 827.0, + 182.0 + ], + [ + 812.0, + 189.0 + ], + [ + 801.0, + 178.0 + ] + ], + "center_px": [ + 814.0, + 180.0 + ], + "area_px": 242.0 + }, + { + "image_points_px": [ + [ + 812.0, + 191.0 + ], + [ + 823.0, + 202.0 + ], + [ + 808.0, + 209.0 + ], + [ + 797.0, + 198.0 + ] + ], + "center_px": [ + 810.0, + 200.0 + ], + "area_px": 242.0 + }, + { + "image_points_px": [ + [ + 1238.0, + 157.0 + ], + [ + 1252.0, + 150.0 + ], + [ + 1265.0, + 160.0 + ], + [ + 1251.0, + 167.0 + ] + ], + "center_px": [ + 1251.5, + 158.5 + ], + "area_px": 231.0 + }, + { + "image_points_px": [ + [ + 1050.0, + 143.0 + ], + [ + 1063.0, + 153.0 + ], + [ + 1049.0, + 160.0 + ], + [ + 1036.0, + 150.0 + ] + ], + "center_px": [ + 1049.5, + 151.5 + ], + "area_px": 231.0 + }, + { + "image_points_px": [ + [ + 841.0, + 195.0 + ], + [ + 852.0, + 206.0 + ], + [ + 838.0, + 213.0 + ], + [ + 826.0, + 202.0 + ] + ], + "center_px": [ + 839.25, + 204.0 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 876.0, + 159.0 + ], + [ + 887.0, + 170.0 + ], + [ + 873.0, + 177.0 + ], + [ + 861.0, + 166.0 + ] + ], + "center_px": [ + 874.25, + 168.0 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 1209.0, + 153.0 + ], + [ + 1222.0, + 146.0 + ], + [ + 1236.0, + 156.0 + ], + [ + 1222.0, + 163.0 + ] + ], + "center_px": [ + 1222.25, + 154.5 + ], + "area_px": 229.5 + }, + { + "image_points_px": [ + [ + 1151.0, + 267.0 + ], + [ + 1165.0, + 260.0 + ], + [ + 1177.0, + 271.0 + ], + [ + 1163.0, + 278.0 + ] + ], + "center_px": [ + 1164.0, + 269.0 + ], + "area_px": 238.0 + }, + { + "image_points_px": [ + [ + 930.0, + 186.0 + ], + [ + 942.0, + 197.0 + ], + [ + 928.0, + 204.0 + ], + [ + 916.0, + 193.0 + ] + ], + "center_px": [ + 929.0, + 195.0 + ], + "area_px": 238.0 + }, + { + "image_points_px": [ + [ + 1048.0, + 182.0 + ], + [ + 1060.0, + 193.0 + ], + [ + 1046.0, + 200.0 + ], + [ + 1034.0, + 189.0 + ] + ], + "center_px": [ + 1047.0, + 191.0 + ], + "area_px": 238.0 + }, + { + "image_points_px": [ + [ + 597.0, + 171.0 + ], + [ + 580.0, + 178.0 + ], + [ + 571.0, + 167.0 + ], + [ + 587.0, + 161.0 + ] + ], + "center_px": [ + 583.75, + 169.25 + ], + "area_px": 235.0 + }, + { + "image_points_px": [ + [ + 1107.0, + 170.0 + ], + [ + 1119.0, + 181.0 + ], + [ + 1106.0, + 188.0 + ], + [ + 1093.0, + 177.0 + ] + ], + "center_px": [ + 1106.25, + 179.0 + ], + "area_px": 236.0 + }, + { + "image_points_px": [ + [ + 1078.0, + 166.0 + ], + [ + 1090.0, + 177.0 + ], + [ + 1077.0, + 184.0 + ], + [ + 1064.0, + 173.0 + ] + ], + "center_px": [ + 1077.25, + 175.0 + ], + "area_px": 236.0 + }, + { + "image_points_px": [ + [ + 387.0, + 154.0 + ], + [ + 396.0, + 164.0 + ], + [ + 379.0, + 171.0 + ], + [ + 370.0, + 161.0 + ] + ], + "center_px": [ + 383.0, + 162.5 + ], + "area_px": 233.0 + }, + { + "image_points_px": [ + [ + 477.0, + 146.0 + ], + [ + 486.0, + 156.0 + ], + [ + 469.0, + 163.0 + ], + [ + 460.0, + 153.0 + ] + ], + "center_px": [ + 473.0, + 154.5 + ], + "area_px": 233.0 + }, + { + "image_points_px": [ + [ + 368.0, + 131.0 + ], + [ + 377.0, + 141.0 + ], + [ + 360.0, + 148.0 + ], + [ + 351.0, + 138.0 + ] + ], + "center_px": [ + 364.0, + 139.5 + ], + "area_px": 233.0 + }, + { + "image_points_px": [ + [ + 287.0, + 120.0 + ], + [ + 296.0, + 130.0 + ], + [ + 279.0, + 137.0 + ], + [ + 270.0, + 127.0 + ] + ], + "center_px": [ + 283.0, + 128.5 + ], + "area_px": 233.0 + }, + { + "image_points_px": [ + [ + 351.0, + 169.0 + ], + [ + 360.0, + 180.0 + ], + [ + 343.0, + 187.0 + ], + [ + 335.0, + 176.0 + ] + ], + "center_px": [ + 347.25, + 178.0 + ], + "area_px": 241.0 + }, + { + "image_points_px": [ + [ + 407.0, + 177.0 + ], + [ + 415.0, + 188.0 + ], + [ + 399.0, + 195.0 + ], + [ + 390.0, + 184.0 + ] + ], + "center_px": [ + 402.75, + 186.0 + ], + "area_px": 241.0 + }, + { + "image_points_px": [ + [ + 479.0, + 175.0 + ], + [ + 462.0, + 182.0 + ], + [ + 453.0, + 172.0 + ], + [ + 469.0, + 165.0 + ] + ], + "center_px": [ + 465.75, + 173.5 + ], + "area_px": 231.5 + }, + { + "image_points_px": [ + [ + 500.0, + 199.0 + ], + [ + 481.0, + 204.0 + ], + [ + 474.0, + 195.0 + ], + [ + 490.0, + 188.0 + ] + ], + "center_px": [ + 486.25, + 196.5 + ], + "area_px": 226.0 + }, + { + "image_points_px": [ + [ + 414.0, + 157.0 + ], + [ + 423.0, + 168.0 + ], + [ + 407.0, + 175.0 + ], + [ + 398.0, + 164.0 + ] + ], + "center_px": [ + 410.5, + 166.0 + ], + "area_px": 239.0 + }, + { + "image_points_px": [ + [ + 736.0, + 141.0 + ], + [ + 747.0, + 151.0 + ], + [ + 731.0, + 158.0 + ], + [ + 721.0, + 147.0 + ] + ], + "center_px": [ + 733.75, + 149.25 + ], + "area_px": 231.0 + }, + { + "image_points_px": [ + [ + 676.0, + 153.0 + ], + [ + 686.0, + 163.0 + ], + [ + 671.0, + 170.0 + ], + [ + 660.0, + 159.0 + ] + ], + "center_px": [ + 673.25, + 161.25 + ], + "area_px": 231.0 + }, + { + "image_points_px": [ + [ + 324.0, + 165.0 + ], + [ + 332.0, + 176.0 + ], + [ + 316.0, + 183.0 + ], + [ + 307.0, + 173.0 + ] + ], + "center_px": [ + 319.75, + 174.25 + ], + "area_px": 237.0 + }, + { + "image_points_px": [ + [ + 1180.0, + 149.0 + ], + [ + 1194.0, + 143.0 + ], + [ + 1207.0, + 153.0 + ], + [ + 1193.0, + 159.0 + ] + ], + "center_px": [ + 1193.5, + 151.0 + ], + "area_px": 218.0 + }, + { + "image_points_px": [ + [ + 559.0, + 157.0 + ], + [ + 569.0, + 167.0 + ], + [ + 553.0, + 174.0 + ], + [ + 543.0, + 164.0 + ] + ], + "center_px": [ + 556.0, + 165.5 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 620.0, + 145.0 + ], + [ + 630.0, + 155.0 + ], + [ + 614.0, + 162.0 + ], + [ + 604.0, + 152.0 + ] + ], + "center_px": [ + 617.0, + 153.5 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 510.0, + 130.0 + ], + [ + 520.0, + 140.0 + ], + [ + 504.0, + 147.0 + ], + [ + 494.0, + 137.0 + ] + ], + "center_px": [ + 507.0, + 138.5 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 648.0, + 149.0 + ], + [ + 658.0, + 159.0 + ], + [ + 642.0, + 166.0 + ], + [ + 632.0, + 156.0 + ] + ], + "center_px": [ + 645.0, + 157.5 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 565.0, + 138.0 + ], + [ + 575.0, + 148.0 + ], + [ + 559.0, + 155.0 + ], + [ + 549.0, + 145.0 + ] + ], + "center_px": [ + 562.0, + 146.5 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 1208.0, + 115.0 + ], + [ + 1222.0, + 109.0 + ], + [ + 1235.0, + 119.0 + ], + [ + 1222.0, + 125.0 + ] + ], + "center_px": [ + 1221.75, + 117.0 + ], + "area_px": 216.0 + }, + { + "image_points_px": [ + [ + 773.0, + 174.0 + ], + [ + 788.0, + 168.0 + ], + [ + 799.0, + 178.0 + ], + [ + 784.0, + 185.0 + ] + ], + "center_px": [ + 786.0, + 176.25 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 851.0, + 136.0 + ], + [ + 862.0, + 147.0 + ], + [ + 847.0, + 153.0 + ], + [ + 836.0, + 143.0 + ] + ], + "center_px": [ + 849.0, + 144.75 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 848.0, + 156.0 + ], + [ + 859.0, + 166.0 + ], + [ + 844.0, + 173.0 + ], + [ + 833.0, + 162.0 + ] + ], + "center_px": [ + 846.0, + 164.25 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 820.0, + 152.0 + ], + [ + 831.0, + 162.0 + ], + [ + 816.0, + 169.0 + ], + [ + 805.0, + 158.0 + ] + ], + "center_px": [ + 818.0, + 160.25 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 791.0, + 148.0 + ], + [ + 802.0, + 159.0 + ], + [ + 787.0, + 165.0 + ], + [ + 776.0, + 155.0 + ] + ], + "center_px": [ + 789.0, + 156.75 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 643.0, + 168.0 + ], + [ + 652.0, + 179.0 + ], + [ + 637.0, + 186.0 + ], + [ + 627.0, + 175.0 + ] + ], + "center_px": [ + 639.75, + 177.0 + ], + "area_px": 237.0 + }, + { + "image_points_px": [ + [ + 503.0, + 149.0 + ], + [ + 513.0, + 160.0 + ], + [ + 497.0, + 167.0 + ], + [ + 488.0, + 156.0 + ] + ], + "center_px": [ + 500.25, + 158.0 + ], + "area_px": 237.0 + }, + { + "image_points_px": [ + [ + 625.0, + 126.0 + ], + [ + 636.0, + 136.0 + ], + [ + 620.0, + 143.0 + ], + [ + 610.0, + 133.0 + ] + ], + "center_px": [ + 622.75, + 134.5 + ], + "area_px": 228.5 + }, + { + "image_points_px": [ + [ + 907.0, + 144.0 + ], + [ + 919.0, + 154.0 + ], + [ + 904.0, + 161.0 + ], + [ + 893.0, + 150.0 + ] + ], + "center_px": [ + 905.75, + 152.25 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 879.0, + 140.0 + ], + [ + 890.0, + 151.0 + ], + [ + 876.0, + 157.0 + ], + [ + 864.0, + 147.0 + ] + ], + "center_px": [ + 877.25, + 148.75 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 882.0, + 121.0 + ], + [ + 893.0, + 132.0 + ], + [ + 879.0, + 138.0 + ], + [ + 867.0, + 128.0 + ] + ], + "center_px": [ + 880.25, + 129.75 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 921.0, + 154.0 + ], + [ + 936.0, + 148.0 + ], + [ + 947.0, + 158.0 + ], + [ + 933.0, + 165.0 + ] + ], + "center_px": [ + 934.25, + 156.25 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 431.0, + 148.0 + ], + [ + 414.0, + 155.0 + ], + [ + 405.0, + 145.0 + ], + [ + 423.0, + 139.0 + ] + ], + "center_px": [ + 418.25, + 146.75 + ], + "area_px": 221.5 + }, + { + "image_points_px": [ + [ + 614.0, + 164.0 + ], + [ + 624.0, + 175.0 + ], + [ + 609.0, + 182.0 + ], + [ + 599.0, + 171.0 + ] + ], + "center_px": [ + 611.5, + 173.0 + ], + "area_px": 235.0 + }, + { + "image_points_px": [ + [ + 795.0, + 129.0 + ], + [ + 806.0, + 139.0 + ], + [ + 791.0, + 146.0 + ], + [ + 780.0, + 136.0 + ] + ], + "center_px": [ + 793.0, + 137.5 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 740.0, + 122.0 + ], + [ + 751.0, + 132.0 + ], + [ + 736.0, + 139.0 + ], + [ + 725.0, + 129.0 + ] + ], + "center_px": [ + 738.0, + 130.5 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 306.0, + 143.0 + ], + [ + 314.0, + 153.0 + ], + [ + 297.0, + 160.0 + ], + [ + 289.0, + 149.0 + ] + ], + "center_px": [ + 301.5, + 151.25 + ], + "area_px": 230.5 + }, + { + "image_points_px": [ + [ + 980.0, + 142.0 + ], + [ + 994.0, + 136.0 + ], + [ + 1006.0, + 146.0 + ], + [ + 992.0, + 153.0 + ] + ], + "center_px": [ + 993.0, + 144.25 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 1007.0, + 165.0 + ], + [ + 1021.0, + 159.0 + ], + [ + 1033.0, + 169.0 + ], + [ + 1019.0, + 176.0 + ] + ], + "center_px": [ + 1020.0, + 167.25 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 963.0, + 151.0 + ], + [ + 975.0, + 162.0 + ], + [ + 961.0, + 168.0 + ], + [ + 949.0, + 158.0 + ] + ], + "center_px": [ + 962.0, + 159.75 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 965.0, + 132.0 + ], + [ + 977.0, + 143.0 + ], + [ + 963.0, + 149.0 + ], + [ + 951.0, + 139.0 + ] + ], + "center_px": [ + 964.0, + 140.75 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 996.0, + 117.0 + ], + [ + 1008.0, + 127.0 + ], + [ + 994.0, + 134.0 + ], + [ + 982.0, + 123.0 + ] + ], + "center_px": [ + 995.0, + 125.25 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 992.0, + 155.0 + ], + [ + 1004.0, + 165.0 + ], + [ + 990.0, + 172.0 + ], + [ + 978.0, + 161.0 + ] + ], + "center_px": [ + 991.0, + 163.25 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 826.0, + 114.0 + ], + [ + 838.0, + 124.0 + ], + [ + 823.0, + 131.0 + ], + [ + 812.0, + 121.0 + ] + ], + "center_px": [ + 824.75, + 122.5 + ], + "area_px": 225.5 + }, + { + "image_points_px": [ + [ + 1137.0, + 116.0 + ], + [ + 1149.0, + 127.0 + ], + [ + 1136.0, + 133.0 + ], + [ + 1123.0, + 123.0 + ] + ], + "center_px": [ + 1136.25, + 124.75 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 1181.0, + 168.0 + ], + [ + 1195.0, + 162.0 + ], + [ + 1207.0, + 172.0 + ], + [ + 1194.0, + 179.0 + ] + ], + "center_px": [ + 1194.25, + 170.25 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 1136.0, + 154.0 + ], + [ + 1149.0, + 165.0 + ], + [ + 1135.0, + 171.0 + ], + [ + 1123.0, + 161.0 + ] + ], + "center_px": [ + 1135.75, + 162.75 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 912.0, + 106.0 + ], + [ + 924.0, + 116.0 + ], + [ + 910.0, + 123.0 + ], + [ + 898.0, + 113.0 + ] + ], + "center_px": [ + 911.0, + 114.5 + ], + "area_px": 224.0 + }, + { + "image_points_px": [ + [ + 1152.0, + 126.0 + ], + [ + 1165.0, + 120.0 + ], + [ + 1178.0, + 130.0 + ], + [ + 1165.0, + 137.0 + ] + ], + "center_px": [ + 1165.0, + 128.25 + ], + "area_px": 221.0 + }, + { + "image_points_px": [ + [ + 1152.0, + 145.0 + ], + [ + 1165.0, + 139.0 + ], + [ + 1178.0, + 149.0 + ], + [ + 1165.0, + 156.0 + ] + ], + "center_px": [ + 1165.0, + 147.25 + ], + "area_px": 221.0 + }, + { + "image_points_px": [ + [ + 1123.0, + 142.0 + ], + [ + 1136.0, + 135.0 + ], + [ + 1149.0, + 146.0 + ], + [ + 1136.0, + 152.0 + ] + ], + "center_px": [ + 1136.0, + 143.75 + ], + "area_px": 221.0 + }, + { + "image_points_px": [ + [ + 341.0, + 128.0 + ], + [ + 349.0, + 138.0 + ], + [ + 333.0, + 145.0 + ], + [ + 324.0, + 134.0 + ] + ], + "center_px": [ + 336.75, + 136.25 + ], + "area_px": 228.5 + }, + { + "image_points_px": [ + [ + 1080.0, + 128.0 + ], + [ + 1092.0, + 138.0 + ], + [ + 1079.0, + 145.0 + ], + [ + 1066.0, + 135.0 + ] + ], + "center_px": [ + 1079.25, + 136.5 + ], + "area_px": 222.5 + }, + { + "image_points_px": [ + [ + 297.0, + 162.0 + ], + [ + 305.0, + 172.0 + ], + [ + 288.0, + 179.0 + ], + [ + 280.0, + 169.0 + ] + ], + "center_px": [ + 292.5, + 170.5 + ], + "area_px": 226.0 + }, + { + "image_points_px": [ + [ + 279.0, + 139.0 + ], + [ + 287.0, + 149.0 + ], + [ + 270.0, + 156.0 + ], + [ + 262.0, + 146.0 + ] + ], + "center_px": [ + 274.5, + 147.5 + ], + "area_px": 226.0 + }, + { + "image_points_px": [ + [ + 323.0, + 105.0 + ], + [ + 331.0, + 115.0 + ], + [ + 314.0, + 122.0 + ], + [ + 306.0, + 112.0 + ] + ], + "center_px": [ + 318.5, + 113.5 + ], + "area_px": 226.0 + }, + { + "image_points_px": [ + [ + 591.0, + 191.0 + ], + [ + 572.0, + 195.0 + ], + [ + 565.0, + 187.0 + ], + [ + 581.0, + 180.0 + ] + ], + "center_px": [ + 577.25, + 188.25 + ], + "area_px": 213.0 + }, + { + "image_points_px": [ + [ + 1180.0, + 112.0 + ], + [ + 1193.0, + 105.0 + ], + [ + 1206.0, + 115.0 + ], + [ + 1194.0, + 122.0 + ] + ], + "center_px": [ + 1193.25, + 113.5 + ], + "area_px": 219.5 + }, + { + "image_points_px": [ + [ + 696.0, + 125.0 + ], + [ + 680.0, + 131.0 + ], + [ + 670.0, + 121.0 + ], + [ + 685.0, + 115.0 + ] + ], + "center_px": [ + 682.75, + 123.0 + ], + "area_px": 218.0 + }, + { + "image_points_px": [ + [ + 525.0, + 173.0 + ], + [ + 534.0, + 183.0 + ], + [ + 518.0, + 190.0 + ], + [ + 509.0, + 179.0 + ] + ], + "center_px": [ + 521.5, + 181.25 + ], + "area_px": 226.5 + }, + { + "image_points_px": [ + [ + 1008.0, + 146.0 + ], + [ + 1023.0, + 140.0 + ], + [ + 1034.0, + 150.0 + ], + [ + 1019.0, + 156.0 + ] + ], + "center_px": [ + 1021.0, + 148.0 + ], + "area_px": 216.0 + }, + { + "image_points_px": [ + [ + 571.0, + 119.0 + ], + [ + 581.0, + 129.0 + ], + [ + 565.0, + 136.0 + ], + [ + 556.0, + 125.0 + ] + ], + "center_px": [ + 568.25, + 127.25 + ], + "area_px": 224.5 + }, + { + "image_points_px": [ + [ + 535.0, + 329.0 + ], + [ + 546.0, + 341.0 + ], + [ + 531.0, + 348.0 + ], + [ + 523.0, + 334.0 + ] + ], + "center_px": [ + 533.75, + 338.0 + ], + "area_px": 232.5 + }, + { + "image_points_px": [ + [ + 484.0, + 127.0 + ], + [ + 492.0, + 137.0 + ], + [ + 477.0, + 144.0 + ], + [ + 467.0, + 134.0 + ] + ], + "center_px": [ + 480.0, + 135.5 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 926.0, + 116.0 + ], + [ + 940.0, + 110.0 + ], + [ + 952.0, + 120.0 + ], + [ + 937.0, + 126.0 + ] + ], + "center_px": [ + 938.75, + 118.0 + ], + "area_px": 214.0 + }, + { + "image_points_px": [ + [ + 1010.0, + 127.0 + ], + [ + 1024.0, + 121.0 + ], + [ + 1036.0, + 131.0 + ], + [ + 1021.0, + 137.0 + ] + ], + "center_px": [ + 1022.75, + 129.0 + ], + "area_px": 214.0 + }, + { + "image_points_px": [ + [ + 497.0, + 169.0 + ], + [ + 506.0, + 179.0 + ], + [ + 490.0, + 186.0 + ], + [ + 481.0, + 176.0 + ] + ], + "center_px": [ + 493.5, + 177.5 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 456.0, + 123.0 + ], + [ + 465.0, + 133.0 + ], + [ + 449.0, + 140.0 + ], + [ + 440.0, + 130.0 + ] + ], + "center_px": [ + 452.5, + 131.5 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 490.0, + 108.0 + ], + [ + 499.0, + 118.0 + ], + [ + 483.0, + 125.0 + ], + [ + 474.0, + 115.0 + ] + ], + "center_px": [ + 486.5, + 116.5 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 449.0, + 142.0 + ], + [ + 458.0, + 152.0 + ], + [ + 442.0, + 159.0 + ], + [ + 433.0, + 149.0 + ] + ], + "center_px": [ + 445.5, + 150.5 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 402.0, + 116.0 + ], + [ + 411.0, + 126.0 + ], + [ + 395.0, + 133.0 + ], + [ + 386.0, + 123.0 + ] + ], + "center_px": [ + 398.5, + 124.5 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 810.0, + 120.0 + ], + [ + 795.0, + 127.0 + ], + [ + 784.0, + 117.0 + ], + [ + 799.0, + 111.0 + ] + ], + "center_px": [ + 797.0, + 118.75 + ], + "area_px": 214.0 + }, + { + "image_points_px": [ + [ + 549.0, + 632.0 + ], + [ + 563.0, + 649.0 + ], + [ + 554.0, + 654.0 + ], + [ + 542.0, + 637.0 + ] + ], + "center_px": [ + 552.0, + 643.0 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 680.0, + 133.0 + ], + [ + 690.0, + 144.0 + ], + [ + 675.0, + 150.0 + ], + [ + 665.0, + 140.0 + ] + ], + "center_px": [ + 677.5, + 141.75 + ], + "area_px": 222.5 + }, + { + "image_points_px": [ + [ + 653.0, + 130.0 + ], + [ + 663.0, + 140.0 + ], + [ + 648.0, + 147.0 + ], + [ + 638.0, + 136.0 + ] + ], + "center_px": [ + 650.5, + 138.25 + ], + "area_px": 222.5 + }, + { + "image_points_px": [ + [ + 1039.0, + 112.0 + ], + [ + 1053.0, + 106.0 + ], + [ + 1065.0, + 116.0 + ], + [ + 1051.0, + 122.0 + ] + ], + "center_px": [ + 1052.0, + 114.0 + ], + "area_px": 212.0 + }, + { + "image_points_px": [ + [ + 537.0, + 134.0 + ], + [ + 547.0, + 144.0 + ], + [ + 531.0, + 151.0 + ], + [ + 522.0, + 141.0 + ] + ], + "center_px": [ + 534.25, + 142.5 + ], + "area_px": 221.5 + }, + { + "image_points_px": [ + [ + 604.0, + 104.0 + ], + [ + 613.0, + 114.0 + ], + [ + 598.0, + 121.0 + ], + [ + 588.0, + 111.0 + ] + ], + "center_px": [ + 600.75, + 112.5 + ], + "area_px": 221.5 + }, + { + "image_points_px": [ + [ + 436.0, + 101.0 + ], + [ + 445.0, + 111.0 + ], + [ + 430.0, + 118.0 + ], + [ + 420.0, + 108.0 + ] + ], + "center_px": [ + 432.75, + 109.5 + ], + "area_px": 221.5 + }, + { + "image_points_px": [ + [ + 1180.0, + 130.0 + ], + [ + 1194.0, + 124.0 + ], + [ + 1206.0, + 134.0 + ], + [ + 1193.0, + 140.0 + ] + ], + "center_px": [ + 1193.25, + 132.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 1152.0, + 108.0 + ], + [ + 1166.0, + 102.0 + ], + [ + 1178.0, + 112.0 + ], + [ + 1165.0, + 118.0 + ] + ], + "center_px": [ + 1165.25, + 110.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 1209.0, + 134.0 + ], + [ + 1223.0, + 128.0 + ], + [ + 1235.0, + 138.0 + ], + [ + 1222.0, + 144.0 + ] + ], + "center_px": [ + 1222.25, + 136.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 1096.0, + 101.0 + ], + [ + 1110.0, + 95.0 + ], + [ + 1122.0, + 105.0 + ], + [ + 1109.0, + 111.0 + ] + ], + "center_px": [ + 1109.25, + 103.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 1152.0, + 90.0 + ], + [ + 1166.0, + 84.0 + ], + [ + 1178.0, + 94.0 + ], + [ + 1165.0, + 100.0 + ] + ], + "center_px": [ + 1165.25, + 92.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 1238.0, + 137.0 + ], + [ + 1251.0, + 131.0 + ], + [ + 1264.0, + 141.0 + ], + [ + 1250.0, + 147.0 + ] + ], + "center_px": [ + 1250.75, + 139.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 1067.0, + 116.0 + ], + [ + 1082.0, + 110.0 + ], + [ + 1093.0, + 119.0 + ], + [ + 1080.0, + 126.0 + ] + ], + "center_px": [ + 1080.5, + 117.75 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 1011.0, + 109.0 + ], + [ + 1026.0, + 103.0 + ], + [ + 1037.0, + 112.0 + ], + [ + 1024.0, + 119.0 + ] + ], + "center_px": [ + 1024.5, + 110.75 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 763.0, + 144.0 + ], + [ + 774.0, + 155.0 + ], + [ + 759.0, + 161.0 + ], + [ + 749.0, + 151.0 + ] + ], + "center_px": [ + 761.25, + 152.75 + ], + "area_px": 220.5 + }, + { + "image_points_px": [ + [ + 1082.0, + 91.0 + ], + [ + 1094.0, + 101.0 + ], + [ + 1080.0, + 107.0 + ], + [ + 1068.0, + 98.0 + ] + ], + "center_px": [ + 1081.0, + 99.25 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 1038.0, + 131.0 + ], + [ + 1052.0, + 125.0 + ], + [ + 1064.0, + 134.0 + ], + [ + 1050.0, + 141.0 + ] + ], + "center_px": [ + 1051.0, + 132.75 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 1237.0, + 119.0 + ], + [ + 1251.0, + 113.0 + ], + [ + 1263.0, + 122.0 + ], + [ + 1250.0, + 129.0 + ] + ], + "center_px": [ + 1250.25, + 120.75 + ], + "area_px": 209.5 + }, + { + "image_points_px": [ + [ + 1013.0, + 91.0 + ], + [ + 1026.0, + 84.0 + ], + [ + 1039.0, + 94.0 + ], + [ + 1025.0, + 100.0 + ] + ], + "center_px": [ + 1025.75, + 92.25 + ], + "area_px": 209.5 + }, + { + "image_points_px": [ + [ + 708.0, + 137.0 + ], + [ + 718.0, + 147.0 + ], + [ + 703.0, + 154.0 + ], + [ + 693.0, + 144.0 + ] + ], + "center_px": [ + 705.5, + 145.5 + ], + "area_px": 220.0 + }, + { + "image_points_px": [ + [ + 658.0, + 111.0 + ], + [ + 668.0, + 121.0 + ], + [ + 653.0, + 128.0 + ], + [ + 643.0, + 118.0 + ] + ], + "center_px": [ + 655.5, + 119.5 + ], + "area_px": 220.0 + }, + { + "image_points_px": [ + [ + 430.0, + 120.0 + ], + [ + 438.0, + 130.0 + ], + [ + 422.0, + 136.0 + ], + [ + 413.0, + 126.0 + ] + ], + "center_px": [ + 425.75, + 128.0 + ], + "area_px": 216.0 + }, + { + "image_points_px": [ + [ + 823.0, + 133.0 + ], + [ + 834.0, + 143.0 + ], + [ + 820.0, + 150.0 + ], + [ + 809.0, + 139.0 + ] + ], + "center_px": [ + 821.5, + 141.25 + ], + "area_px": 218.5 + }, + { + "image_points_px": [ + [ + 1180.0, + 94.0 + ], + [ + 1193.0, + 87.0 + ], + [ + 1206.0, + 97.0 + ], + [ + 1193.0, + 103.0 + ] + ], + "center_px": [ + 1193.0, + 95.25 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 341.0, + 156.0 + ], + [ + 324.0, + 163.0 + ], + [ + 316.0, + 153.0 + ], + [ + 333.0, + 147.0 + ] + ], + "center_px": [ + 328.5, + 154.75 + ], + "area_px": 213.5 + }, + { + "image_points_px": [ + [ + 313.0, + 93.0 + ], + [ + 296.0, + 100.0 + ], + [ + 288.0, + 90.0 + ], + [ + 305.0, + 84.0 + ] + ], + "center_px": [ + 300.5, + 91.75 + ], + "area_px": 213.5 + }, + { + "image_points_px": [ + [ + 278.0, + 108.0 + ], + [ + 261.0, + 115.0 + ], + [ + 253.0, + 105.0 + ], + [ + 270.0, + 99.0 + ] + ], + "center_px": [ + 265.5, + 106.75 + ], + "area_px": 213.5 + }, + { + "image_points_px": [ + [ + 712.0, + 118.0 + ], + [ + 723.0, + 128.0 + ], + [ + 708.0, + 135.0 + ], + [ + 698.0, + 125.0 + ] + ], + "center_px": [ + 710.25, + 126.5 + ], + "area_px": 218.5 + }, + { + "image_points_px": [ + [ + 376.0, + 113.0 + ], + [ + 384.0, + 123.0 + ], + [ + 369.0, + 129.0 + ], + [ + 359.0, + 119.0 + ] + ], + "center_px": [ + 372.0, + 121.0 + ], + "area_px": 214.0 + }, + { + "image_points_px": [ + [ + 400.0, + 86.0 + ], + [ + 383.0, + 92.0 + ], + [ + 375.0, + 83.0 + ], + [ + 391.0, + 76.0 + ] + ], + "center_px": [ + 387.25, + 84.25 + ], + "area_px": 212.0 + }, + { + "image_points_px": [ + [ + 395.0, + 135.0 + ], + [ + 403.0, + 145.0 + ], + [ + 387.0, + 152.0 + ], + [ + 379.0, + 141.0 + ] + ], + "center_px": [ + 391.0, + 143.25 + ], + "area_px": 220.0 + }, + { + "image_points_px": [ + [ + 349.0, + 109.0 + ], + [ + 357.0, + 119.0 + ], + [ + 341.0, + 126.0 + ], + [ + 333.0, + 115.0 + ] + ], + "center_px": [ + 345.0, + 117.25 + ], + "area_px": 220.0 + }, + { + "image_points_px": [ + [ + 545.0, + 116.0 + ], + [ + 553.0, + 126.0 + ], + [ + 539.0, + 132.0 + ], + [ + 528.0, + 122.0 + ] + ], + "center_px": [ + 541.25, + 124.0 + ], + "area_px": 212.0 + }, + { + "image_points_px": [ + [ + 198.0, + 128.0 + ], + [ + 206.0, + 138.0 + ], + [ + 189.0, + 145.0 + ], + [ + 182.0, + 135.0 + ] + ], + "center_px": [ + 193.75, + 136.5 + ], + "area_px": 217.5 + }, + { + "image_points_px": [ + [ + 269.0, + 126.0 + ], + [ + 252.0, + 133.0 + ], + [ + 244.0, + 124.0 + ], + [ + 261.0, + 117.0 + ] + ], + "center_px": [ + 256.5, + 125.0 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 641.0, + 118.0 + ], + [ + 625.0, + 124.0 + ], + [ + 616.0, + 114.0 + ], + [ + 631.0, + 108.0 + ] + ], + "center_px": [ + 628.25, + 116.0 + ], + "area_px": 212.0 + }, + { + "image_points_px": [ + [ + 846.0, + 88.0 + ], + [ + 861.0, + 82.0 + ], + [ + 872.0, + 91.0 + ], + [ + 857.0, + 97.0 + ] + ], + "center_px": [ + 859.0, + 89.5 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 479.0, + 96.0 + ], + [ + 463.0, + 103.0 + ], + [ + 454.0, + 93.0 + ], + [ + 470.0, + 87.0 + ] + ], + "center_px": [ + 466.5, + 94.75 + ], + "area_px": 210.5 + }, + { + "image_points_px": [ + [ + 460.0, + 75.0 + ], + [ + 444.0, + 82.0 + ], + [ + 435.0, + 72.0 + ], + [ + 451.0, + 66.0 + ] + ], + "center_px": [ + 447.5, + 73.75 + ], + "area_px": 210.5 + }, + { + "image_points_px": [ + [ + 602.0, + 151.0 + ], + [ + 586.0, + 158.0 + ], + [ + 577.0, + 148.0 + ], + [ + 593.0, + 142.0 + ] + ], + "center_px": [ + 589.5, + 149.75 + ], + "area_px": 210.5 + }, + { + "image_points_px": [ + [ + 472.0, + 114.0 + ], + [ + 456.0, + 121.0 + ], + [ + 447.0, + 111.0 + ], + [ + 463.0, + 105.0 + ] + ], + "center_px": [ + 459.5, + 112.75 + ], + "area_px": 210.5 + }, + { + "image_points_px": [ + [ + 903.0, + 77.0 + ], + [ + 917.0, + 71.0 + ], + [ + 929.0, + 80.0 + ], + [ + 914.0, + 86.0 + ] + ], + "center_px": [ + 915.75, + 78.5 + ], + "area_px": 199.5 + }, + { + "image_points_px": [ + [ + 768.0, + 126.0 + ], + [ + 778.0, + 136.0 + ], + [ + 763.0, + 142.0 + ], + [ + 753.0, + 132.0 + ] + ], + "center_px": [ + 765.5, + 134.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 314.0, + 124.0 + ], + [ + 322.0, + 134.0 + ], + [ + 306.0, + 141.0 + ], + [ + 298.0, + 131.0 + ] + ], + "center_px": [ + 310.0, + 132.5 + ], + "area_px": 216.0 + }, + { + "image_points_px": [ + [ + 608.0, + 132.0 + ], + [ + 592.0, + 139.0 + ], + [ + 583.0, + 129.0 + ], + [ + 598.0, + 123.0 + ] + ], + "center_px": [ + 595.25, + 130.75 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 530.0, + 76.0 + ], + [ + 539.0, + 85.0 + ], + [ + 524.0, + 92.0 + ], + [ + 514.0, + 82.0 + ] + ], + "center_px": [ + 526.75, + 83.75 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 583.0, + 83.0 + ], + [ + 592.0, + 92.0 + ], + [ + 577.0, + 99.0 + ], + [ + 567.0, + 89.0 + ] + ], + "center_px": [ + 579.75, + 90.75 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 745.0, + 104.0 + ], + [ + 754.0, + 114.0 + ], + [ + 741.0, + 120.0 + ], + [ + 729.0, + 110.0 + ] + ], + "center_px": [ + 742.25, + 112.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 244.0, + 95.0 + ], + [ + 251.0, + 105.0 + ], + [ + 234.0, + 111.0 + ], + [ + 227.0, + 101.0 + ] + ], + "center_px": [ + 239.0, + 103.0 + ], + "area_px": 212.0 + }, + { + "image_points_px": [ + [ + 1069.0, + 80.0 + ], + [ + 1083.0, + 74.0 + ], + [ + 1095.0, + 83.0 + ], + [ + 1081.0, + 89.0 + ] + ], + "center_px": [ + 1082.0, + 81.5 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 1124.0, + 105.0 + ], + [ + 1138.0, + 99.0 + ], + [ + 1150.0, + 108.0 + ], + [ + 1136.0, + 114.0 + ] + ], + "center_px": [ + 1137.0, + 106.5 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 1014.0, + 73.0 + ], + [ + 1028.0, + 67.0 + ], + [ + 1040.0, + 76.0 + ], + [ + 1026.0, + 82.0 + ] + ], + "center_px": [ + 1027.0, + 74.5 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 830.0, + 96.0 + ], + [ + 841.0, + 106.0 + ], + [ + 826.0, + 112.0 + ], + [ + 816.0, + 102.0 + ] + ], + "center_px": [ + 828.25, + 104.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 721.0, + 82.0 + ], + [ + 732.0, + 92.0 + ], + [ + 717.0, + 98.0 + ], + [ + 707.0, + 88.0 + ] + ], + "center_px": [ + 719.25, + 90.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 523.0, + 597.0 + ], + [ + 536.0, + 613.0 + ], + [ + 528.0, + 618.0 + ], + [ + 515.0, + 601.0 + ] + ], + "center_px": [ + 525.5, + 607.25 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 619.0, + 95.0 + ], + [ + 603.0, + 102.0 + ], + [ + 594.0, + 93.0 + ], + [ + 610.0, + 86.0 + ] + ], + "center_px": [ + 606.5, + 94.0 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 526.0, + 121.0 + ], + [ + 510.0, + 128.0 + ], + [ + 501.0, + 119.0 + ], + [ + 517.0, + 112.0 + ] + ], + "center_px": [ + 513.5, + 120.0 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 691.0, + 97.0 + ], + [ + 700.0, + 106.0 + ], + [ + 686.0, + 113.0 + ], + [ + 675.0, + 103.0 + ] + ], + "center_px": [ + 688.0, + 104.75 + ], + "area_px": 207.5 + }, + { + "image_points_px": [ + [ + 663.0, + 93.0 + ], + [ + 673.0, + 103.0 + ], + [ + 658.0, + 109.0 + ], + [ + 648.0, + 100.0 + ] + ], + "center_px": [ + 660.5, + 101.25 + ], + "area_px": 207.5 + }, + { + "image_points_px": [ + [ + 776.0, + 89.0 + ], + [ + 786.0, + 99.0 + ], + [ + 771.0, + 105.0 + ], + [ + 761.0, + 96.0 + ] + ], + "center_px": [ + 773.5, + 97.25 + ], + "area_px": 207.5 + }, + { + "image_points_px": [ + [ + 641.0, + 72.0 + ], + [ + 651.0, + 81.0 + ], + [ + 636.0, + 88.0 + ], + [ + 626.0, + 78.0 + ] + ], + "center_px": [ + 638.5, + 79.75 + ], + "area_px": 207.5 + }, + { + "image_points_px": [ + [ + 588.0, + 65.0 + ], + [ + 598.0, + 74.0 + ], + [ + 583.0, + 81.0 + ], + [ + 573.0, + 71.0 + ] + ], + "center_px": [ + 585.5, + 72.75 + ], + "area_px": 207.5 + }, + { + "image_points_px": [ + [ + 749.0, + 86.0 + ], + [ + 759.0, + 95.0 + ], + [ + 744.0, + 102.0 + ], + [ + 734.0, + 92.0 + ] + ], + "center_px": [ + 746.5, + 93.75 + ], + "area_px": 207.5 + }, + { + "image_points_px": [ + [ + 772.0, + 107.0 + ], + [ + 782.0, + 117.0 + ], + [ + 767.0, + 123.0 + ], + [ + 757.0, + 114.0 + ] + ], + "center_px": [ + 769.5, + 115.25 + ], + "area_px": 207.5 + }, + { + "image_points_px": [ + [ + 1180.0, + 76.0 + ], + [ + 1193.0, + 70.0 + ], + [ + 1206.0, + 79.0 + ], + [ + 1193.0, + 85.0 + ] + ], + "center_px": [ + 1193.0, + 77.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 984.0, + 105.0 + ], + [ + 998.0, + 99.0 + ], + [ + 1009.0, + 109.0 + ], + [ + 995.0, + 115.0 + ] + ], + "center_px": [ + 996.5, + 107.0 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 954.0, + 120.0 + ], + [ + 968.0, + 114.0 + ], + [ + 979.0, + 124.0 + ], + [ + 965.0, + 130.0 + ] + ], + "center_px": [ + 966.5, + 122.0 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 885.0, + 103.0 + ], + [ + 896.0, + 113.0 + ], + [ + 882.0, + 119.0 + ], + [ + 871.0, + 109.0 + ] + ], + "center_px": [ + 883.5, + 111.0 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 865.0, + 127.0 + ], + [ + 850.0, + 134.0 + ], + [ + 840.0, + 124.0 + ], + [ + 854.0, + 118.0 + ] + ], + "center_px": [ + 852.25, + 125.75 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 858.0, + 100.0 + ], + [ + 868.0, + 109.0 + ], + [ + 854.0, + 116.0 + ], + [ + 843.0, + 106.0 + ] + ], + "center_px": [ + 855.75, + 107.75 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 1096.0, + 119.0 + ], + [ + 1109.0, + 113.0 + ], + [ + 1121.0, + 123.0 + ], + [ + 1107.0, + 129.0 + ] + ], + "center_px": [ + 1108.25, + 121.0 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 942.0, + 92.0 + ], + [ + 953.0, + 102.0 + ], + [ + 940.0, + 108.0 + ], + [ + 928.0, + 98.0 + ] + ], + "center_px": [ + 940.75, + 100.0 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 166.0, + 85.0 + ], + [ + 173.0, + 94.0 + ], + [ + 156.0, + 101.0 + ], + [ + 149.0, + 91.0 + ] + ], + "center_px": [ + 161.0, + 92.75 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 182.0, + 106.0 + ], + [ + 189.0, + 116.0 + ], + [ + 172.0, + 122.0 + ], + [ + 165.0, + 113.0 + ] + ], + "center_px": [ + 177.0, + 114.25 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 915.0, + 88.0 + ], + [ + 926.0, + 98.0 + ], + [ + 912.0, + 104.0 + ], + [ + 901.0, + 95.0 + ] + ], + "center_px": [ + 913.5, + 96.25 + ], + "area_px": 204.5 + }, + { + "image_points_px": [ + [ + 833.0, + 78.0 + ], + [ + 844.0, + 88.0 + ], + [ + 830.0, + 94.0 + ], + [ + 819.0, + 85.0 + ] + ], + "center_px": [ + 831.5, + 86.25 + ], + "area_px": 204.5 + }, + { + "image_points_px": [ + [ + 890.0, + 67.0 + ], + [ + 901.0, + 77.0 + ], + [ + 887.0, + 83.0 + ], + [ + 876.0, + 74.0 + ] + ], + "center_px": [ + 888.5, + 75.25 + ], + "area_px": 204.5 + }, + { + "image_points_px": [ + [ + 1097.0, + 83.0 + ], + [ + 1110.0, + 77.0 + ], + [ + 1122.0, + 87.0 + ], + [ + 1109.0, + 93.0 + ] + ], + "center_px": [ + 1109.5, + 85.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 1055.0, + 70.0 + ], + [ + 1067.0, + 80.0 + ], + [ + 1054.0, + 86.0 + ], + [ + 1042.0, + 76.0 + ] + ], + "center_px": [ + 1054.5, + 78.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 1029.0, + 49.0 + ], + [ + 1041.0, + 59.0 + ], + [ + 1028.0, + 65.0 + ], + [ + 1016.0, + 55.0 + ] + ], + "center_px": [ + 1028.5, + 57.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 1041.0, + 94.0 + ], + [ + 1054.0, + 88.0 + ], + [ + 1066.0, + 98.0 + ], + [ + 1053.0, + 104.0 + ] + ], + "center_px": [ + 1053.5, + 96.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 944.0, + 74.0 + ], + [ + 956.0, + 83.0 + ], + [ + 942.0, + 90.0 + ], + [ + 931.0, + 80.0 + ] + ], + "center_px": [ + 943.25, + 81.75 + ], + "area_px": 203.0 + }, + { + "image_points_px": [ + [ + 1001.0, + 63.0 + ], + [ + 1012.0, + 73.0 + ], + [ + 999.0, + 79.0 + ], + [ + 987.0, + 70.0 + ] + ], + "center_px": [ + 999.75, + 71.25 + ], + "area_px": 203.0 + }, + { + "image_points_px": [ + [ + 971.0, + 77.0 + ], + [ + 983.0, + 87.0 + ], + [ + 969.0, + 93.0 + ], + [ + 958.0, + 84.0 + ] + ], + "center_px": [ + 970.25, + 85.25 + ], + "area_px": 203.0 + }, + { + "image_points_px": [ + [ + 410.0, + 98.0 + ], + [ + 418.0, + 108.0 + ], + [ + 402.0, + 114.0 + ], + [ + 394.0, + 104.0 + ] + ], + "center_px": [ + 406.0, + 106.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 357.0, + 91.0 + ], + [ + 365.0, + 101.0 + ], + [ + 349.0, + 107.0 + ], + [ + 341.0, + 97.0 + ] + ], + "center_px": [ + 353.0, + 99.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 313.0, + 66.0 + ], + [ + 321.0, + 76.0 + ], + [ + 305.0, + 82.0 + ], + [ + 297.0, + 72.0 + ] + ], + "center_px": [ + 309.0, + 74.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 1125.0, + 86.0 + ], + [ + 1137.0, + 80.0 + ], + [ + 1150.0, + 90.0 + ], + [ + 1137.0, + 96.0 + ] + ], + "center_px": [ + 1137.25, + 88.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 1153.0, + 72.0 + ], + [ + 1165.0, + 66.0 + ], + [ + 1178.0, + 76.0 + ], + [ + 1165.0, + 82.0 + ] + ], + "center_px": [ + 1165.25, + 74.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 1098.0, + 65.0 + ], + [ + 1110.0, + 59.0 + ], + [ + 1123.0, + 69.0 + ], + [ + 1110.0, + 75.0 + ] + ], + "center_px": [ + 1110.25, + 67.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 522.0, + 377.0 + ], + [ + 531.0, + 389.0 + ], + [ + 513.0, + 397.0 + ], + [ + 510.0, + 394.0 + ] + ], + "center_px": [ + 519.0, + 389.25 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 253.0, + 77.0 + ], + [ + 260.0, + 87.0 + ], + [ + 244.0, + 93.0 + ], + [ + 236.0, + 84.0 + ] + ], + "center_px": [ + 248.25, + 85.25 + ], + "area_px": 205.5 + }, + { + "image_points_px": [ + [ + 304.0, + 111.0 + ], + [ + 287.0, + 118.0 + ], + [ + 280.0, + 108.0 + ], + [ + 296.0, + 102.0 + ] + ], + "center_px": [ + 291.75, + 109.75 + ], + "area_px": 205.5 + }, + { + "image_points_px": [ + [ + 279.0, + 81.0 + ], + [ + 286.0, + 90.0 + ], + [ + 270.0, + 97.0 + ], + [ + 262.0, + 87.0 + ] + ], + "center_px": [ + 274.25, + 88.75 + ], + "area_px": 205.5 + }, + { + "image_points_px": [ + [ + 227.0, + 74.0 + ], + [ + 234.0, + 83.0 + ], + [ + 218.0, + 90.0 + ], + [ + 210.0, + 80.0 + ] + ], + "center_px": [ + 222.25, + 81.75 + ], + "area_px": 205.5 + }, + { + "image_points_px": [ + [ + 519.0, + 64.0 + ], + [ + 502.0, + 70.0 + ], + [ + 494.0, + 61.0 + ], + [ + 509.0, + 55.0 + ] + ], + "center_px": [ + 506.0, + 62.5 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 646.0, + 99.0 + ], + [ + 630.0, + 105.0 + ], + [ + 621.0, + 96.0 + ], + [ + 637.0, + 90.0 + ] + ], + "center_px": [ + 633.5, + 97.5 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 714.0, + 166.0 + ], + [ + 693.0, + 168.0 + ], + [ + 688.0, + 163.0 + ], + [ + 703.0, + 156.0 + ] + ], + "center_px": [ + 699.5, + 163.25 + ], + "area_px": 171.0 + }, + { + "image_points_px": [ + [ + 223.0, + 132.0 + ], + [ + 231.0, + 143.0 + ], + [ + 216.0, + 149.0 + ], + [ + 208.0, + 138.0 + ] + ], + "center_px": [ + 219.5, + 140.5 + ], + "area_px": 213.0 + }, + { + "image_points_px": [ + [ + 705.0, + 88.0 + ], + [ + 689.0, + 94.0 + ], + [ + 680.0, + 85.0 + ], + [ + 695.0, + 79.0 + ] + ], + "center_px": [ + 692.25, + 86.5 + ], + "area_px": 196.5 + }, + { + "image_points_px": [ + [ + 678.0, + 85.0 + ], + [ + 663.0, + 91.0 + ], + [ + 653.0, + 82.0 + ], + [ + 669.0, + 76.0 + ] + ], + "center_px": [ + 665.75, + 83.5 + ], + "area_px": 196.5 + }, + { + "image_points_px": [ + [ + 736.0, + 74.0 + ], + [ + 721.0, + 80.0 + ], + [ + 711.0, + 71.0 + ], + [ + 727.0, + 65.0 + ] + ], + "center_px": [ + 723.75, + 72.5 + ], + "area_px": 196.5 + }, + { + "image_points_px": [ + [ + 630.0, + 60.0 + ], + [ + 614.0, + 66.0 + ], + [ + 605.0, + 57.0 + ], + [ + 620.0, + 51.0 + ] + ], + "center_px": [ + 617.25, + 58.5 + ], + "area_px": 196.5 + }, + { + "image_points_px": [ + [ + 384.0, + 95.0 + ], + [ + 392.0, + 104.0 + ], + [ + 376.0, + 111.0 + ], + [ + 368.0, + 101.0 + ] + ], + "center_px": [ + 380.0, + 102.75 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 287.0, + 63.0 + ], + [ + 295.0, + 72.0 + ], + [ + 279.0, + 79.0 + ], + [ + 271.0, + 69.0 + ] + ], + "center_px": [ + 283.0, + 70.75 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 355.0, + 35.0 + ], + [ + 363.0, + 44.0 + ], + [ + 347.0, + 51.0 + ], + [ + 339.0, + 41.0 + ] + ], + "center_px": [ + 351.0, + 42.75 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 339.0, + 96.0 + ], + [ + 322.0, + 103.0 + ], + [ + 315.0, + 94.0 + ], + [ + 331.0, + 87.0 + ] + ], + "center_px": [ + 326.75, + 95.0 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 577.0, + 101.0 + ], + [ + 586.0, + 111.0 + ], + [ + 571.0, + 117.0 + ], + [ + 562.0, + 107.0 + ] + ], + "center_px": [ + 574.0, + 109.0 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 788.0, + 99.0 + ], + [ + 803.0, + 93.0 + ], + [ + 813.0, + 102.0 + ], + [ + 798.0, + 108.0 + ] + ], + "center_px": [ + 800.5, + 100.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 817.0, + 84.0 + ], + [ + 802.0, + 90.0 + ], + [ + 792.0, + 81.0 + ], + [ + 807.0, + 75.0 + ] + ], + "center_px": [ + 804.5, + 82.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 763.0, + 77.0 + ], + [ + 748.0, + 83.0 + ], + [ + 738.0, + 74.0 + ], + [ + 753.0, + 68.0 + ] + ], + "center_px": [ + 750.5, + 75.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 683.0, + 67.0 + ], + [ + 668.0, + 73.0 + ], + [ + 658.0, + 64.0 + ], + [ + 673.0, + 58.0 + ] + ], + "center_px": [ + 670.5, + 65.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 635.0, + 43.0 + ], + [ + 620.0, + 49.0 + ], + [ + 610.0, + 40.0 + ], + [ + 625.0, + 34.0 + ] + ], + "center_px": [ + 622.5, + 41.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 556.0, + 79.0 + ], + [ + 565.0, + 89.0 + ], + [ + 550.0, + 95.0 + ], + [ + 541.0, + 85.0 + ] + ], + "center_px": [ + 553.0, + 87.0 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 714.0, + 53.0 + ], + [ + 699.0, + 59.0 + ], + [ + 689.0, + 50.0 + ], + [ + 704.0, + 44.0 + ] + ], + "center_px": [ + 701.5, + 51.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 550.0, + 97.0 + ], + [ + 559.0, + 107.0 + ], + [ + 544.0, + 113.0 + ], + [ + 535.0, + 103.0 + ] + ], + "center_px": [ + 547.0, + 105.0 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 985.0, + 87.0 + ], + [ + 999.0, + 81.0 + ], + [ + 1010.0, + 91.0 + ], + [ + 996.0, + 96.0 + ] + ], + "center_px": [ + 997.5, + 88.75 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 426.0, + 89.0 + ], + [ + 410.0, + 96.0 + ], + [ + 402.0, + 86.0 + ], + [ + 417.0, + 80.0 + ] + ], + "center_px": [ + 413.75, + 87.75 + ], + "area_px": 202.5 + }, + { + "image_points_px": [ + [ + 486.0, + 78.0 + ], + [ + 470.0, + 85.0 + ], + [ + 462.0, + 75.0 + ], + [ + 477.0, + 69.0 + ] + ], + "center_px": [ + 473.75, + 76.75 + ], + "area_px": 202.5 + }, + { + "image_points_px": [ + [ + 765.0, + 78.0 + ], + [ + 780.0, + 72.0 + ], + [ + 790.0, + 81.0 + ], + [ + 776.0, + 87.0 + ] + ], + "center_px": [ + 777.75, + 79.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 874.0, + 73.0 + ], + [ + 859.0, + 79.0 + ], + [ + 849.0, + 70.0 + ], + [ + 863.0, + 64.0 + ] + ], + "center_px": [ + 861.25, + 71.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 769.0, + 60.0 + ], + [ + 783.0, + 54.0 + ], + [ + 794.0, + 63.0 + ], + [ + 779.0, + 69.0 + ] + ], + "center_px": [ + 781.25, + 61.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 824.0, + 49.0 + ], + [ + 809.0, + 55.0 + ], + [ + 799.0, + 46.0 + ], + [ + 813.0, + 40.0 + ] + ], + "center_px": [ + 811.25, + 47.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 757.0, + 51.0 + ], + [ + 767.0, + 60.0 + ], + [ + 753.0, + 66.0 + ], + [ + 742.0, + 57.0 + ] + ], + "center_px": [ + 754.75, + 58.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 365.0, + 73.0 + ], + [ + 373.0, + 83.0 + ], + [ + 356.0, + 88.0 + ], + [ + 349.0, + 79.0 + ] + ], + "center_px": [ + 360.75, + 80.75 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 717.0, + 100.0 + ], + [ + 727.0, + 110.0 + ], + [ + 712.0, + 116.0 + ], + [ + 703.0, + 106.0 + ] + ], + "center_px": [ + 714.75, + 108.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 867.0, + 47.0 + ], + [ + 877.0, + 56.0 + ], + [ + 864.0, + 62.0 + ], + [ + 852.0, + 53.0 + ] + ], + "center_px": [ + 865.0, + 54.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 503.0, + 72.0 + ], + [ + 512.0, + 82.0 + ], + [ + 497.0, + 88.0 + ], + [ + 488.0, + 79.0 + ] + ], + "center_px": [ + 500.0, + 80.25 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 562.0, + 61.0 + ], + [ + 571.0, + 71.0 + ], + [ + 556.0, + 77.0 + ], + [ + 547.0, + 68.0 + ] + ], + "center_px": [ + 559.0, + 69.25 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 974.0, + 60.0 + ], + [ + 985.0, + 69.0 + ], + [ + 971.0, + 75.0 + ], + [ + 960.0, + 66.0 + ] + ], + "center_px": [ + 972.5, + 67.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 933.0, + 63.0 + ], + [ + 947.0, + 57.0 + ], + [ + 958.0, + 66.0 + ], + [ + 944.0, + 72.0 + ] + ], + "center_px": [ + 945.5, + 64.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 893.0, + 50.0 + ], + [ + 904.0, + 59.0 + ], + [ + 890.0, + 65.0 + ], + [ + 879.0, + 56.0 + ] + ], + "center_px": [ + 891.5, + 57.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 790.0, + 20.0 + ], + [ + 801.0, + 29.0 + ], + [ + 787.0, + 35.0 + ], + [ + 776.0, + 26.0 + ] + ], + "center_px": [ + 788.5, + 27.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 872.0, + 13.0 + ], + [ + 883.0, + 22.0 + ], + [ + 869.0, + 28.0 + ], + [ + 858.0, + 19.0 + ] + ], + "center_px": [ + 870.5, + 20.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 956.0, + 102.0 + ], + [ + 970.0, + 96.0 + ], + [ + 981.0, + 105.0 + ], + [ + 967.0, + 111.0 + ] + ], + "center_px": [ + 968.5, + 103.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 1098.0, + 48.0 + ], + [ + 1111.0, + 42.0 + ], + [ + 1123.0, + 52.0 + ], + [ + 1110.0, + 57.0 + ] + ], + "center_px": [ + 1110.5, + 49.75 + ], + "area_px": 189.5 + }, + { + "image_points_px": [ + [ + 1070.0, + 62.0 + ], + [ + 1083.0, + 56.0 + ], + [ + 1095.0, + 66.0 + ], + [ + 1082.0, + 71.0 + ] + ], + "center_px": [ + 1082.5, + 63.75 + ], + "area_px": 189.5 + }, + { + "image_points_px": [ + [ + 433.0, + 71.0 + ], + [ + 417.0, + 78.0 + ], + [ + 409.0, + 69.0 + ], + [ + 424.0, + 62.0 + ] + ], + "center_px": [ + 420.75, + 70.0 + ], + "area_px": 199.0 + }, + { + "image_points_px": [ + [ + 237.0, + 497.0 + ], + [ + 247.0, + 512.0 + ], + [ + 236.0, + 517.0 + ], + [ + 227.0, + 502.0 + ] + ], + "center_px": [ + 236.75, + 507.0 + ], + "area_px": 205.0 + }, + { + "image_points_px": [ + [ + 1014.0, + 55.0 + ], + [ + 1000.0, + 61.0 + ], + [ + 989.0, + 52.0 + ], + [ + 1002.0, + 46.0 + ] + ], + "center_px": [ + 1001.25, + 53.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 1071.0, + 45.0 + ], + [ + 1085.0, + 39.0 + ], + [ + 1096.0, + 48.0 + ], + [ + 1083.0, + 54.0 + ] + ], + "center_px": [ + 1083.75, + 46.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 1044.0, + 42.0 + ], + [ + 1058.0, + 36.0 + ], + [ + 1069.0, + 45.0 + ], + [ + 1056.0, + 51.0 + ] + ], + "center_px": [ + 1056.75, + 43.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 964.0, + 32.0 + ], + [ + 978.0, + 26.0 + ], + [ + 989.0, + 35.0 + ], + [ + 976.0, + 41.0 + ] + ], + "center_px": [ + 976.75, + 33.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 1043.0, + 59.0 + ], + [ + 1057.0, + 53.0 + ], + [ + 1068.0, + 62.0 + ], + [ + 1055.0, + 68.0 + ] + ], + "center_px": [ + 1055.75, + 60.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 699.0, + 61.0 + ], + [ + 709.0, + 71.0 + ], + [ + 695.0, + 77.0 + ], + [ + 685.0, + 67.0 + ] + ], + "center_px": [ + 697.0, + 69.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 810.0, + 57.0 + ], + [ + 820.0, + 67.0 + ], + [ + 806.0, + 73.0 + ], + [ + 796.0, + 63.0 + ] + ], + "center_px": [ + 808.0, + 65.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 646.0, + 54.0 + ], + [ + 656.0, + 64.0 + ], + [ + 641.0, + 70.0 + ], + [ + 632.0, + 61.0 + ] + ], + "center_px": [ + 643.75, + 62.25 + ], + "area_px": 199.5 + }, + { + "image_points_px": [ + [ + 1072.0, + 28.0 + ], + [ + 1085.0, + 22.0 + ], + [ + 1097.0, + 31.0 + ], + [ + 1084.0, + 37.0 + ] + ], + "center_px": [ + 1084.5, + 29.5 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 1125.0, + 69.0 + ], + [ + 1138.0, + 63.0 + ], + [ + 1150.0, + 72.0 + ], + [ + 1137.0, + 78.0 + ] + ], + "center_px": [ + 1137.5, + 70.5 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 962.0, + 49.0 + ], + [ + 975.0, + 43.0 + ], + [ + 987.0, + 52.0 + ], + [ + 974.0, + 58.0 + ] + ], + "center_px": [ + 974.5, + 50.5 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 445.0, + 84.0 + ], + [ + 452.0, + 93.0 + ], + [ + 436.0, + 99.0 + ], + [ + 428.0, + 90.0 + ] + ], + "center_px": [ + 440.25, + 91.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 347.0, + 79.0 + ], + [ + 330.0, + 85.0 + ], + [ + 323.0, + 76.0 + ], + [ + 339.0, + 70.0 + ] + ], + "center_px": [ + 334.75, + 77.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 218.0, + 62.0 + ], + [ + 201.0, + 68.0 + ], + [ + 194.0, + 59.0 + ], + [ + 210.0, + 53.0 + ] + ], + "center_px": [ + 205.75, + 60.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 888.0, + 85.0 + ], + [ + 898.0, + 95.0 + ], + [ + 885.0, + 101.0 + ], + [ + 874.0, + 91.0 + ] + ], + "center_px": [ + 886.25, + 93.0 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 730.0, + 47.0 + ], + [ + 740.0, + 56.0 + ], + [ + 726.0, + 63.0 + ], + [ + 716.0, + 53.0 + ] + ], + "center_px": [ + 728.0, + 54.75 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 262.0, + 60.0 + ], + [ + 269.0, + 69.0 + ], + [ + 254.0, + 75.0 + ], + [ + 245.0, + 66.0 + ] + ], + "center_px": [ + 257.5, + 67.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 407.0, + 68.0 + ], + [ + 391.0, + 74.0 + ], + [ + 383.0, + 65.0 + ], + [ + 399.0, + 59.0 + ] + ], + "center_px": [ + 395.0, + 66.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 440.0, + 54.0 + ], + [ + 424.0, + 60.0 + ], + [ + 416.0, + 51.0 + ], + [ + 432.0, + 45.0 + ] + ], + "center_px": [ + 428.0, + 52.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 252.0, + 48.0 + ], + [ + 236.0, + 54.0 + ], + [ + 228.0, + 45.0 + ], + [ + 244.0, + 39.0 + ] + ], + "center_px": [ + 240.0, + 46.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 337.0, + 41.0 + ], + [ + 321.0, + 47.0 + ], + [ + 313.0, + 38.0 + ], + [ + 329.0, + 32.0 + ] + ], + "center_px": [ + 325.0, + 39.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 381.0, + 65.0 + ], + [ + 365.0, + 71.0 + ], + [ + 357.0, + 62.0 + ], + [ + 373.0, + 56.0 + ] + ], + "center_px": [ + 369.0, + 63.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 329.0, + 58.0 + ], + [ + 313.0, + 64.0 + ], + [ + 305.0, + 55.0 + ], + [ + 321.0, + 49.0 + ] + ], + "center_px": [ + 317.0, + 56.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 261.0, + 31.0 + ], + [ + 245.0, + 37.0 + ], + [ + 237.0, + 28.0 + ], + [ + 253.0, + 22.0 + ] + ], + "center_px": [ + 249.0, + 29.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 236.0, + 56.0 + ], + [ + 243.0, + 65.0 + ], + [ + 227.0, + 72.0 + ], + [ + 220.0, + 62.0 + ] + ], + "center_px": [ + 231.5, + 63.75 + ], + "area_px": 197.5 + }, + { + "image_points_px": [ + [ + 257.0, + 530.0 + ], + [ + 268.0, + 545.0 + ], + [ + 257.0, + 550.0 + ], + [ + 248.0, + 536.0 + ] + ], + "center_px": [ + 257.5, + 540.25 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 525.0, + 47.0 + ], + [ + 509.0, + 53.0 + ], + [ + 501.0, + 44.0 + ], + [ + 516.0, + 38.0 + ] + ], + "center_px": [ + 512.75, + 45.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 447.0, + 37.0 + ], + [ + 431.0, + 43.0 + ], + [ + 423.0, + 34.0 + ], + [ + 438.0, + 28.0 + ] + ], + "center_px": [ + 434.75, + 35.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 348.0, + 53.0 + ], + [ + 355.0, + 61.0 + ], + [ + 340.0, + 68.0 + ], + [ + 331.0, + 59.0 + ] + ], + "center_px": [ + 343.5, + 60.25 + ], + "area_px": 188.0 + }, + { + "image_points_px": [ + [ + 217.0, + 466.0 + ], + [ + 226.0, + 481.0 + ], + [ + 215.0, + 485.0 + ], + [ + 206.0, + 471.0 + ] + ], + "center_px": [ + 216.0, + 475.75 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 913.0, + 9.0 + ], + [ + 927.0, + 3.0 + ], + [ + 938.0, + 12.0 + ], + [ + 924.0, + 17.0 + ] + ], + "center_px": [ + 925.5, + 10.25 + ], + "area_px": 179.5 + }, + { + "image_points_px": [ + [ + 1045.0, + 25.0 + ], + [ + 1059.0, + 19.0 + ], + [ + 1070.0, + 28.0 + ], + [ + 1056.0, + 33.0 + ] + ], + "center_px": [ + 1057.5, + 26.25 + ], + "area_px": 179.5 + }, + { + "image_points_px": [ + [ + 545.0, + 67.0 + ], + [ + 530.0, + 74.0 + ], + [ + 521.0, + 64.0 + ], + [ + 536.0, + 59.0 + ] + ], + "center_px": [ + 533.0, + 66.0 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 551.0, + 50.0 + ], + [ + 535.0, + 56.0 + ], + [ + 527.0, + 47.0 + ], + [ + 541.0, + 41.0 + ] + ], + "center_px": [ + 538.5, + 48.5 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 906.0, + 60.0 + ], + [ + 920.0, + 54.0 + ], + [ + 931.0, + 62.0 + ], + [ + 916.0, + 68.0 + ] + ], + "center_px": [ + 918.25, + 61.0 + ], + "area_px": 179.0 + }, + { + "image_points_px": [ + [ + 1099.0, + 31.0 + ], + [ + 1113.0, + 26.0 + ], + [ + 1124.0, + 34.0 + ], + [ + 1111.0, + 40.0 + ] + ], + "center_px": [ + 1111.75, + 32.75 + ], + "area_px": 178.0 + }, + { + "image_points_px": [ + [ + 531.0, + 30.0 + ], + [ + 516.0, + 36.0 + ], + [ + 507.0, + 27.0 + ], + [ + 522.0, + 21.0 + ] + ], + "center_px": [ + 519.0, + 28.5 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 499.0, + 44.0 + ], + [ + 484.0, + 50.0 + ], + [ + 475.0, + 41.0 + ], + [ + 490.0, + 35.0 + ] + ], + "center_px": [ + 487.0, + 42.5 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 505.0, + 27.0 + ], + [ + 490.0, + 33.0 + ], + [ + 481.0, + 24.0 + ], + [ + 496.0, + 18.0 + ] + ], + "center_px": [ + 493.0, + 25.5 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 837.0, + 61.0 + ], + [ + 847.0, + 70.0 + ], + [ + 833.0, + 76.0 + ], + [ + 823.0, + 66.0 + ] + ], + "center_px": [ + 835.0, + 68.25 + ], + "area_px": 188.0 + }, + { + "image_points_px": [ + [ + 856.0, + 35.0 + ], + [ + 870.0, + 30.0 + ], + [ + 880.0, + 39.0 + ], + [ + 866.0, + 45.0 + ] + ], + "center_px": [ + 868.0, + 37.25 + ], + "area_px": 188.0 + }, + { + "image_points_px": [ + [ + 492.0, + 60.0 + ], + [ + 477.0, + 67.0 + ], + [ + 468.0, + 58.0 + ], + [ + 484.0, + 52.0 + ] + ], + "center_px": [ + 480.25, + 59.25 + ], + "area_px": 187.0 + }, + { + "image_points_px": [ + [ + 678.0, + 41.0 + ], + [ + 687.0, + 50.0 + ], + [ + 673.0, + 56.0 + ], + [ + 663.0, + 47.0 + ] + ], + "center_px": [ + 675.25, + 48.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 640.0, + 26.0 + ], + [ + 625.0, + 32.0 + ], + [ + 616.0, + 23.0 + ], + [ + 630.0, + 17.0 + ] + ], + "center_px": [ + 627.75, + 24.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 614.0, + 23.0 + ], + [ + 599.0, + 29.0 + ], + [ + 590.0, + 20.0 + ], + [ + 604.0, + 14.0 + ] + ], + "center_px": [ + 601.75, + 21.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 579.0, + 11.0 + ], + [ + 588.0, + 20.0 + ], + [ + 574.0, + 26.0 + ], + [ + 564.0, + 17.0 + ] + ], + "center_px": [ + 576.25, + 18.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 671.0, + 13.0 + ], + [ + 656.0, + 19.0 + ], + [ + 647.0, + 10.0 + ], + [ + 661.0, + 4.0 + ] + ], + "center_px": [ + 658.75, + 11.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 826.0, + 49.0 + ], + [ + 840.0, + 44.0 + ], + [ + 850.0, + 53.0 + ], + [ + 837.0, + 59.0 + ] + ], + "center_px": [ + 838.25, + 51.25 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 924.0, + 19.0 + ], + [ + 935.0, + 29.0 + ], + [ + 921.0, + 34.0 + ], + [ + 911.0, + 25.0 + ] + ], + "center_px": [ + 922.75, + 26.75 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 624.0, + 77.0 + ], + [ + 609.0, + 84.0 + ], + [ + 600.0, + 75.0 + ], + [ + 615.0, + 69.0 + ] + ], + "center_px": [ + 612.0, + 76.25 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 603.0, + 56.0 + ], + [ + 588.0, + 63.0 + ], + [ + 579.0, + 54.0 + ], + [ + 594.0, + 48.0 + ] + ], + "center_px": [ + 591.0, + 55.25 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 761.0, + 34.0 + ], + [ + 770.0, + 43.0 + ], + [ + 757.0, + 49.0 + ], + [ + 746.0, + 40.0 + ] + ], + "center_px": [ + 758.5, + 41.5 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 708.0, + 27.0 + ], + [ + 718.0, + 36.0 + ], + [ + 704.0, + 42.0 + ], + [ + 694.0, + 33.0 + ] + ], + "center_px": [ + 706.0, + 34.5 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 712.0, + 10.0 + ], + [ + 722.0, + 19.0 + ], + [ + 708.0, + 25.0 + ], + [ + 698.0, + 16.0 + ] + ], + "center_px": [ + 710.0, + 17.5 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 787.0, + 37.0 + ], + [ + 797.0, + 46.0 + ], + [ + 783.0, + 52.0 + ], + [ + 773.0, + 43.0 + ] + ], + "center_px": [ + 785.0, + 44.5 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 734.0, + 30.0 + ], + [ + 744.0, + 39.0 + ], + [ + 730.0, + 45.0 + ], + [ + 720.0, + 36.0 + ] + ], + "center_px": [ + 732.0, + 37.5 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 682.0, + 24.0 + ], + [ + 692.0, + 33.0 + ], + [ + 678.0, + 39.0 + ], + [ + 668.0, + 30.0 + ] + ], + "center_px": [ + 680.0, + 31.5 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 936.0, + 45.0 + ], + [ + 949.0, + 40.0 + ], + [ + 960.0, + 49.0 + ], + [ + 947.0, + 55.0 + ] + ], + "center_px": [ + 948.0, + 47.25 + ], + "area_px": 184.0 + }, + { + "image_points_px": [ + [ + 816.0, + 23.0 + ], + [ + 827.0, + 32.0 + ], + [ + 813.0, + 38.0 + ], + [ + 803.0, + 29.0 + ] + ], + "center_px": [ + 814.75, + 30.5 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 557.0, + 33.0 + ], + [ + 541.0, + 39.0 + ], + [ + 533.0, + 30.0 + ], + [ + 549.0, + 25.0 + ] + ], + "center_px": [ + 545.0, + 31.75 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 473.0, + 40.0 + ], + [ + 457.0, + 46.0 + ], + [ + 449.0, + 37.0 + ], + [ + 465.0, + 32.0 + ] + ], + "center_px": [ + 461.0, + 38.75 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 979.0, + 9.0 + ], + [ + 990.0, + 18.0 + ], + [ + 977.0, + 24.0 + ], + [ + 966.0, + 15.0 + ] + ], + "center_px": [ + 978.0, + 16.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 1004.0, + 29.0 + ], + [ + 1015.0, + 38.0 + ], + [ + 1002.0, + 44.0 + ], + [ + 991.0, + 35.0 + ] + ], + "center_px": [ + 1003.0, + 36.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 577.0, + 53.0 + ], + [ + 561.0, + 59.0 + ], + [ + 553.0, + 50.0 + ], + [ + 568.0, + 45.0 + ] + ], + "center_px": [ + 564.75, + 51.75 + ], + "area_px": 178.5 + }, + { + "image_points_px": [ + [ + 1100.0, + 15.0 + ], + [ + 1113.0, + 9.0 + ], + [ + 1124.0, + 18.0 + ], + [ + 1112.0, + 24.0 + ] + ], + "center_px": [ + 1112.25, + 16.5 + ], + "area_px": 181.5 + }, + { + "image_points_px": [ + [ + 206.0, + 110.0 + ], + [ + 213.0, + 121.0 + ], + [ + 199.0, + 126.0 + ], + [ + 191.0, + 116.0 + ] + ], + "center_px": [ + 202.25, + 118.25 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 336.0, + 540.0 + ], + [ + 337.0, + 544.0 + ], + [ + 321.0, + 563.0 + ], + [ + 322.0, + 558.0 + ] + ], + "center_px": [ + 329.0, + 551.25 + ], + "area_px": 67.5 + }, + { + "image_points_px": [ + [ + 829.0, + 32.0 + ], + [ + 844.0, + 27.0 + ], + [ + 853.0, + 36.0 + ], + [ + 839.0, + 41.0 + ] + ], + "center_px": [ + 841.25, + 34.0 + ], + "area_px": 178.0 + }, + { + "image_points_px": [ + [ + 189.0, + 88.0 + ], + [ + 197.0, + 99.0 + ], + [ + 182.0, + 104.0 + ], + [ + 175.0, + 94.0 + ] + ], + "center_px": [ + 185.75, + 96.25 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 466.0, + 57.0 + ], + [ + 450.0, + 63.0 + ], + [ + 442.0, + 55.0 + ], + [ + 458.0, + 49.0 + ] + ], + "center_px": [ + 454.0, + 56.0 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 396.0, + 30.0 + ], + [ + 380.0, + 36.0 + ], + [ + 372.0, + 28.0 + ], + [ + 388.0, + 22.0 + ] + ], + "center_px": [ + 384.0, + 29.0 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 637.0, + 43.0 + ], + [ + 652.0, + 38.0 + ], + [ + 661.0, + 46.0 + ], + [ + 646.0, + 52.0 + ] + ], + "center_px": [ + 649.0, + 44.75 + ], + "area_px": 177.0 + }, + { + "image_points_px": [ + [ + 642.0, + 26.0 + ], + [ + 657.0, + 21.0 + ], + [ + 666.0, + 29.0 + ], + [ + 651.0, + 35.0 + ] + ], + "center_px": [ + 654.0, + 27.75 + ], + "area_px": 177.0 + }, + { + "image_points_px": [ + [ + 219.0, + 36.0 + ], + [ + 226.0, + 45.0 + ], + [ + 211.0, + 51.0 + ], + [ + 203.0, + 42.0 + ] + ], + "center_px": [ + 214.75, + 43.5 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 287.0, + 9.0 + ], + [ + 294.0, + 18.0 + ], + [ + 279.0, + 24.0 + ], + [ + 271.0, + 15.0 + ] + ], + "center_px": [ + 282.75, + 16.5 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 381.0, + 39.0 + ], + [ + 388.0, + 48.0 + ], + [ + 373.0, + 54.0 + ], + [ + 365.0, + 45.0 + ] + ], + "center_px": [ + 376.75, + 46.5 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 304.0, + 29.0 + ], + [ + 311.0, + 38.0 + ], + [ + 296.0, + 44.0 + ], + [ + 288.0, + 35.0 + ] + ], + "center_px": [ + 299.75, + 36.5 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 925.0, + 135.0 + ], + [ + 938.0, + 129.0 + ], + [ + 948.0, + 138.0 + ], + [ + 935.0, + 145.0 + ] + ], + "center_px": [ + 936.5, + 136.75 + ], + "area_px": 188.5 + }, + { + "image_points_px": [ + [ + 774.0, + 26.0 + ], + [ + 760.0, + 31.0 + ], + [ + 750.0, + 23.0 + ], + [ + 765.0, + 17.0 + ] + ], + "center_px": [ + 762.25, + 24.25 + ], + "area_px": 175.5 + }, + { + "image_points_px": [ + [ + 748.0, + 23.0 + ], + [ + 734.0, + 28.0 + ], + [ + 724.0, + 20.0 + ], + [ + 739.0, + 14.0 + ] + ], + "center_px": [ + 736.25, + 21.25 + ], + "area_px": 175.5 + }, + { + "image_points_px": [ + [ + 780.0, + 9.0 + ], + [ + 795.0, + 4.0 + ], + [ + 804.0, + 12.0 + ], + [ + 790.0, + 18.0 + ] + ], + "center_px": [ + 792.25, + 10.75 + ], + "area_px": 175.5 + }, + { + "image_points_px": [ + [ + 938.0, + 28.0 + ], + [ + 951.0, + 23.0 + ], + [ + 962.0, + 32.0 + ], + [ + 948.0, + 37.0 + ] + ], + "center_px": [ + 949.75, + 30.0 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 395.0, + 5.0 + ], + [ + 403.0, + 14.0 + ], + [ + 388.0, + 20.0 + ], + [ + 380.0, + 11.0 + ] + ], + "center_px": [ + 391.5, + 12.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 428.0, + 17.0 + ], + [ + 413.0, + 23.0 + ], + [ + 405.0, + 14.0 + ], + [ + 420.0, + 8.0 + ] + ], + "center_px": [ + 416.5, + 15.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 856.0, + 19.0 + ], + [ + 842.0, + 24.0 + ], + [ + 832.0, + 16.0 + ], + [ + 846.0, + 10.0 + ] + ], + "center_px": [ + 844.0, + 17.25 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 830.0, + 16.0 + ], + [ + 816.0, + 21.0 + ], + [ + 806.0, + 13.0 + ], + [ + 820.0, + 7.0 + ] + ], + "center_px": [ + 818.0, + 14.25 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 885.0, + 22.0 + ], + [ + 899.0, + 17.0 + ], + [ + 909.0, + 25.0 + ], + [ + 895.0, + 31.0 + ] + ], + "center_px": [ + 897.0, + 23.75 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 1018.0, + 38.0 + ], + [ + 1031.0, + 33.0 + ], + [ + 1042.0, + 42.0 + ], + [ + 1029.0, + 47.0 + ] + ], + "center_px": [ + 1030.0, + 40.0 + ], + "area_px": 172.0 + }, + { + "image_points_px": [ + [ + 1126.0, + 34.0 + ], + [ + 1139.0, + 29.0 + ], + [ + 1150.0, + 38.0 + ], + [ + 1137.0, + 43.0 + ] + ], + "center_px": [ + 1138.0, + 36.0 + ], + "area_px": 172.0 + }, + { + "image_points_px": [ + [ + 1019.0, + 21.0 + ], + [ + 1032.0, + 16.0 + ], + [ + 1043.0, + 25.0 + ], + [ + 1030.0, + 30.0 + ] + ], + "center_px": [ + 1031.0, + 23.0 + ], + "area_px": 172.0 + }, + { + "image_points_px": [ + [ + 993.0, + 18.0 + ], + [ + 1006.0, + 13.0 + ], + [ + 1017.0, + 21.0 + ], + [ + 1003.0, + 27.0 + ] + ], + "center_px": [ + 1004.75, + 19.75 + ], + "area_px": 172.5 + }, + { + "image_points_px": [ + [ + 940.0, + 12.0 + ], + [ + 953.0, + 6.0 + ], + [ + 964.0, + 15.0 + ], + [ + 950.0, + 20.0 + ] + ], + "center_px": [ + 951.75, + 13.25 + ], + "area_px": 172.5 + }, + { + "image_points_px": [ + [ + 471.0, + 15.0 + ], + [ + 479.0, + 24.0 + ], + [ + 465.0, + 30.0 + ], + [ + 456.0, + 21.0 + ] + ], + "center_px": [ + 467.75, + 22.5 + ], + "area_px": 181.5 + }, + { + "image_points_px": [ + [ + 1073.0, + 11.0 + ], + [ + 1086.0, + 6.0 + ], + [ + 1097.0, + 15.0 + ], + [ + 1085.0, + 20.0 + ] + ], + "center_px": [ + 1085.25, + 13.0 + ], + "area_px": 170.0 + }, + { + "image_points_px": [ + [ + 177.0, + 405.0 + ], + [ + 186.0, + 420.0 + ], + [ + 176.0, + 424.0 + ], + [ + 167.0, + 410.0 + ] + ], + "center_px": [ + 176.5, + 414.75 + ], + "area_px": 185.5 + }, + { + "image_points_px": [ + [ + 414.0, + 50.0 + ], + [ + 399.0, + 57.0 + ], + [ + 391.0, + 48.0 + ], + [ + 406.0, + 42.0 + ] + ], + "center_px": [ + 402.5, + 49.25 + ], + "area_px": 179.5 + }, + { + "image_points_px": [ + [ + 421.0, + 33.0 + ], + [ + 406.0, + 40.0 + ], + [ + 398.0, + 31.0 + ], + [ + 413.0, + 25.0 + ] + ], + "center_px": [ + 409.5, + 32.25 + ], + "area_px": 179.5 + }, + { + "image_points_px": [ + [ + 600.0, + 31.0 + ], + [ + 608.0, + 40.0 + ], + [ + 595.0, + 46.0 + ], + [ + 585.0, + 37.0 + ] + ], + "center_px": [ + 597.0, + 38.5 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 286.0, + 34.0 + ], + [ + 270.0, + 40.0 + ], + [ + 263.0, + 31.0 + ], + [ + 279.0, + 26.0 + ] + ], + "center_px": [ + 274.5, + 32.75 + ], + "area_px": 174.5 + }, + { + "image_points_px": [ + [ + 370.0, + 27.0 + ], + [ + 354.0, + 33.0 + ], + [ + 347.0, + 24.0 + ], + [ + 363.0, + 19.0 + ] + ], + "center_px": [ + 358.5, + 25.75 + ], + "area_px": 174.5 + }, + { + "image_points_px": [ + [ + 454.0, + 20.0 + ], + [ + 438.0, + 26.0 + ], + [ + 431.0, + 17.0 + ], + [ + 446.0, + 12.0 + ] + ], + "center_px": [ + 442.25, + 18.75 + ], + "area_px": 173.0 + }, + { + "image_points_px": [ + [ + 582.0, + 36.0 + ], + [ + 567.0, + 42.0 + ], + [ + 559.0, + 33.0 + ], + [ + 574.0, + 28.0 + ] + ], + "center_px": [ + 570.5, + 34.75 + ], + "area_px": 171.5 + }, + { + "image_points_px": [ + [ + 537.0, + 13.0 + ], + [ + 522.0, + 19.0 + ], + [ + 514.0, + 10.0 + ], + [ + 528.0, + 5.0 + ] + ], + "center_px": [ + 525.25, + 11.75 + ], + "area_px": 170.0 + }, + { + "image_points_px": [ + [ + 673.0, + 13.0 + ], + [ + 688.0, + 8.0 + ], + [ + 696.0, + 16.0 + ], + [ + 682.0, + 22.0 + ] + ], + "center_px": [ + 684.75, + 14.75 + ], + "area_px": 170.0 + }, + { + "image_points_px": [ + [ + 562.0, + 16.0 + ], + [ + 547.0, + 22.0 + ], + [ + 539.0, + 14.0 + ], + [ + 553.0, + 8.0 + ] + ], + "center_px": [ + 550.25, + 15.0 + ], + "area_px": 167.0 + }, + { + "image_points_px": [ + [ + 140.0, + 348.0 + ], + [ + 149.0, + 362.0 + ], + [ + 139.0, + 366.0 + ], + [ + 131.0, + 353.0 + ] + ], + "center_px": [ + 139.75, + 357.25 + ], + "area_px": 166.5 + }, + { + "image_points_px": [ + [ + 910.0, + 42.0 + ], + [ + 923.0, + 37.0 + ], + [ + 932.0, + 45.0 + ], + [ + 920.0, + 51.0 + ] + ], + "center_px": [ + 921.25, + 43.75 + ], + "area_px": 158.5 + }, + { + "image_points_px": [ + [ + 302.0, + 54.0 + ], + [ + 287.0, + 60.0 + ], + [ + 281.0, + 52.0 + ], + [ + 295.0, + 46.0 + ] + ], + "center_px": [ + 291.25, + 53.0 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 433.0, + 208.0 + ], + [ + 412.0, + 210.0 + ], + [ + 410.0, + 208.0 + ], + [ + 427.0, + 201.0 + ] + ], + "center_px": [ + 420.5, + 206.75 + ], + "area_px": 103.5 + }, + { + "image_points_px": [ + [ + 884.0, + 39.0 + ], + [ + 896.0, + 34.0 + ], + [ + 905.0, + 42.0 + ], + [ + 893.0, + 48.0 + ] + ], + "center_px": [ + 894.5, + 40.75 + ], + "area_px": 151.5 + }, + { + "image_points_px": [ + [ + 337.0, + 16.0 + ], + [ + 343.0, + 24.0 + ], + [ + 330.0, + 30.0 + ], + [ + 323.0, + 21.0 + ] + ], + "center_px": [ + 333.25, + 22.75 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 524.0, + 199.0 + ], + [ + 506.0, + 202.0 + ], + [ + 502.0, + 200.0 + ], + [ + 517.0, + 192.0 + ] + ], + "center_px": [ + 512.25, + 198.25 + ], + "area_px": 104.5 + }, + { + "image_points_px": [ + [ + 331.0, + 351.0 + ], + [ + 339.0, + 348.0 + ], + [ + 348.0, + 361.0 + ], + [ + 340.0, + 364.0 + ] + ], + "center_px": [ + 339.5, + 356.0 + ], + "area_px": 131.0 + }, + { + "image_points_px": [ + [ + 24.0, + 170.0 + ], + [ + 32.0, + 181.0 + ], + [ + 22.0, + 185.0 + ], + [ + 15.0, + 174.0 + ] + ], + "center_px": [ + 23.25, + 177.5 + ], + "area_px": 134.5 + }, + { + "image_points_px": [ + [ + 670.0, + 248.0 + ], + [ + 669.0, + 250.0 + ], + [ + 650.0, + 259.0 + ], + [ + 659.0, + 250.0 + ] + ], + "center_px": [ + 662.0, + 251.75 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 582.0, + 585.0 + ], + [ + 587.0, + 589.0 + ], + [ + 596.0, + 603.0 + ], + [ + 589.0, + 598.0 + ] + ], + "center_px": [ + 588.5, + 593.75 + ], + "area_px": 45.0 + }, + { + "image_points_px": [ + [ + 757.0, + 234.0 + ], + [ + 744.0, + 242.0 + ], + [ + 739.0, + 239.0 + ], + [ + 751.0, + 229.0 + ] + ], + "center_px": [ + 747.75, + 236.0 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 684.0, + 259.0 + ], + [ + 685.0, + 256.0 + ], + [ + 691.0, + 253.0 + ], + [ + 704.0, + 255.0 + ] + ], + "center_px": [ + 691.0, + 255.75 + ], + "area_px": 53.5 + }, + { + "image_points_px": [ + [ + 522.0, + 197.0 + ], + [ + 521.0, + 199.0 + ], + [ + 503.0, + 200.0 + ], + [ + 516.0, + 193.0 + ] + ], + "center_px": [ + 515.5, + 197.25 + ], + "area_px": 64.5 + }, + { + "image_points_px": [ + [ + 626.0, + 192.0 + ], + [ + 638.0, + 188.0 + ], + [ + 645.0, + 195.0 + ], + [ + 634.0, + 195.0 + ] + ], + "center_px": [ + 635.75, + 192.5 + ], + "area_px": 72.5 + } + ] +} \ No newline at end of file diff --git a/pipeline/2_Multiview_Trial/render_2c.png b/pipeline/2_Multiview_Trial/render_2c.png new file mode 100644 index 0000000..d490613 Binary files /dev/null and b/pipeline/2_Multiview_Trial/render_2c.png differ diff --git a/pipeline/2_Multiview_Trial/render_2c_aruco_detection.json b/pipeline/2_Multiview_Trial/render_2c_aruco_detection.json new file mode 100644 index 0000000..b5b2441 --- /dev/null +++ b/pipeline/2_Multiview_Trial/render_2c_aruco_detection.json @@ -0,0 +1,2487 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-28T22:45:52Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2c.png", + "image_sha256": "ff190a5c1db7cfaad9ccd2d995d354b00bd4b7204a89f0c5ebf53af3f65fc7c5", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 9, + "num_rejected_candidates": 78 + }, + "detections": [ + { + "observation_id": "0ef07f68-a533-4001-addc-215b707469a5", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 927.0, + 363.0 + ], + [ + 970.0, + 338.0 + ], + [ + 1003.0, + 360.0 + ], + [ + 959.0, + 386.0 + ] + ], + "center_px": [ + 964.75, + 361.75 + ], + "quality": { + "area_px": 1807.5, + "perimeter_px": 179.91623306274414, + "sharpness": { + "laplacian_var": 4223.2572960469215 + }, + "contrast": { + "p05": 23.0, + "p95": 193.0, + "dynamic_range": 170.0, + "mean_gray": 89.22687047465809, + "std_gray": 76.34776692544536 + }, + "geometry": { + "distance_to_center_norm": 0.4422629475593567, + "distance_to_border_px": 277.0 + }, + "edge_ratio": 1.296883279406176, + "edge_lengths_px": [ + 49.73931884765625, + 39.66106414794922, + 51.107730865478516, + 39.408119201660156 + ] + }, + "confidence": 0.7710794146855571 + }, + { + "observation_id": "43d60185-b27b-4cec-889a-ec969b5e2936", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 803.0, + 271.0 + ], + [ + 843.0, + 250.0 + ], + [ + 870.0, + 268.0 + ], + [ + 830.0, + 290.0 + ] + ], + "center_px": [ + 836.5, + 269.75 + ], + "quality": { + "area_px": 1320.5, + "perimeter_px": 156.29338836669922, + "sharpness": { + "laplacian_var": 3741.3332631392955 + }, + "contrast": { + "p05": 21.0, + "p95": 191.0, + "dynamic_range": 170.0, + "mean_gray": 80.0979097909791, + "std_gray": 74.35226923655743 + }, + "geometry": { + "distance_to_center_norm": 0.2944759428501129, + "distance_to_border_px": 250.0 + }, + "edge_ratio": 1.4068074262190264, + "edge_lengths_px": [ + 45.17742919921875, + 32.4499626159668, + 45.650848388671875, + 33.0151481628418 + ] + }, + "confidence": 0.6257667658887336 + }, + { + "observation_id": "ae81bee3-55bc-45a6-9a37-cb96a59ad0f1", + "type": "aruco", + "marker_id": 242, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 650.0, + 268.0 + ], + [ + 634.0, + 302.0 + ], + [ + 594.0, + 302.0 + ], + [ + 609.0, + 268.0 + ] + ], + "center_px": [ + 621.75, + 285.0 + ], + "quality": { + "area_px": 1377.0, + "perimeter_px": 155.73839569091797, + "sharpness": { + "laplacian_var": 1917.8669036783792 + }, + "contrast": { + "p05": 21.0, + "p95": 155.0, + "dynamic_range": 134.0, + "mean_gray": 65.89125799573561, + "std_gray": 57.81288201225083 + }, + "geometry": { + "distance_to_center_norm": 0.10511811822652817, + "distance_to_border_px": 268.0 + }, + "edge_ratio": 1.1032832413494709, + "edge_lengths_px": [ + 37.57658767700195, + 40.0, + 37.161808013916016, + 41.0 + ] + }, + "confidence": 0.8320619452871927 + }, + { + "observation_id": "9a9ea564-c6d2-462d-b5ac-3c1dfb9b8eb4", + "type": "aruco", + "marker_id": 122, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 868.0, + 423.0 + ], + [ + 859.0, + 385.0 + ], + [ + 887.0, + 408.0 + ], + [ + 897.0, + 448.0 + ] + ], + "center_px": [ + 877.75, + 416.0 + ], + "quality": { + "area_px": 883.5, + "perimeter_px": 154.80602264404297, + "sharpness": { + "laplacian_var": 2363.473968982678 + }, + "contrast": { + "p05": 30.0, + "p95": 150.0, + "dynamic_range": 120.0, + "mean_gray": 63.03105590062112, + "std_gray": 47.30129045818198 + }, + "geometry": { + "distance_to_center_norm": 0.3326369822025299, + "distance_to_border_px": 272.0 + }, + "edge_ratio": 1.1378686133108156, + "edge_lengths_px": [ + 39.051246643066406, + 36.2353401184082, + 41.231056213378906, + 38.28837966918945 + ] + }, + "confidence": 0.5176344554282131 + }, + { + "observation_id": "50594b84-2429-429f-b3fb-12dbb505541e", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 592.0, + 173.0 + ], + [ + 633.0, + 175.0 + ], + [ + 650.0, + 205.0 + ], + [ + 608.0, + 203.0 + ] + ], + "center_px": [ + 620.75, + 189.0 + ], + "quality": { + "area_px": 1212.0, + "perimeter_px": 151.5782241821289, + "sharpness": { + "laplacian_var": 2979.227522027412 + }, + "contrast": { + "p05": 18.0, + "p95": 189.0, + "dynamic_range": 171.0, + "mean_gray": 75.36084905660377, + "std_gray": 74.9801984881131 + }, + "geometry": { + "distance_to_center_norm": 0.23434503376483917, + "distance_to_border_px": 173.0 + }, + "edge_ratio": 1.2366938871495865, + "edge_lengths_px": [ + 41.04875183105469, + 34.48188018798828, + 42.04759216308594, + 34.0 + ] + }, + "confidence": 0.6533548911301985 + }, + { + "observation_id": "17a2bc4f-1e93-4b3b-8706-4cd9224c3e73", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 590.0, + 695.0 + ], + [ + 631.0, + 691.0 + ], + [ + 652.0, + 699.0 + ], + [ + 611.0, + 704.0 + ] + ], + "center_px": [ + 621.0, + 697.25 + ], + "quality": { + "area_px": 443.0, + "perimeter_px": 127.81793594360352, + "sharpness": { + "laplacian_var": 3883.9669476486242 + }, + "contrast": { + "p05": 23.0, + "p95": 173.0, + "dynamic_range": 150.0, + "mean_gray": 86.0776397515528, + "std_gray": 61.56910622734584 + }, + "geometry": { + "distance_to_center_norm": 0.46000775694847107, + "distance_to_border_px": 16.0 + }, + "edge_ratio": 1.837992949698211, + "edge_lengths_px": [ + 41.19466018676758, + 22.472204208374023, + 41.30375289916992, + 22.847318649291992 + ] + }, + "confidence": 0.05141840543087185 + }, + { + "observation_id": "02d69d4d-3c3d-44d8-b113-cbd976714ff8", + "type": "aruco", + "marker_id": 247, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 668.0, + 173.0 + ], + [ + 706.0, + 175.0 + ], + [ + 727.0, + 190.0 + ], + [ + 688.0, + 188.0 + ] + ], + "center_px": [ + 697.25, + 181.5 + ], + "quality": { + "area_px": 536.5, + "perimeter_px": 127.91082000732422, + "sharpness": { + "laplacian_var": 7445.596902165736 + }, + "contrast": { + "p05": 19.0, + "p95": 182.0, + "dynamic_range": 163.0, + "mean_gray": 104.43478260869566, + "std_gray": 68.06627744491757 + }, + "geometry": { + "distance_to_center_norm": 0.25528469681739807, + "distance_to_border_px": 173.0 + }, + "edge_ratio": 1.5620498657226562, + "edge_lengths_px": [ + 38.05259704589844, + 25.806976318359375, + 39.051246643066406, + 25.0 + ] + }, + "confidence": 0.22897263046157504 + }, + { + "observation_id": "235621af-c998-4f74-a444-b5df3aaff504", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 523.0, + 669.0 + ], + [ + 563.0, + 666.0 + ], + [ + 581.0, + 672.0 + ], + [ + 541.0, + 676.0 + ] + ], + "center_px": [ + 552.0, + 670.75 + ], + "quality": { + "area_px": 323.0, + "perimeter_px": 118.59871673583984, + "sharpness": { + "laplacian_var": 7191.154587636113 + }, + "contrast": { + "p05": 23.0, + "p95": 172.39999999999998, + "dynamic_range": 149.39999999999998, + "mean_gray": 83.71541501976284, + "std_gray": 61.239293163779244 + }, + "geometry": { + "distance_to_center_norm": 0.43983229994773865, + "distance_to_border_px": 44.0 + }, + "edge_ratio": 2.1186998154843373, + "edge_lengths_px": [ + 40.112342834472656, + 18.973665237426758, + 40.199501037597656, + 19.313207626342773 + ] + }, + "confidence": 0.08943849994625828 + }, + { + "observation_id": "f4ca064d-25ad-4d2d-bac4-5a25dec1ef4b", + "type": "aruco", + "marker_id": 217, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1143.0, + 629.0 + ], + [ + 1171.0, + 626.0 + ], + [ + 1200.0, + 632.0 + ], + [ + 1174.0, + 635.0 + ] + ], + "center_px": [ + 1172.0, + 630.5 + ], + "quality": { + "area_px": 252.0, + "perimeter_px": 115.52225112915039, + "sharpness": { + "laplacian_var": 8107.970519250205 + }, + "contrast": { + "p05": 22.0, + "p95": 153.0, + "dynamic_range": 131.0, + "mean_gray": 73.58951965065502, + "std_gray": 42.62835305344015 + }, + "geometry": { + "distance_to_center_norm": 0.8127716183662415, + "distance_to_border_px": 80.0 + }, + "edge_ratio": 1.2064304365348024, + "edge_lengths_px": [ + 28.160255432128906, + 29.614185333251953, + 26.172504425048828, + 31.575305938720703 + ] + }, + "confidence": 0.1392537811649894 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 830.0, + 570.0 + ], + [ + 799.0, + 594.0 + ], + [ + 774.0, + 592.0 + ], + [ + 804.0, + 569.0 + ] + ], + "center_px": [ + 801.75, + 581.25 + ], + "area_px": 645.0 + }, + { + "image_points_px": [ + [ + 726.0, + 175.0 + ], + [ + 762.0, + 177.0 + ], + [ + 784.0, + 192.0 + ], + [ + 747.0, + 190.0 + ] + ], + "center_px": [ + 754.75, + 183.5 + ], + "area_px": 504.5 + }, + { + "image_points_px": [ + [ + 750.0, + 676.0 + ], + [ + 788.0, + 673.0 + ], + [ + 810.0, + 680.0 + ], + [ + 773.0, + 684.0 + ] + ], + "center_px": [ + 780.25, + 678.25 + ], + "area_px": 360.0 + }, + { + "image_points_px": [ + [ + 676.0, + 653.0 + ], + [ + 712.0, + 650.0 + ], + [ + 731.0, + 655.0 + ], + [ + 695.0, + 659.0 + ] + ], + "center_px": [ + 703.5, + 654.25 + ], + "area_px": 264.5 + }, + { + "image_points_px": [ + [ + 1176.0, + 709.0 + ], + [ + 1201.0, + 706.0 + ], + [ + 1225.0, + 711.0 + ], + [ + 1198.0, + 714.0 + ] + ], + "center_px": [ + 1200.0, + 710.0 + ], + "area_px": 199.0 + }, + { + "image_points_px": [ + [ + 1025.0, + 711.0 + ], + [ + 1055.0, + 709.0 + ], + [ + 1073.0, + 713.0 + ], + [ + 1047.0, + 716.0 + ] + ], + "center_px": [ + 1050.0, + 712.25 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 1126.0, + 696.0 + ], + [ + 1145.0, + 694.0 + ], + [ + 1172.0, + 699.0 + ], + [ + 1149.0, + 701.0 + ] + ], + "center_px": [ + 1148.0, + 697.5 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 1223.0, + 692.0 + ], + [ + 1249.0, + 690.0 + ], + [ + 1269.0, + 694.0 + ], + [ + 1244.0, + 696.0 + ] + ], + "center_px": [ + 1246.25, + 693.0 + ], + "area_px": 143.0 + }, + { + "image_points_px": [ + [ + 1174.0, + 689.0 + ], + [ + 1204.0, + 688.0 + ], + [ + 1219.0, + 692.0 + ], + [ + 1198.0, + 694.0 + ] + ], + "center_px": [ + 1198.75, + 690.75 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 52.0, + 695.0 + ], + [ + 18.0, + 698.0 + ], + [ + 13.0, + 693.0 + ], + [ + 46.0, + 691.0 + ] + ], + "center_px": [ + 32.25, + 694.25 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 1169.0, + 441.0 + ], + [ + 1193.0, + 445.0 + ], + [ + 1205.0, + 455.0 + ], + [ + 1171.0, + 446.0 + ] + ], + "center_px": [ + 1184.5, + 446.75 + ], + "area_px": 172.0 + }, + { + "image_points_px": [ + [ + 93.0, + 321.0 + ], + [ + 97.0, + 328.0 + ], + [ + 101.0, + 356.0 + ], + [ + 94.0, + 351.0 + ] + ], + "center_px": [ + 96.25, + 339.0 + ], + "area_px": 144.5 + }, + { + "image_points_px": [ + [ + 136.0, + 650.0 + ], + [ + 106.0, + 652.0 + ], + [ + 101.0, + 649.0 + ], + [ + 130.0, + 647.0 + ] + ], + "center_px": [ + 118.25, + 649.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 173.0, + 652.0 + ], + [ + 144.0, + 654.0 + ], + [ + 138.0, + 651.0 + ], + [ + 167.0, + 649.0 + ] + ], + "center_px": [ + 155.5, + 651.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 89.0, + 322.0 + ], + [ + 87.0, + 349.0 + ], + [ + 82.0, + 356.0 + ], + [ + 85.0, + 326.0 + ] + ], + "center_px": [ + 85.75, + 338.25 + ], + "area_px": 114.5 + }, + { + "image_points_px": [ + [ + 76.0, + 656.0 + ], + [ + 46.0, + 658.0 + ], + [ + 42.0, + 655.0 + ], + [ + 70.0, + 652.0 + ] + ], + "center_px": [ + 58.5, + 655.25 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 87.0, + 639.0 + ], + [ + 58.0, + 641.0 + ], + [ + 53.0, + 638.0 + ], + [ + 81.0, + 636.0 + ] + ], + "center_px": [ + 69.75, + 638.5 + ], + "area_px": 96.5 + }, + { + "image_points_px": [ + [ + 527.0, + 508.0 + ], + [ + 519.0, + 518.0 + ], + [ + 496.0, + 520.0 + ], + [ + 514.0, + 510.0 + ] + ], + "center_px": [ + 514.0, + 514.0 + ], + "area_px": 154.0 + }, + { + "image_points_px": [ + [ + 197.0, + 646.0 + ], + [ + 225.0, + 644.0 + ], + [ + 231.0, + 647.0 + ], + [ + 203.0, + 649.0 + ] + ], + "center_px": [ + 214.0, + 646.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 124.0, + 642.0 + ], + [ + 152.0, + 640.0 + ], + [ + 158.0, + 643.0 + ], + [ + 130.0, + 645.0 + ] + ], + "center_px": [ + 141.0, + 642.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 209.0, + 654.0 + ], + [ + 181.0, + 656.0 + ], + [ + 175.0, + 653.0 + ], + [ + 203.0, + 651.0 + ] + ], + "center_px": [ + 192.0, + 653.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 160.0, + 644.0 + ], + [ + 188.0, + 642.0 + ], + [ + 194.0, + 645.0 + ], + [ + 167.0, + 647.0 + ] + ], + "center_px": [ + 177.25, + 644.5 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 217.0, + 639.0 + ], + [ + 244.0, + 637.0 + ], + [ + 251.0, + 640.0 + ], + [ + 225.0, + 642.0 + ] + ], + "center_px": [ + 234.25, + 639.5 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 87.0, + 665.0 + ], + [ + 58.0, + 668.0 + ], + [ + 54.0, + 665.0 + ], + [ + 83.0, + 662.0 + ] + ], + "center_px": [ + 70.5, + 665.0 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 56.0, + 709.0 + ], + [ + 31.0, + 711.0 + ], + [ + 26.0, + 706.0 + ], + [ + 56.0, + 703.0 + ] + ], + "center_px": [ + 42.25, + 707.25 + ], + "area_px": 157.5 + }, + { + "image_points_px": [ + [ + 63.0, + 646.0 + ], + [ + 34.0, + 648.0 + ], + [ + 30.0, + 645.0 + ], + [ + 58.0, + 643.0 + ] + ], + "center_px": [ + 46.25, + 645.5 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 51.0, + 637.0 + ], + [ + 23.0, + 639.0 + ], + [ + 18.0, + 636.0 + ], + [ + 46.0, + 634.0 + ] + ], + "center_px": [ + 34.5, + 636.5 + ], + "area_px": 94.0 + }, + { + "image_points_px": [ + [ + 179.0, + 636.0 + ], + [ + 152.0, + 638.0 + ], + [ + 146.0, + 635.0 + ], + [ + 172.0, + 633.0 + ] + ], + "center_px": [ + 162.25, + 635.5 + ], + "area_px": 92.5 + }, + { + "image_points_px": [ + [ + 234.0, + 648.0 + ], + [ + 261.0, + 646.0 + ], + [ + 267.0, + 649.0 + ], + [ + 241.0, + 651.0 + ] + ], + "center_px": [ + 250.75, + 648.5 + ], + "area_px": 92.5 + }, + { + "image_points_px": [ + [ + 269.0, + 633.0 + ], + [ + 243.0, + 635.0 + ], + [ + 236.0, + 632.0 + ], + [ + 262.0, + 630.0 + ] + ], + "center_px": [ + 252.5, + 632.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 234.0, + 631.0 + ], + [ + 208.0, + 633.0 + ], + [ + 201.0, + 630.0 + ], + [ + 227.0, + 628.0 + ] + ], + "center_px": [ + 217.5, + 630.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 286.0, + 642.0 + ], + [ + 261.0, + 644.0 + ], + [ + 254.0, + 640.0 + ], + [ + 279.0, + 638.0 + ] + ], + "center_px": [ + 270.0, + 641.0 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 182.0, + 637.0 + ], + [ + 209.0, + 635.0 + ], + [ + 214.0, + 638.0 + ], + [ + 187.0, + 640.0 + ] + ], + "center_px": [ + 198.0, + 637.5 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 143.0, + 634.0 + ], + [ + 116.0, + 636.0 + ], + [ + 111.0, + 633.0 + ], + [ + 138.0, + 631.0 + ] + ], + "center_px": [ + 127.0, + 633.5 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 42.0, + 629.0 + ], + [ + 70.0, + 628.0 + ], + [ + 73.0, + 630.0 + ], + [ + 46.0, + 632.0 + ] + ], + "center_px": [ + 57.75, + 629.75 + ], + "area_px": 74.0 + }, + { + "image_points_px": [ + [ + 62.0, + 622.0 + ], + [ + 36.0, + 624.0 + ], + [ + 31.0, + 621.0 + ], + [ + 56.0, + 619.0 + ] + ], + "center_px": [ + 46.25, + 621.5 + ], + "area_px": 87.5 + }, + { + "image_points_px": [ + [ + 39.0, + 628.0 + ], + [ + 12.0, + 630.0 + ], + [ + 9.0, + 627.0 + ], + [ + 36.0, + 626.0 + ] + ], + "center_px": [ + 24.0, + 627.75 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 221.0, + 623.0 + ], + [ + 246.0, + 622.0 + ], + [ + 251.0, + 625.0 + ], + [ + 226.0, + 626.0 + ] + ], + "center_px": [ + 236.0, + 624.0 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 51.0, + 614.0 + ], + [ + 25.0, + 616.0 + ], + [ + 21.0, + 613.0 + ], + [ + 47.0, + 612.0 + ] + ], + "center_px": [ + 36.0, + 613.75 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 126.0, + 605.0 + ], + [ + 151.0, + 604.0 + ], + [ + 156.0, + 606.0 + ], + [ + 131.0, + 607.0 + ] + ], + "center_px": [ + 141.0, + 605.5 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 89.0, + 668.0 + ], + [ + 89.0, + 672.0 + ], + [ + 65.0, + 674.0 + ], + [ + 62.0, + 671.0 + ] + ], + "center_px": [ + 76.25, + 671.25 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 11.0, + 606.0 + ], + [ + 37.0, + 605.0 + ], + [ + 40.0, + 607.0 + ], + [ + 15.0, + 608.0 + ] + ], + "center_px": [ + 25.75, + 606.5 + ], + "area_px": 54.5 + }, + { + "image_points_px": [ + [ + 72.0, + 608.0 + ], + [ + 47.0, + 610.0 + ], + [ + 43.0, + 608.0 + ], + [ + 67.0, + 606.0 + ] + ], + "center_px": [ + 57.25, + 608.0 + ], + "area_px": 58.0 + }, + { + "image_points_px": [ + [ + 114.0, + 598.0 + ], + [ + 138.0, + 597.0 + ], + [ + 143.0, + 599.0 + ], + [ + 118.0, + 600.0 + ] + ], + "center_px": [ + 128.25, + 598.5 + ], + "area_px": 53.5 + }, + { + "image_points_px": [ + [ + 61.0, + 601.0 + ], + [ + 37.0, + 603.0 + ], + [ + 33.0, + 601.0 + ], + [ + 57.0, + 599.0 + ] + ], + "center_px": [ + 47.0, + 601.0 + ], + "area_px": 56.0 + }, + { + "image_points_px": [ + [ + 53.0, + 595.0 + ], + [ + 77.0, + 594.0 + ], + [ + 81.0, + 596.0 + ], + [ + 57.0, + 597.0 + ] + ], + "center_px": [ + 67.0, + 595.5 + ], + "area_px": 52.0 + }, + { + "image_points_px": [ + [ + 187.0, + 607.0 + ], + [ + 164.0, + 609.0 + ], + [ + 159.0, + 607.0 + ], + [ + 182.0, + 605.0 + ] + ], + "center_px": [ + 173.0, + 607.0 + ], + "area_px": 56.0 + }, + { + "image_points_px": [ + [ + 604.0, + 608.0 + ], + [ + 626.0, + 607.0 + ], + [ + 632.0, + 609.0 + ], + [ + 613.0, + 611.0 + ] + ], + "center_px": [ + 618.75, + 608.75 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 133.0, + 593.0 + ], + [ + 157.0, + 592.0 + ], + [ + 161.0, + 594.0 + ], + [ + 138.0, + 595.0 + ] + ], + "center_px": [ + 147.25, + 593.5 + ], + "area_px": 51.5 + }, + { + "image_points_px": [ + [ + 174.0, + 600.0 + ], + [ + 151.0, + 602.0 + ], + [ + 146.0, + 600.0 + ], + [ + 168.0, + 598.0 + ] + ], + "center_px": [ + 159.75, + 600.0 + ], + "area_px": 56.0 + }, + { + "image_points_px": [ + [ + 181.0, + 589.0 + ], + [ + 204.0, + 588.0 + ], + [ + 209.0, + 590.0 + ], + [ + 186.0, + 591.0 + ] + ], + "center_px": [ + 195.0, + 589.5 + ], + "area_px": 51.0 + }, + { + "image_points_px": [ + [ + 151.0, + 588.0 + ], + [ + 174.0, + 587.0 + ], + [ + 179.0, + 589.0 + ], + [ + 156.0, + 590.0 + ] + ], + "center_px": [ + 165.0, + 588.5 + ], + "area_px": 51.0 + }, + { + "image_points_px": [ + [ + 226.0, + 585.0 + ], + [ + 203.0, + 586.0 + ], + [ + 198.0, + 584.0 + ], + [ + 220.0, + 583.0 + ] + ], + "center_px": [ + 211.75, + 584.5 + ], + "area_px": 50.5 + }, + { + "image_points_px": [ + [ + 240.0, + 591.0 + ], + [ + 221.0, + 593.0 + ], + [ + 212.0, + 591.0 + ], + [ + 231.0, + 589.0 + ] + ], + "center_px": [ + 226.0, + 591.0 + ], + "area_px": 56.0 + }, + { + "image_points_px": [ + [ + 23.0, + 594.0 + ], + [ + 48.0, + 593.0 + ], + [ + 50.0, + 595.0 + ], + [ + 27.0, + 596.0 + ] + ], + "center_px": [ + 37.0, + 594.5 + ], + "area_px": 51.0 + }, + { + "image_points_px": [ + [ + 289.0, + 627.0 + ], + [ + 310.0, + 626.0 + ], + [ + 316.0, + 629.0 + ], + [ + 297.0, + 630.0 + ] + ], + "center_px": [ + 303.0, + 628.0 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 41.0, + 588.0 + ], + [ + 17.0, + 589.0 + ], + [ + 14.0, + 587.0 + ], + [ + 37.0, + 586.0 + ] + ], + "center_px": [ + 27.25, + 587.5 + ], + "area_px": 50.5 + }, + { + "image_points_px": [ + [ + 169.0, + 583.0 + ], + [ + 191.0, + 582.0 + ], + [ + 196.0, + 584.0 + ], + [ + 174.0, + 585.0 + ] + ], + "center_px": [ + 182.5, + 583.5 + ], + "area_px": 49.0 + }, + { + "image_points_px": [ + [ + 709.0, + 606.0 + ], + [ + 693.0, + 608.0 + ], + [ + 683.0, + 606.0 + ], + [ + 701.0, + 604.0 + ] + ], + "center_px": [ + 696.5, + 606.0 + ], + "area_px": 52.0 + }, + { + "image_points_px": [ + [ + 847.0, + 590.0 + ], + [ + 864.0, + 589.0 + ], + [ + 873.0, + 591.0 + ], + [ + 857.0, + 592.0 + ] + ], + "center_px": [ + 860.25, + 590.5 + ], + "area_px": 42.5 + }, + { + "image_points_px": [ + [ + 635.0, + 251.0 + ], + [ + 636.0, + 248.0 + ], + [ + 659.0, + 249.0 + ], + [ + 657.0, + 251.0 + ] + ], + "center_px": [ + 646.75, + 249.75 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 34.0, + 622.0 + ], + [ + 44.0, + 620.0 + ], + [ + 59.0, + 621.0 + ], + [ + 39.0, + 624.0 + ] + ], + "center_px": [ + 44.0, + 621.75 + ], + "area_px": 47.5 + }, + { + "image_points_px": [ + [ + 828.0, + 659.0 + ], + [ + 844.0, + 661.0 + ], + [ + 851.0, + 666.0 + ], + [ + 836.0, + 664.0 + ] + ], + "center_px": [ + 839.75, + 662.5 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 924.0, + 583.0 + ], + [ + 940.0, + 582.0 + ], + [ + 948.0, + 584.0 + ], + [ + 933.0, + 585.0 + ] + ], + "center_px": [ + 936.25, + 583.5 + ], + "area_px": 39.5 + }, + { + "image_points_px": [ + [ + 213.0, + 622.0 + ], + [ + 204.0, + 624.0 + ], + [ + 190.0, + 623.0 + ], + [ + 211.0, + 620.0 + ] + ], + "center_px": [ + 204.5, + 622.25 + ], + "area_px": 42.5 + }, + { + "image_points_px": [ + [ + 122.0, + 619.0 + ], + [ + 134.0, + 617.0 + ], + [ + 145.0, + 618.0 + ], + [ + 124.0, + 621.0 + ] + ], + "center_px": [ + 131.25, + 618.75 + ], + "area_px": 41.0 + }, + { + "image_points_px": [ + [ + 1077.0, + 610.0 + ], + [ + 1086.0, + 609.0 + ], + [ + 1100.0, + 613.0 + ], + [ + 1092.0, + 614.0 + ] + ], + "center_px": [ + 1088.75, + 611.5 + ], + "area_px": 48.5 + }, + { + "image_points_px": [ + [ + 133.0, + 611.0 + ], + [ + 119.0, + 613.0 + ], + [ + 110.0, + 612.0 + ], + [ + 127.0, + 609.0 + ] + ], + "center_px": [ + 122.25, + 611.25 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 255.0, + 566.0 + ], + [ + 242.0, + 567.0 + ], + [ + 232.0, + 565.0 + ], + [ + 251.0, + 564.0 + ] + ], + "center_px": [ + 245.0, + 565.5 + ], + "area_px": 39.0 + }, + { + "image_points_px": [ + [ + 14.0, + 607.0 + ], + [ + 24.0, + 605.0 + ], + [ + 37.0, + 606.0 + ], + [ + 26.0, + 608.0 + ] + ], + "center_px": [ + 25.25, + 606.5 + ], + "area_px": 35.5 + }, + { + "image_points_px": [ + [ + 130.0, + 606.0 + ], + [ + 140.0, + 604.0 + ], + [ + 152.0, + 605.0 + ], + [ + 141.0, + 607.0 + ] + ], + "center_px": [ + 140.75, + 605.5 + ], + "area_px": 33.5 + }, + { + "image_points_px": [ + [ + 118.0, + 599.0 + ], + [ + 128.0, + 597.0 + ], + [ + 139.0, + 598.0 + ], + [ + 129.0, + 600.0 + ] + ], + "center_px": [ + 128.5, + 598.5 + ], + "area_px": 32.0 + }, + { + "image_points_px": [ + [ + 248.0, + 609.0 + ], + [ + 247.0, + 611.0 + ], + [ + 228.0, + 611.0 + ], + [ + 230.0, + 609.0 + ] + ], + "center_px": [ + 238.25, + 610.0 + ], + "area_px": 37.0 + }, + { + "image_points_px": [ + [ + 233.0, + 602.0 + ], + [ + 231.0, + 604.0 + ], + [ + 213.0, + 604.0 + ], + [ + 214.0, + 602.0 + ] + ], + "center_px": [ + 222.75, + 603.0 + ], + "area_px": 37.0 + }, + { + "image_points_px": [ + [ + 245.0, + 605.0 + ], + [ + 254.0, + 603.0 + ], + [ + 265.0, + 604.0 + ], + [ + 258.0, + 606.0 + ] + ], + "center_px": [ + 255.5, + 604.5 + ], + "area_px": 32.0 + }, + { + "image_points_px": [ + [ + 696.0, + 645.0 + ], + [ + 677.0, + 647.0 + ], + [ + 677.0, + 645.0 + ], + [ + 689.0, + 643.0 + ] + ], + "center_px": [ + 684.75, + 645.0 + ], + "area_px": 38.0 + }, + { + "image_points_px": [ + [ + 230.0, + 598.0 + ], + [ + 240.0, + 596.0 + ], + [ + 250.0, + 597.0 + ], + [ + 242.0, + 599.0 + ] + ], + "center_px": [ + 240.5, + 597.5 + ], + "area_px": 31.0 + }, + { + "image_points_px": [ + [ + 181.0, + 602.0 + ], + [ + 190.0, + 600.0 + ], + [ + 201.0, + 601.0 + ], + [ + 192.0, + 603.0 + ] + ], + "center_px": [ + 191.0, + 601.5 + ], + "area_px": 31.0 + } + ] +} \ No newline at end of file diff --git a/pipeline/2_Multiview_Trial/render_2d_aruco_detection.json b/pipeline/2_Multiview_Trial/render_2d_aruco_detection.json new file mode 100644 index 0000000..f28c9ff --- /dev/null +++ b/pipeline/2_Multiview_Trial/render_2d_aruco_detection.json @@ -0,0 +1,12150 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-28T22:45:52Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_2d.png", + "image_sha256": "081468318aa811e6f010d8299b9fe59f036b02da17597056badea2ed429079c7", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 6, + "num_rejected_candidates": 471 + }, + "detections": [ + { + "observation_id": "5b5023f8-2c4a-447d-90d6-130e037f73af", + "type": "aruco", + "marker_id": 244, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 750.0, + 248.0 + ], + [ + 769.0, + 294.0 + ], + [ + 724.0, + 313.0 + ], + [ + 705.0, + 267.0 + ] + ], + "center_px": [ + 737.0, + 280.5 + ], + "quality": { + "area_px": 2431.0, + "perimeter_px": 197.23233795166016, + "sharpness": { + "laplacian_var": 493.6818019661216 + }, + "contrast": { + "p05": 5.0, + "p95": 86.0, + "dynamic_range": 81.0, + "mean_gray": 40.01594114040466, + "std_gray": 37.19115274837722 + }, + "geometry": { + "distance_to_center_norm": 0.17079654335975647, + "distance_to_border_px": 248.0 + }, + "edge_ratio": 1.0188911733497625, + "edge_lengths_px": [ + 49.76947021484375, + 48.84669876098633, + 49.76947021484375, + 48.84669876098633 + ] + }, + "confidence": 0.9814590862656559 + }, + { + "observation_id": "d6aa29cc-84b8-4041-a106-8fed37f69abc", + "type": "aruco", + "marker_id": 102, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 450.0, + 401.0 + ], + [ + 472.0, + 442.0 + ], + [ + 434.0, + 457.0 + ], + [ + 412.0, + 417.0 + ] + ], + "center_px": [ + 442.0, + 429.25 + ], + "quality": { + "area_px": 1880.0, + "perimeter_px": 174.26486206054688, + "sharpness": { + "laplacian_var": 939.450005421804 + }, + "contrast": { + "p05": 13.0, + "p95": 103.0, + "dynamic_range": 90.0, + "mean_gray": 56.06828885400314, + "std_gray": 40.10323274971468 + }, + "geometry": { + "distance_to_center_norm": 0.28565987944602966, + "distance_to_border_px": 263.0 + }, + "edge_ratio": 1.1389397965707557, + "edge_lengths_px": [ + 46.52956008911133, + 40.853397369384766, + 45.650848388671875, + 41.231056213378906 + ] + }, + "confidence": 0.8780095339638752 + }, + { + "observation_id": "2ab3d6e0-26c5-46b1-8099-c40c06d50ae9", + "type": "aruco", + "marker_id": 122, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 589.0, + 399.0 + ], + [ + 614.0, + 415.0 + ], + [ + 575.0, + 432.0 + ], + [ + 549.0, + 416.0 + ] + ], + "center_px": [ + 581.75, + 415.5 + ], + "quality": { + "area_px": 1065.5, + "perimeter_px": 146.217041015625, + "sharpness": { + "laplacian_var": 1075.6241426611798 + }, + "contrast": { + "p05": 32.0, + "p95": 123.0, + "dynamic_range": 91.0, + "mean_gray": 57.09465020576132, + "std_gray": 35.889872499914034 + }, + "geometry": { + "distance_to_center_norm": 0.10956916958093643, + "distance_to_border_px": 288.0 + }, + "edge_ratio": 1.4642931087996, + "edge_lengths_px": [ + 29.681644439697266, + 42.54409408569336, + 30.528675079345703, + 43.46262741088867 + ] + }, + "confidence": 0.4851032413282688 + }, + { + "observation_id": "3903999c-3d56-4e0e-9c51-0625a2701776", + "type": "aruco", + "marker_id": 124, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 420.0, + 471.0 + ], + [ + 449.0, + 485.0 + ], + [ + 413.0, + 500.0 + ], + [ + 384.0, + 487.0 + ] + ], + "center_px": [ + 416.5, + 485.75 + ], + "quality": { + "area_px": 935.5, + "perimeter_px": 142.3784122467041, + "sharpness": { + "laplacian_var": 1670.4932882212574 + }, + "contrast": { + "p05": 35.0, + "p95": 130.0, + "dynamic_range": 95.0, + "mean_gray": 71.60682492581603, + "std_gray": 40.66156929479411 + }, + "geometry": { + "distance_to_center_norm": 0.34923961758613586, + "distance_to_border_px": 220.0 + }, + "edge_ratio": 1.2396103187989196, + "edge_lengths_px": [ + 32.202484130859375, + 39.0, + 31.78049659729004, + 39.39543151855469 + ] + }, + "confidence": 0.5031150977114714 + }, + { + "observation_id": "ffc12124-1668-4ca5-ae81-6d977d4fc850", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 787.0, + 681.0 + ], + [ + 776.0, + 692.0 + ], + [ + 735.0, + 688.0 + ], + [ + 747.0, + 677.0 + ] + ], + "center_px": [ + 761.25, + 684.5 + ], + "quality": { + "area_px": 491.5, + "perimeter_px": 113.22933006286621, + "sharpness": { + "laplacian_var": 3397.867051357801 + }, + "contrast": { + "p05": 68.0, + "p95": 178.0, + "dynamic_range": 110.0, + "mean_gray": 112.64542936288089, + "std_gray": 45.285998366872136 + }, + "geometry": { + "distance_to_center_norm": 0.4717576801776886, + "distance_to_border_px": 28.0 + }, + "edge_ratio": 2.6480931171344015, + "edge_lengths_px": [ + 15.55634880065918, + 41.19466018676758, + 16.278820037841797, + 40.199501037597656 + ] + }, + "confidence": 0.06929262877730606 + }, + { + "observation_id": "44d7940e-66e8-411d-9a1a-50bd15b90c33", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 983.0, + 359.0 + ], + [ + 975.0, + 363.0 + ], + [ + 945.0, + 329.0 + ], + [ + 954.0, + 326.0 + ] + ], + "center_px": [ + 964.25, + 344.25 + ], + "quality": { + "area_px": 388.0, + "perimeter_px": 107.70600700378418, + "sharpness": { + "laplacian_var": 2466.2692169843144 + }, + "contrast": { + "p05": 18.0, + "p95": 98.0, + "dynamic_range": 80.0, + "mean_gray": 47.70454545454545, + "std_gray": 30.87217643834237 + }, + "geometry": { + "distance_to_center_norm": 0.44209620356559753, + "distance_to_border_px": 297.0 + }, + "edge_ratio": 5.069516627430802, + "edge_lengths_px": [ + 8.9442720413208, + 45.343135833740234, + 9.486832618713379, + 43.931766510009766 + ] + }, + "confidence": 0.0510239310128779 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 314.0, + 573.0 + ], + [ + 342.0, + 570.0 + ], + [ + 404.0, + 621.0 + ], + [ + 371.0, + 624.0 + ] + ], + "center_px": [ + 357.75, + 597.0 + ], + "area_px": 1734.0 + }, + { + "image_points_px": [ + [ + 527.0, + 561.0 + ], + [ + 551.0, + 558.0 + ], + [ + 623.0, + 597.0 + ], + [ + 593.0, + 600.0 + ] + ], + "center_px": [ + 573.5, + 579.0 + ], + "area_px": 1260.0 + }, + { + "image_points_px": [ + [ + 323.0, + 549.0 + ], + [ + 350.0, + 546.0 + ], + [ + 409.0, + 590.0 + ], + [ + 378.0, + 593.0 + ] + ], + "center_px": [ + 365.0, + 569.5 + ], + "area_px": 1447.0 + }, + { + "image_points_px": [ + [ + 626.0, + 680.0 + ], + [ + 572.0, + 693.0 + ], + [ + 545.0, + 690.0 + ], + [ + 556.0, + 683.0 + ] + ], + "center_px": [ + 574.75, + 686.5 + ], + "area_px": 485.0 + }, + { + "image_points_px": [ + [ + 554.0, + 535.0 + ], + [ + 579.0, + 533.0 + ], + [ + 630.0, + 560.0 + ], + [ + 606.0, + 562.0 + ] + ], + "center_px": [ + 592.25, + 547.5 + ], + "area_px": 764.5 + }, + { + "image_points_px": [ + [ + 508.0, + 631.0 + ], + [ + 457.0, + 641.0 + ], + [ + 433.0, + 639.0 + ], + [ + 483.0, + 629.0 + ] + ], + "center_px": [ + 470.25, + 635.0 + ], + "area_px": 346.0 + }, + { + "image_points_px": [ + [ + 832.0, + 206.0 + ], + [ + 842.0, + 205.0 + ], + [ + 872.0, + 238.0 + ], + [ + 862.0, + 239.0 + ] + ], + "center_px": [ + 852.0, + 222.0 + ], + "area_px": 360.0 + }, + { + "image_points_px": [ + [ + 726.0, + 426.0 + ], + [ + 741.0, + 425.0 + ], + [ + 774.0, + 435.0 + ], + [ + 758.0, + 436.0 + ] + ], + "center_px": [ + 749.75, + 430.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 52.0, + 709.0 + ], + [ + 73.0, + 701.0 + ], + [ + 98.0, + 703.0 + ], + [ + 78.0, + 712.0 + ] + ], + "center_px": [ + 75.25, + 706.25 + ], + "area_px": 268.0 + }, + { + "image_points_px": [ + [ + 847.0, + 471.0 + ], + [ + 862.0, + 470.0 + ], + [ + 893.0, + 480.0 + ], + [ + 878.0, + 481.0 + ] + ], + "center_px": [ + 870.0, + 475.5 + ], + "area_px": 181.0 + }, + { + "image_points_px": [ + [ + 157.0, + 710.0 + ], + [ + 176.0, + 702.0 + ], + [ + 202.0, + 705.0 + ], + [ + 185.0, + 713.0 + ] + ], + "center_px": [ + 180.0, + 707.5 + ], + "area_px": 270.0 + }, + { + "image_points_px": [ + [ + 48.0, + 696.0 + ], + [ + 66.0, + 689.0 + ], + [ + 93.0, + 691.0 + ], + [ + 73.0, + 699.0 + ] + ], + "center_px": [ + 70.0, + 693.75 + ], + "area_px": 242.5 + }, + { + "image_points_px": [ + [ + 205.0, + 705.0 + ], + [ + 222.0, + 697.0 + ], + [ + 249.0, + 699.0 + ], + [ + 232.0, + 707.0 + ] + ], + "center_px": [ + 227.0, + 702.0 + ], + "area_px": 250.0 + }, + { + "image_points_px": [ + [ + 150.0, + 697.0 + ], + [ + 167.0, + 690.0 + ], + [ + 194.0, + 692.0 + ], + [ + 175.0, + 700.0 + ] + ], + "center_px": [ + 171.5, + 694.75 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 102.0, + 703.0 + ], + [ + 120.0, + 696.0 + ], + [ + 146.0, + 698.0 + ], + [ + 127.0, + 706.0 + ] + ], + "center_px": [ + 123.75, + 700.75 + ], + "area_px": 237.5 + }, + { + "image_points_px": [ + [ + 43.0, + 684.0 + ], + [ + 63.0, + 676.0 + ], + [ + 87.0, + 679.0 + ], + [ + 67.0, + 686.0 + ] + ], + "center_px": [ + 65.0, + 681.25 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 262.0, + 712.0 + ], + [ + 277.0, + 704.0 + ], + [ + 305.0, + 706.0 + ], + [ + 289.0, + 715.0 + ] + ], + "center_px": [ + 283.25, + 709.25 + ], + "area_px": 272.5 + }, + { + "image_points_px": [ + [ + 367.0, + 713.0 + ], + [ + 382.0, + 705.0 + ], + [ + 410.0, + 708.0 + ], + [ + 396.0, + 716.0 + ] + ], + "center_px": [ + 388.75, + 710.5 + ], + "area_px": 271.5 + }, + { + "image_points_px": [ + [ + 354.0, + 700.0 + ], + [ + 368.0, + 693.0 + ], + [ + 397.0, + 695.0 + ], + [ + 382.0, + 703.0 + ] + ], + "center_px": [ + 375.25, + 697.75 + ], + "area_px": 250.0 + }, + { + "image_points_px": [ + [ + 242.0, + 686.0 + ], + [ + 259.0, + 679.0 + ], + [ + 285.0, + 681.0 + ], + [ + 267.0, + 689.0 + ] + ], + "center_px": [ + 263.25, + 683.75 + ], + "area_px": 235.0 + }, + { + "image_points_px": [ + [ + 96.0, + 690.0 + ], + [ + 115.0, + 683.0 + ], + [ + 139.0, + 685.0 + ], + [ + 121.0, + 693.0 + ] + ], + "center_px": [ + 117.75, + 687.75 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 196.0, + 692.0 + ], + [ + 212.0, + 685.0 + ], + [ + 239.0, + 687.0 + ], + [ + 224.0, + 694.0 + ] + ], + "center_px": [ + 217.75, + 689.5 + ], + "area_px": 223.5 + }, + { + "image_points_px": [ + [ + 517.0, + 709.0 + ], + [ + 529.0, + 701.0 + ], + [ + 559.0, + 704.0 + ], + [ + 547.0, + 712.0 + ] + ], + "center_px": [ + 538.0, + 706.5 + ], + "area_px": 276.0 + }, + { + "image_points_px": [ + [ + 142.0, + 685.0 + ], + [ + 160.0, + 678.0 + ], + [ + 185.0, + 680.0 + ], + [ + 169.0, + 687.0 + ] + ], + "center_px": [ + 164.0, + 682.5 + ], + "area_px": 216.0 + }, + { + "image_points_px": [ + [ + 413.0, + 707.0 + ], + [ + 426.0, + 700.0 + ], + [ + 455.0, + 702.0 + ], + [ + 440.0, + 710.0 + ] + ], + "center_px": [ + 433.5, + 704.75 + ], + "area_px": 245.0 + }, + { + "image_points_px": [ + [ + 309.0, + 706.0 + ], + [ + 324.0, + 698.0 + ], + [ + 351.0, + 701.0 + ], + [ + 338.0, + 708.0 + ] + ], + "center_px": [ + 330.5, + 703.25 + ], + "area_px": 245.0 + }, + { + "image_points_px": [ + [ + 127.0, + 662.0 + ], + [ + 114.0, + 667.0 + ], + [ + 84.0, + 667.0 + ], + [ + 97.0, + 662.0 + ] + ], + "center_px": [ + 105.5, + 664.5 + ], + "area_px": 150.0 + }, + { + "image_points_px": [ + [ + 252.0, + 699.0 + ], + [ + 268.0, + 691.0 + ], + [ + 294.0, + 694.0 + ], + [ + 280.0, + 701.0 + ] + ], + "center_px": [ + 273.5, + 696.25 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 298.0, + 693.0 + ], + [ + 312.0, + 686.0 + ], + [ + 340.0, + 688.0 + ], + [ + 324.0, + 696.0 + ] + ], + "center_px": [ + 318.5, + 690.75 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 623.0, + 710.0 + ], + [ + 634.0, + 702.0 + ], + [ + 664.0, + 705.0 + ], + [ + 653.0, + 713.0 + ] + ], + "center_px": [ + 643.5, + 707.5 + ], + "area_px": 273.0 + }, + { + "image_points_px": [ + [ + 287.0, + 681.0 + ], + [ + 302.0, + 674.0 + ], + [ + 329.0, + 676.0 + ], + [ + 315.0, + 683.0 + ] + ], + "center_px": [ + 308.25, + 678.5 + ], + "area_px": 221.5 + }, + { + "image_points_px": [ + [ + 90.0, + 678.0 + ], + [ + 108.0, + 671.0 + ], + [ + 132.0, + 673.0 + ], + [ + 117.0, + 680.0 + ] + ], + "center_px": [ + 111.75, + 675.5 + ], + "area_px": 211.5 + }, + { + "image_points_px": [ + [ + 39.0, + 672.0 + ], + [ + 58.0, + 665.0 + ], + [ + 81.0, + 667.0 + ], + [ + 63.0, + 674.0 + ] + ], + "center_px": [ + 60.25, + 669.5 + ], + "area_px": 201.5 + }, + { + "image_points_px": [ + [ + 35.0, + 660.0 + ], + [ + 52.0, + 654.0 + ], + [ + 77.0, + 656.0 + ], + [ + 58.0, + 663.0 + ] + ], + "center_px": [ + 55.5, + 658.25 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 458.0, + 701.0 + ], + [ + 470.0, + 694.0 + ], + [ + 499.0, + 696.0 + ], + [ + 487.0, + 704.0 + ] + ], + "center_px": [ + 478.5, + 698.75 + ], + "area_px": 247.5 + }, + { + "image_points_px": [ + [ + 443.0, + 689.0 + ], + [ + 457.0, + 681.0 + ], + [ + 484.0, + 684.0 + ], + [ + 472.0, + 691.0 + ] + ], + "center_px": [ + 464.0, + 686.25 + ], + "area_px": 242.5 + }, + { + "image_points_px": [ + [ + 343.0, + 688.0 + ], + [ + 358.0, + 680.0 + ], + [ + 384.0, + 683.0 + ], + [ + 370.0, + 690.0 + ] + ], + "center_px": [ + 363.75, + 685.25 + ], + "area_px": 235.0 + }, + { + "image_points_px": [ + [ + 189.0, + 680.0 + ], + [ + 205.0, + 672.0 + ], + [ + 230.0, + 675.0 + ], + [ + 214.0, + 682.0 + ] + ], + "center_px": [ + 209.5, + 677.25 + ], + "area_px": 227.5 + }, + { + "image_points_px": [ + [ + 562.0, + 703.0 + ], + [ + 573.0, + 695.0 + ], + [ + 602.0, + 698.0 + ], + [ + 591.0, + 706.0 + ] + ], + "center_px": [ + 582.0, + 700.5 + ], + "area_px": 265.0 + }, + { + "image_points_px": [ + [ + 136.0, + 673.0 + ], + [ + 153.0, + 666.0 + ], + [ + 177.0, + 668.0 + ], + [ + 162.0, + 675.0 + ] + ], + "center_px": [ + 157.0, + 670.5 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 1195.0, + 711.0 + ], + [ + 1197.0, + 703.0 + ], + [ + 1231.0, + 707.0 + ], + [ + 1229.0, + 715.0 + ] + ], + "center_px": [ + 1213.0, + 709.0 + ], + "area_px": 280.0 + }, + { + "image_points_px": [ + [ + 604.0, + 697.0 + ], + [ + 615.0, + 690.0 + ], + [ + 644.0, + 692.0 + ], + [ + 633.0, + 700.0 + ] + ], + "center_px": [ + 624.0, + 694.75 + ], + "area_px": 245.0 + }, + { + "image_points_px": [ + [ + 400.0, + 695.0 + ], + [ + 414.0, + 687.0 + ], + [ + 440.0, + 689.0 + ], + [ + 427.0, + 697.0 + ] + ], + "center_px": [ + 420.25, + 692.0 + ], + "area_px": 239.0 + }, + { + "image_points_px": [ + [ + 502.0, + 696.0 + ], + [ + 515.0, + 688.0 + ], + [ + 542.0, + 691.0 + ], + [ + 531.0, + 698.0 + ] + ], + "center_px": [ + 522.5, + 693.25 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 666.0, + 704.0 + ], + [ + 676.0, + 696.0 + ], + [ + 705.0, + 699.0 + ], + [ + 696.0, + 707.0 + ] + ], + "center_px": [ + 685.75, + 701.5 + ], + "area_px": 264.5 + }, + { + "image_points_px": [ + [ + 387.0, + 682.0 + ], + [ + 400.0, + 675.0 + ], + [ + 427.0, + 677.0 + ], + [ + 413.0, + 685.0 + ] + ], + "center_px": [ + 406.75, + 679.75 + ], + "area_px": 232.5 + }, + { + "image_points_px": [ + [ + 1232.0, + 705.0 + ], + [ + 1234.0, + 697.0 + ], + [ + 1267.0, + 701.0 + ], + [ + 1266.0, + 709.0 + ] + ], + "center_px": [ + 1249.75, + 703.0 + ], + "area_px": 274.0 + }, + { + "image_points_px": [ + [ + 430.0, + 677.0 + ], + [ + 443.0, + 670.0 + ], + [ + 470.0, + 672.0 + ], + [ + 457.0, + 679.0 + ] + ], + "center_px": [ + 450.0, + 674.5 + ], + "area_px": 215.0 + }, + { + "image_points_px": [ + [ + 332.0, + 676.0 + ], + [ + 345.0, + 669.0 + ], + [ + 372.0, + 671.0 + ], + [ + 358.0, + 678.0 + ] + ], + "center_px": [ + 351.75, + 673.5 + ], + "area_px": 212.5 + }, + { + "image_points_px": [ + [ + 181.0, + 668.0 + ], + [ + 198.0, + 661.0 + ], + [ + 221.0, + 663.0 + ], + [ + 206.0, + 670.0 + ] + ], + "center_px": [ + 201.5, + 665.5 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 130.0, + 662.0 + ], + [ + 146.0, + 655.0 + ], + [ + 170.0, + 657.0 + ], + [ + 154.0, + 664.0 + ] + ], + "center_px": [ + 150.0, + 659.5 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 234.0, + 674.0 + ], + [ + 248.0, + 668.0 + ], + [ + 274.0, + 670.0 + ], + [ + 258.0, + 677.0 + ] + ], + "center_px": [ + 253.5, + 672.25 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 80.0, + 656.0 + ], + [ + 97.0, + 649.0 + ], + [ + 120.0, + 651.0 + ], + [ + 103.0, + 658.0 + ] + ], + "center_px": [ + 100.0, + 653.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 545.0, + 690.0 + ], + [ + 556.0, + 683.0 + ], + [ + 584.0, + 685.0 + ], + [ + 573.0, + 693.0 + ] + ], + "center_px": [ + 564.5, + 687.75 + ], + "area_px": 237.5 + }, + { + "image_points_px": [ + [ + 277.0, + 669.0 + ], + [ + 294.0, + 662.0 + ], + [ + 317.0, + 665.0 + ], + [ + 301.0, + 671.0 + ] + ], + "center_px": [ + 297.25, + 666.75 + ], + "area_px": 194.0 + }, + { + "image_points_px": [ + [ + 320.0, + 664.0 + ], + [ + 336.0, + 658.0 + ], + [ + 360.0, + 660.0 + ], + [ + 347.0, + 666.0 + ] + ], + "center_px": [ + 340.75, + 662.0 + ], + "area_px": 182.0 + }, + { + "image_points_px": [ + [ + 587.0, + 685.0 + ], + [ + 597.0, + 678.0 + ], + [ + 626.0, + 680.0 + ], + [ + 616.0, + 687.0 + ] + ], + "center_px": [ + 606.5, + 682.5 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 123.0, + 651.0 + ], + [ + 138.0, + 645.0 + ], + [ + 163.0, + 647.0 + ], + [ + 147.0, + 653.0 + ] + ], + "center_px": [ + 142.75, + 649.0 + ], + "area_px": 178.0 + }, + { + "image_points_px": [ + [ + 74.0, + 645.0 + ], + [ + 91.0, + 639.0 + ], + [ + 114.0, + 641.0 + ], + [ + 98.0, + 647.0 + ] + ], + "center_px": [ + 94.25, + 643.0 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 487.0, + 683.0 + ], + [ + 499.0, + 676.0 + ], + [ + 526.0, + 679.0 + ], + [ + 515.0, + 686.0 + ] + ], + "center_px": [ + 506.75, + 681.0 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 256.0, + 648.0 + ], + [ + 240.0, + 654.0 + ], + [ + 216.0, + 652.0 + ], + [ + 238.0, + 646.0 + ] + ], + "center_px": [ + 237.5, + 650.0 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 166.0, + 646.0 + ], + [ + 181.0, + 641.0 + ], + [ + 206.0, + 642.0 + ], + [ + 188.0, + 648.0 + ] + ], + "center_px": [ + 185.25, + 644.25 + ], + "area_px": 154.0 + }, + { + "image_points_px": [ + [ + 375.0, + 670.0 + ], + [ + 388.0, + 663.0 + ], + [ + 414.0, + 666.0 + ], + [ + 401.0, + 673.0 + ] + ], + "center_px": [ + 394.5, + 668.0 + ], + "area_px": 221.0 + }, + { + "image_points_px": [ + [ + 472.0, + 672.0 + ], + [ + 485.0, + 665.0 + ], + [ + 511.0, + 667.0 + ], + [ + 499.0, + 674.0 + ] + ], + "center_px": [ + 491.75, + 669.5 + ], + "area_px": 210.5 + }, + { + "image_points_px": [ + [ + 688.0, + 686.0 + ], + [ + 697.0, + 679.0 + ], + [ + 726.0, + 681.0 + ], + [ + 717.0, + 689.0 + ] + ], + "center_px": [ + 707.0, + 683.75 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 109.0, + 631.0 + ], + [ + 94.0, + 636.0 + ], + [ + 69.0, + 635.0 + ], + [ + 80.0, + 631.0 + ] + ], + "center_px": [ + 88.0, + 633.25 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 67.0, + 635.0 + ], + [ + 46.0, + 641.0 + ], + [ + 27.0, + 639.0 + ], + [ + 50.0, + 634.0 + ] + ], + "center_px": [ + 47.5, + 637.25 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 225.0, + 663.0 + ], + [ + 240.0, + 656.0 + ], + [ + 264.0, + 658.0 + ], + [ + 251.0, + 665.0 + ] + ], + "center_px": [ + 245.0, + 660.5 + ], + "area_px": 203.0 + }, + { + "image_points_px": [ + [ + 647.0, + 692.0 + ], + [ + 657.0, + 684.0 + ], + [ + 685.0, + 687.0 + ], + [ + 676.0, + 694.0 + ] + ], + "center_px": [ + 666.25, + 689.25 + ], + "area_px": 237.5 + }, + { + "image_points_px": [ + [ + 174.0, + 657.0 + ], + [ + 190.0, + 650.0 + ], + [ + 213.0, + 652.0 + ], + [ + 198.0, + 659.0 + ] + ], + "center_px": [ + 193.75, + 654.5 + ], + "area_px": 195.5 + }, + { + "image_points_px": [ + [ + 417.0, + 665.0 + ], + [ + 429.0, + 659.0 + ], + [ + 456.0, + 661.0 + ], + [ + 444.0, + 667.0 + ] + ], + "center_px": [ + 436.5, + 663.0 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 363.0, + 659.0 + ], + [ + 376.0, + 653.0 + ], + [ + 402.0, + 655.0 + ], + [ + 389.0, + 661.0 + ] + ], + "center_px": [ + 382.5, + 657.0 + ], + "area_px": 182.0 + }, + { + "image_points_px": [ + [ + 404.0, + 654.0 + ], + [ + 417.0, + 648.0 + ], + [ + 443.0, + 650.0 + ], + [ + 430.0, + 656.0 + ] + ], + "center_px": [ + 423.5, + 652.0 + ], + "area_px": 182.0 + }, + { + "image_points_px": [ + [ + 1200.0, + 693.0 + ], + [ + 1202.0, + 685.0 + ], + [ + 1234.0, + 688.0 + ], + [ + 1232.0, + 696.0 + ] + ], + "center_px": [ + 1217.0, + 690.5 + ], + "area_px": 262.0 + }, + { + "image_points_px": [ + [ + 310.0, + 653.0 + ], + [ + 324.0, + 647.0 + ], + [ + 349.0, + 649.0 + ], + [ + 336.0, + 655.0 + ] + ], + "center_px": [ + 329.75, + 651.0 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 31.0, + 650.0 + ], + [ + 49.0, + 643.0 + ], + [ + 70.0, + 646.0 + ], + [ + 54.0, + 652.0 + ] + ], + "center_px": [ + 51.0, + 647.75 + ], + "area_px": 185.5 + }, + { + "image_points_px": [ + [ + 529.0, + 678.0 + ], + [ + 540.0, + 671.0 + ], + [ + 567.0, + 674.0 + ], + [ + 556.0, + 681.0 + ] + ], + "center_px": [ + 548.0, + 676.0 + ], + "area_px": 222.0 + }, + { + "image_points_px": [ + [ + 570.0, + 673.0 + ], + [ + 581.0, + 666.0 + ], + [ + 608.0, + 668.0 + ], + [ + 598.0, + 675.0 + ] + ], + "center_px": [ + 589.25, + 670.5 + ], + "area_px": 213.5 + }, + { + "image_points_px": [ + [ + 628.0, + 679.0 + ], + [ + 637.0, + 673.0 + ], + [ + 666.0, + 675.0 + ], + [ + 656.0, + 682.0 + ] + ], + "center_px": [ + 646.75, + 677.25 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 514.0, + 667.0 + ], + [ + 525.0, + 660.0 + ], + [ + 552.0, + 662.0 + ], + [ + 540.0, + 669.0 + ] + ], + "center_px": [ + 532.75, + 664.5 + ], + "area_px": 208.5 + }, + { + "image_points_px": [ + [ + 259.0, + 647.0 + ], + [ + 277.0, + 642.0 + ], + [ + 298.0, + 643.0 + ], + [ + 280.0, + 649.0 + ] + ], + "center_px": [ + 278.5, + 645.25 + ], + "area_px": 142.5 + }, + { + "image_points_px": [ + [ + 159.0, + 636.0 + ], + [ + 174.0, + 631.0 + ], + [ + 198.0, + 632.0 + ], + [ + 180.0, + 637.0 + ] + ], + "center_px": [ + 177.75, + 634.0 + ], + "area_px": 129.0 + }, + { + "image_points_px": [ + [ + 185.0, + 613.0 + ], + [ + 170.0, + 618.0 + ], + [ + 146.0, + 617.0 + ], + [ + 167.0, + 612.0 + ] + ], + "center_px": [ + 167.0, + 615.0 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 54.0, + 607.0 + ], + [ + 37.0, + 612.0 + ], + [ + 15.0, + 611.0 + ], + [ + 36.0, + 606.0 + ] + ], + "center_px": [ + 35.5, + 609.0 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 269.0, + 658.0 + ], + [ + 283.0, + 651.0 + ], + [ + 307.0, + 654.0 + ], + [ + 294.0, + 660.0 + ] + ], + "center_px": [ + 288.25, + 655.75 + ], + "area_px": 193.0 + }, + { + "image_points_px": [ + [ + 458.0, + 660.0 + ], + [ + 470.0, + 654.0 + ], + [ + 496.0, + 656.0 + ], + [ + 485.0, + 662.0 + ] + ], + "center_px": [ + 477.25, + 658.0 + ], + "area_px": 182.0 + }, + { + "image_points_px": [ + [ + 1164.0, + 698.0 + ], + [ + 1166.0, + 691.0 + ], + [ + 1198.0, + 694.0 + ], + [ + 1196.0, + 701.0 + ] + ], + "center_px": [ + 1181.0, + 696.0 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 611.0, + 668.0 + ], + [ + 621.0, + 661.0 + ], + [ + 648.0, + 663.0 + ], + [ + 639.0, + 670.0 + ] + ], + "center_px": [ + 629.75, + 665.5 + ], + "area_px": 211.5 + }, + { + "image_points_px": [ + [ + 669.0, + 674.0 + ], + [ + 679.0, + 667.0 + ], + [ + 706.0, + 670.0 + ], + [ + 696.0, + 677.0 + ] + ], + "center_px": [ + 687.5, + 672.0 + ], + "area_px": 219.0 + }, + { + "image_points_px": [ + [ + 392.0, + 644.0 + ], + [ + 406.0, + 638.0 + ], + [ + 430.0, + 640.0 + ], + [ + 417.0, + 646.0 + ] + ], + "center_px": [ + 411.25, + 642.0 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 708.0, + 669.0 + ], + [ + 718.0, + 662.0 + ], + [ + 745.0, + 665.0 + ], + [ + 737.0, + 671.0 + ] + ], + "center_px": [ + 727.0, + 666.75 + ], + "area_px": 204.5 + }, + { + "image_points_px": [ + [ + 555.0, + 662.0 + ], + [ + 565.0, + 655.0 + ], + [ + 592.0, + 657.0 + ], + [ + 581.0, + 664.0 + ] + ], + "center_px": [ + 573.25, + 659.5 + ], + "area_px": 206.5 + }, + { + "image_points_px": [ + [ + 352.0, + 648.0 + ], + [ + 365.0, + 643.0 + ], + [ + 390.0, + 644.0 + ], + [ + 377.0, + 650.0 + ] + ], + "center_px": [ + 371.0, + 646.25 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 341.0, + 638.0 + ], + [ + 353.0, + 633.0 + ], + [ + 379.0, + 634.0 + ], + [ + 365.0, + 640.0 + ] + ], + "center_px": [ + 359.5, + 636.25 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 650.0, + 663.0 + ], + [ + 660.0, + 656.0 + ], + [ + 687.0, + 659.0 + ], + [ + 678.0, + 665.0 + ] + ], + "center_px": [ + 668.75, + 660.75 + ], + "area_px": 202.5 + }, + { + "image_points_px": [ + [ + 209.0, + 642.0 + ], + [ + 227.0, + 636.0 + ], + [ + 247.0, + 637.0 + ], + [ + 231.0, + 643.0 + ] + ], + "center_px": [ + 228.5, + 639.5 + ], + "area_px": 143.0 + }, + { + "image_points_px": [ + [ + 250.0, + 637.0 + ], + [ + 268.0, + 632.0 + ], + [ + 288.0, + 633.0 + ], + [ + 274.0, + 639.0 + ] + ], + "center_px": [ + 270.0, + 635.25 + ], + "area_px": 145.0 + }, + { + "image_points_px": [ + [ + 156.0, + 636.0 + ], + [ + 137.0, + 642.0 + ], + [ + 118.0, + 641.0 + ], + [ + 138.0, + 635.0 + ] + ], + "center_px": [ + 137.25, + 638.5 + ], + "area_px": 130.5 + }, + { + "image_points_px": [ + [ + 23.0, + 629.0 + ], + [ + 36.0, + 625.0 + ], + [ + 61.0, + 625.0 + ], + [ + 44.0, + 631.0 + ] + ], + "center_px": [ + 41.0, + 627.5 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 499.0, + 655.0 + ], + [ + 511.0, + 649.0 + ], + [ + 536.0, + 651.0 + ], + [ + 525.0, + 658.0 + ] + ], + "center_px": [ + 517.75, + 653.25 + ], + "area_px": 194.5 + }, + { + "image_points_px": [ + [ + 150.0, + 627.0 + ], + [ + 132.0, + 632.0 + ], + [ + 112.0, + 631.0 + ], + [ + 134.0, + 625.0 + ] + ], + "center_px": [ + 132.0, + 628.75 + ], + "area_px": 129.0 + }, + { + "image_points_px": [ + [ + 191.0, + 622.0 + ], + [ + 178.0, + 627.0 + ], + [ + 153.0, + 626.0 + ], + [ + 172.0, + 621.0 + ] + ], + "center_px": [ + 173.5, + 624.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 1236.0, + 687.0 + ], + [ + 1237.0, + 680.0 + ], + [ + 1269.0, + 684.0 + ], + [ + 1268.0, + 690.0 + ] + ], + "center_px": [ + 1252.5, + 685.25 + ], + "area_px": 211.5 + }, + { + "image_points_px": [ + [ + 103.0, + 621.0 + ], + [ + 89.0, + 626.0 + ], + [ + 65.0, + 625.0 + ], + [ + 86.0, + 620.0 + ] + ], + "center_px": [ + 85.75, + 623.0 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 144.0, + 617.0 + ], + [ + 130.0, + 622.0 + ], + [ + 106.0, + 621.0 + ], + [ + 127.0, + 616.0 + ] + ], + "center_px": [ + 126.75, + 619.0 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 101.0, + 612.0 + ], + [ + 119.0, + 607.0 + ], + [ + 139.0, + 608.0 + ], + [ + 120.0, + 613.0 + ] + ], + "center_px": [ + 119.75, + 610.0 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 98.0, + 612.0 + ], + [ + 78.0, + 617.0 + ], + [ + 60.0, + 616.0 + ], + [ + 79.0, + 611.0 + ] + ], + "center_px": [ + 78.75, + 614.0 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 485.0, + 645.0 + ], + [ + 496.0, + 639.0 + ], + [ + 522.0, + 641.0 + ], + [ + 510.0, + 647.0 + ] + ], + "center_px": [ + 503.25, + 643.0 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 301.0, + 643.0 + ], + [ + 313.0, + 637.0 + ], + [ + 338.0, + 639.0 + ], + [ + 325.0, + 645.0 + ] + ], + "center_px": [ + 319.25, + 641.0 + ], + "area_px": 172.0 + }, + { + "image_points_px": [ + [ + 594.0, + 657.0 + ], + [ + 603.0, + 651.0 + ], + [ + 630.0, + 652.0 + ], + [ + 621.0, + 659.0 + ] + ], + "center_px": [ + 612.0, + 654.75 + ], + "area_px": 189.0 + }, + { + "image_points_px": [ + [ + 291.0, + 633.0 + ], + [ + 302.0, + 628.0 + ], + [ + 328.0, + 629.0 + ], + [ + 316.0, + 634.0 + ] + ], + "center_px": [ + 309.25, + 631.0 + ], + "area_px": 139.0 + }, + { + "image_points_px": [ + [ + 282.0, + 623.0 + ], + [ + 295.0, + 618.0 + ], + [ + 319.0, + 619.0 + ], + [ + 307.0, + 624.0 + ] + ], + "center_px": [ + 300.75, + 621.0 + ], + "area_px": 135.0 + }, + { + "image_points_px": [ + [ + 202.0, + 632.0 + ], + [ + 214.0, + 627.0 + ], + [ + 239.0, + 628.0 + ], + [ + 224.0, + 633.0 + ] + ], + "center_px": [ + 219.75, + 630.0 + ], + "area_px": 131.0 + }, + { + "image_points_px": [ + [ + 633.0, + 652.0 + ], + [ + 642.0, + 646.0 + ], + [ + 669.0, + 648.0 + ], + [ + 660.0, + 654.0 + ] + ], + "center_px": [ + 651.0, + 650.0 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 194.0, + 622.0 + ], + [ + 212.0, + 617.0 + ], + [ + 231.0, + 618.0 + ], + [ + 218.0, + 623.0 + ] + ], + "center_px": [ + 213.75, + 620.0 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 446.0, + 650.0 + ], + [ + 456.0, + 644.0 + ], + [ + 482.0, + 645.0 + ], + [ + 470.0, + 652.0 + ] + ], + "center_px": [ + 463.5, + 647.75 + ], + "area_px": 179.0 + }, + { + "image_points_px": [ + [ + 141.0, + 608.0 + ], + [ + 158.0, + 603.0 + ], + [ + 178.0, + 604.0 + ], + [ + 164.0, + 609.0 + ] + ], + "center_px": [ + 160.25, + 606.0 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 671.0, + 647.0 + ], + [ + 681.0, + 641.0 + ], + [ + 707.0, + 643.0 + ], + [ + 698.0, + 649.0 + ] + ], + "center_px": [ + 689.25, + 645.0 + ], + "area_px": 178.0 + }, + { + "image_points_px": [ + [ + 56.0, + 607.0 + ], + [ + 73.0, + 602.0 + ], + [ + 93.0, + 603.0 + ], + [ + 78.0, + 608.0 + ] + ], + "center_px": [ + 75.0, + 605.0 + ], + "area_px": 121.0 + }, + { + "image_points_px": [ + [ + 187.0, + 613.0 + ], + [ + 205.0, + 608.0 + ], + [ + 224.0, + 609.0 + ], + [ + 209.0, + 614.0 + ] + ], + "center_px": [ + 206.25, + 611.0 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 539.0, + 651.0 + ], + [ + 549.0, + 645.0 + ], + [ + 575.0, + 647.0 + ], + [ + 565.0, + 653.0 + ] + ], + "center_px": [ + 557.0, + 649.0 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 578.0, + 646.0 + ], + [ + 588.0, + 640.0 + ], + [ + 614.0, + 642.0 + ], + [ + 604.0, + 648.0 + ] + ], + "center_px": [ + 596.0, + 644.0 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 562.0, + 636.0 + ], + [ + 573.0, + 630.0 + ], + [ + 598.0, + 632.0 + ], + [ + 588.0, + 638.0 + ] + ], + "center_px": [ + 580.25, + 634.0 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 524.0, + 640.0 + ], + [ + 535.0, + 635.0 + ], + [ + 560.0, + 636.0 + ], + [ + 550.0, + 642.0 + ] + ], + "center_px": [ + 542.25, + 638.25 + ], + "area_px": 156.0 + }, + { + "image_points_px": [ + [ + 728.0, + 653.0 + ], + [ + 736.0, + 647.0 + ], + [ + 763.0, + 649.0 + ], + [ + 756.0, + 655.0 + ] + ], + "center_px": [ + 745.75, + 651.0 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 370.0, + 624.0 + ], + [ + 385.0, + 619.0 + ], + [ + 406.0, + 620.0 + ], + [ + 393.0, + 626.0 + ] + ], + "center_px": [ + 388.5, + 622.25 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 382.0, + 634.0 + ], + [ + 392.0, + 629.0 + ], + [ + 418.0, + 630.0 + ], + [ + 406.0, + 635.0 + ] + ], + "center_px": [ + 399.5, + 632.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 242.0, + 627.0 + ], + [ + 256.0, + 622.0 + ], + [ + 278.0, + 623.0 + ], + [ + 264.0, + 629.0 + ] + ], + "center_px": [ + 260.0, + 625.25 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 420.0, + 629.0 + ], + [ + 432.0, + 624.0 + ], + [ + 456.0, + 626.0 + ], + [ + 444.0, + 631.0 + ] + ], + "center_px": [ + 438.0, + 627.5 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 690.0, + 658.0 + ], + [ + 698.0, + 652.0 + ], + [ + 725.0, + 654.0 + ], + [ + 717.0, + 660.0 + ] + ], + "center_px": [ + 707.5, + 656.0 + ], + "area_px": 178.0 + }, + { + "image_points_px": [ + [ + 331.0, + 628.0 + ], + [ + 346.0, + 623.0 + ], + [ + 367.0, + 625.0 + ], + [ + 354.0, + 630.0 + ] + ], + "center_px": [ + 349.5, + 626.5 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 311.0, + 610.0 + ], + [ + 325.0, + 605.0 + ], + [ + 347.0, + 606.0 + ], + [ + 335.0, + 611.0 + ] + ], + "center_px": [ + 329.5, + 608.0 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 321.0, + 619.0 + ], + [ + 336.0, + 614.0 + ], + [ + 357.0, + 615.0 + ], + [ + 345.0, + 620.0 + ] + ], + "center_px": [ + 339.75, + 617.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 234.0, + 618.0 + ], + [ + 249.0, + 613.0 + ], + [ + 270.0, + 614.0 + ], + [ + 258.0, + 619.0 + ] + ], + "center_px": [ + 252.75, + 616.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 654.0, + 637.0 + ], + [ + 663.0, + 631.0 + ], + [ + 689.0, + 633.0 + ], + [ + 680.0, + 639.0 + ] + ], + "center_px": [ + 671.5, + 635.0 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 264.0, + 605.0 + ], + [ + 279.0, + 600.0 + ], + [ + 300.0, + 601.0 + ], + [ + 287.0, + 606.0 + ] + ], + "center_px": [ + 282.5, + 603.0 + ], + "area_px": 124.0 + }, + { + "image_points_px": [ + [ + 273.0, + 614.0 + ], + [ + 289.0, + 609.0 + ], + [ + 309.0, + 610.0 + ], + [ + 296.0, + 615.0 + ] + ], + "center_px": [ + 291.75, + 612.0 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 1208.0, + 658.0 + ], + [ + 1210.0, + 652.0 + ], + [ + 1240.0, + 655.0 + ], + [ + 1239.0, + 661.0 + ] + ], + "center_px": [ + 1224.25, + 656.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 262.0, + 605.0 + ], + [ + 248.0, + 610.0 + ], + [ + 226.0, + 609.0 + ], + [ + 244.0, + 604.0 + ] + ], + "center_px": [ + 245.0, + 607.0 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 96.0, + 603.0 + ], + [ + 109.0, + 599.0 + ], + [ + 132.0, + 599.0 + ], + [ + 119.0, + 604.0 + ] + ], + "center_px": [ + 114.0, + 601.25 + ], + "area_px": 110.0 + }, + { + "image_points_px": [ + [ + 216.0, + 600.0 + ], + [ + 201.0, + 605.0 + ], + [ + 180.0, + 604.0 + ], + [ + 198.0, + 599.0 + ] + ], + "center_px": [ + 198.75, + 602.0 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 10.0, + 594.0 + ], + [ + 26.0, + 589.0 + ], + [ + 46.0, + 590.0 + ], + [ + 29.0, + 595.0 + ] + ], + "center_px": [ + 27.75, + 592.0 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 218.0, + 600.0 + ], + [ + 231.0, + 596.0 + ], + [ + 254.0, + 597.0 + ], + [ + 242.0, + 601.0 + ] + ], + "center_px": [ + 236.25, + 598.5 + ], + "area_px": 106.5 + }, + { + "image_points_px": [ + [ + 135.0, + 599.0 + ], + [ + 149.0, + 595.0 + ], + [ + 171.0, + 596.0 + ], + [ + 157.0, + 600.0 + ] + ], + "center_px": [ + 153.0, + 597.5 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 52.0, + 598.0 + ], + [ + 68.0, + 594.0 + ], + [ + 88.0, + 595.0 + ], + [ + 75.0, + 599.0 + ] + ], + "center_px": [ + 70.75, + 596.5 + ], + "area_px": 100.5 + }, + { + "image_points_px": [ + [ + 44.0, + 582.0 + ], + [ + 58.0, + 578.0 + ], + [ + 80.0, + 579.0 + ], + [ + 65.0, + 583.0 + ] + ], + "center_px": [ + 61.75, + 580.5 + ], + "area_px": 100.5 + }, + { + "image_points_px": [ + [ + 459.0, + 625.0 + ], + [ + 469.0, + 620.0 + ], + [ + 494.0, + 621.0 + ], + [ + 483.0, + 627.0 + ] + ], + "center_px": [ + 476.25, + 623.25 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 746.0, + 638.0 + ], + [ + 754.0, + 632.0 + ], + [ + 780.0, + 634.0 + ], + [ + 773.0, + 640.0 + ] + ], + "center_px": [ + 763.25, + 636.0 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 447.0, + 616.0 + ], + [ + 457.0, + 611.0 + ], + [ + 482.0, + 612.0 + ], + [ + 471.0, + 617.0 + ] + ], + "center_px": [ + 464.25, + 614.0 + ], + "area_px": 133.0 + }, + { + "image_points_px": [ + [ + 409.0, + 620.0 + ], + [ + 420.0, + 615.0 + ], + [ + 444.0, + 616.0 + ], + [ + 433.0, + 621.0 + ] + ], + "center_px": [ + 426.5, + 618.0 + ], + "area_px": 131.0 + }, + { + "image_points_px": [ + [ + 617.0, + 641.0 + ], + [ + 625.0, + 636.0 + ], + [ + 651.0, + 637.0 + ], + [ + 642.0, + 644.0 + ] + ], + "center_px": [ + 633.75, + 639.5 + ], + "area_px": 170.0 + }, + { + "image_points_px": [ + [ + 360.0, + 615.0 + ], + [ + 371.0, + 610.0 + ], + [ + 395.0, + 611.0 + ], + [ + 381.0, + 616.0 + ] + ], + "center_px": [ + 376.75, + 613.0 + ], + "area_px": 125.0 + }, + { + "image_points_px": [ + [ + 938.0, + 680.0 + ], + [ + 926.0, + 696.0 + ], + [ + 910.0, + 694.0 + ], + [ + 923.0, + 678.0 + ] + ], + "center_px": [ + 924.25, + 687.0 + ], + "area_px": 273.0 + }, + { + "image_points_px": [ + [ + 709.0, + 642.0 + ], + [ + 717.0, + 637.0 + ], + [ + 743.0, + 639.0 + ], + [ + 735.0, + 645.0 + ] + ], + "center_px": [ + 726.0, + 640.75 + ], + "area_px": 163.0 + }, + { + "image_points_px": [ + [ + 473.0, + 635.0 + ], + [ + 482.0, + 629.0 + ], + [ + 507.0, + 631.0 + ], + [ + 497.0, + 637.0 + ] + ], + "center_px": [ + 489.75, + 633.0 + ], + "area_px": 166.0 + }, + { + "image_points_px": [ + [ + 637.0, + 627.0 + ], + [ + 646.0, + 622.0 + ], + [ + 671.0, + 623.0 + ], + [ + 663.0, + 629.0 + ] + ], + "center_px": [ + 654.25, + 625.25 + ], + "area_px": 153.0 + }, + { + "image_points_px": [ + [ + 174.0, + 595.0 + ], + [ + 187.0, + 591.0 + ], + [ + 209.0, + 592.0 + ], + [ + 198.0, + 596.0 + ] + ], + "center_px": [ + 192.0, + 593.5 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 127.0, + 591.0 + ], + [ + 112.0, + 596.0 + ], + [ + 92.0, + 594.0 + ], + [ + 113.0, + 590.0 + ] + ], + "center_px": [ + 111.0, + 592.75 + ], + "area_px": 103.5 + }, + { + "image_points_px": [ + [ + 129.0, + 591.0 + ], + [ + 142.0, + 587.0 + ], + [ + 164.0, + 588.0 + ], + [ + 151.0, + 592.0 + ] + ], + "center_px": [ + 146.5, + 589.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 585.0, + 622.0 + ], + [ + 595.0, + 616.0 + ], + [ + 619.0, + 618.0 + ], + [ + 611.0, + 623.0 + ] + ], + "center_px": [ + 602.5, + 619.75 + ], + "area_px": 151.0 + }, + { + "image_points_px": [ + [ + 691.0, + 632.0 + ], + [ + 699.0, + 627.0 + ], + [ + 725.0, + 629.0 + ], + [ + 718.0, + 634.0 + ] + ], + "center_px": [ + 708.25, + 630.5 + ], + "area_px": 147.5 + }, + { + "image_points_px": [ + [ + 87.0, + 586.0 + ], + [ + 102.0, + 582.0 + ], + [ + 122.0, + 583.0 + ], + [ + 109.0, + 587.0 + ] + ], + "center_px": [ + 105.0, + 584.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 7.0, + 585.0 + ], + [ + 22.0, + 581.0 + ], + [ + 42.0, + 582.0 + ], + [ + 29.0, + 586.0 + ] + ], + "center_px": [ + 25.0, + 583.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 548.0, + 626.0 + ], + [ + 558.0, + 621.0 + ], + [ + 582.0, + 622.0 + ], + [ + 573.0, + 628.0 + ] + ], + "center_px": [ + 565.25, + 624.25 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 601.0, + 631.0 + ], + [ + 610.0, + 626.0 + ], + [ + 635.0, + 628.0 + ], + [ + 626.0, + 633.0 + ] + ], + "center_px": [ + 618.0, + 629.5 + ], + "area_px": 143.0 + }, + { + "image_points_px": [ + [ + 497.0, + 621.0 + ], + [ + 506.0, + 616.0 + ], + [ + 531.0, + 617.0 + ], + [ + 522.0, + 622.0 + ] + ], + "center_px": [ + 514.0, + 619.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 534.0, + 617.0 + ], + [ + 543.0, + 612.0 + ], + [ + 568.0, + 613.0 + ], + [ + 559.0, + 618.0 + ] + ], + "center_px": [ + 551.0, + 615.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 570.0, + 613.0 + ], + [ + 579.0, + 608.0 + ], + [ + 604.0, + 609.0 + ], + [ + 595.0, + 614.0 + ] + ], + "center_px": [ + 587.0, + 611.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 511.0, + 630.0 + ], + [ + 521.0, + 625.0 + ], + [ + 545.0, + 627.0 + ], + [ + 535.0, + 632.0 + ] + ], + "center_px": [ + 528.0, + 628.5 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 484.0, + 612.0 + ], + [ + 494.0, + 607.0 + ], + [ + 518.0, + 608.0 + ], + [ + 508.0, + 613.0 + ] + ], + "center_px": [ + 501.0, + 610.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 520.0, + 608.0 + ], + [ + 530.0, + 603.0 + ], + [ + 554.0, + 604.0 + ], + [ + 544.0, + 609.0 + ] + ], + "center_px": [ + 537.0, + 606.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 435.0, + 607.0 + ], + [ + 445.0, + 602.0 + ], + [ + 469.0, + 603.0 + ], + [ + 458.0, + 608.0 + ] + ], + "center_px": [ + 451.75, + 605.0 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 1205.0, + 670.0 + ], + [ + 1235.0, + 671.0 + ], + [ + 1236.0, + 676.0 + ], + [ + 1206.0, + 675.0 + ] + ], + "center_px": [ + 1220.5, + 673.0 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 1239.0, + 665.0 + ], + [ + 1269.0, + 666.0 + ], + [ + 1270.0, + 671.0 + ], + [ + 1240.0, + 670.0 + ] + ], + "center_px": [ + 1254.5, + 668.0 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 398.0, + 611.0 + ], + [ + 409.0, + 606.0 + ], + [ + 432.0, + 607.0 + ], + [ + 421.0, + 612.0 + ] + ], + "center_px": [ + 415.0, + 609.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 350.0, + 606.0 + ], + [ + 362.0, + 601.0 + ], + [ + 384.0, + 602.0 + ], + [ + 373.0, + 607.0 + ] + ], + "center_px": [ + 367.25, + 604.0 + ], + "area_px": 124.0 + }, + { + "image_points_px": [ + [ + 727.0, + 628.0 + ], + [ + 734.0, + 623.0 + ], + [ + 760.0, + 624.0 + ], + [ + 753.0, + 630.0 + ] + ], + "center_px": [ + 743.5, + 626.25 + ], + "area_px": 153.5 + }, + { + "image_points_px": [ + [ + 294.0, + 593.0 + ], + [ + 307.0, + 588.0 + ], + [ + 328.0, + 589.0 + ], + [ + 315.0, + 594.0 + ] + ], + "center_px": [ + 311.0, + 591.0 + ], + "area_px": 118.0 + }, + { + "image_points_px": [ + [ + 423.0, + 598.0 + ], + [ + 433.0, + 594.0 + ], + [ + 457.0, + 595.0 + ], + [ + 448.0, + 599.0 + ] + ], + "center_px": [ + 440.25, + 596.5 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 340.0, + 597.0 + ], + [ + 350.0, + 593.0 + ], + [ + 374.0, + 594.0 + ], + [ + 364.0, + 598.0 + ] + ], + "center_px": [ + 357.0, + 595.5 + ], + "area_px": 106.0 + }, + { + "image_points_px": [ + [ + 710.0, + 619.0 + ], + [ + 718.0, + 613.0 + ], + [ + 743.0, + 615.0 + ], + [ + 735.0, + 620.0 + ] + ], + "center_px": [ + 726.5, + 616.75 + ], + "area_px": 149.5 + }, + { + "image_points_px": [ + [ + 658.0, + 614.0 + ], + [ + 666.0, + 608.0 + ], + [ + 691.0, + 610.0 + ], + [ + 683.0, + 615.0 + ] + ], + "center_px": [ + 674.5, + 611.75 + ], + "area_px": 149.5 + }, + { + "image_points_px": [ + [ + 674.0, + 623.0 + ], + [ + 683.0, + 617.0 + ], + [ + 707.0, + 619.0 + ], + [ + 700.0, + 624.0 + ] + ], + "center_px": [ + 691.0, + 620.75 + ], + "area_px": 149.5 + }, + { + "image_points_px": [ + [ + 303.0, + 601.0 + ], + [ + 313.0, + 597.0 + ], + [ + 337.0, + 598.0 + ], + [ + 326.0, + 602.0 + ] + ], + "center_px": [ + 319.75, + 599.5 + ], + "area_px": 104.5 + }, + { + "image_points_px": [ + [ + 257.0, + 596.0 + ], + [ + 269.0, + 592.0 + ], + [ + 291.0, + 593.0 + ], + [ + 281.0, + 597.0 + ] + ], + "center_px": [ + 274.5, + 594.5 + ], + "area_px": 103.0 + }, + { + "image_points_px": [ + [ + 249.0, + 588.0 + ], + [ + 261.0, + 584.0 + ], + [ + 283.0, + 585.0 + ], + [ + 271.0, + 589.0 + ] + ], + "center_px": [ + 266.0, + 586.5 + ], + "area_px": 100.0 + }, + { + "image_points_px": [ + [ + 168.0, + 587.0 + ], + [ + 181.0, + 583.0 + ], + [ + 202.0, + 584.0 + ], + [ + 190.0, + 588.0 + ] + ], + "center_px": [ + 185.25, + 585.5 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 241.0, + 580.0 + ], + [ + 254.0, + 576.0 + ], + [ + 275.0, + 577.0 + ], + [ + 263.0, + 581.0 + ] + ], + "center_px": [ + 258.25, + 578.5 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 198.0, + 576.0 + ], + [ + 210.0, + 572.0 + ], + [ + 232.0, + 573.0 + ], + [ + 219.0, + 577.0 + ] + ], + "center_px": [ + 214.75, + 574.5 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 1244.0, + 639.0 + ], + [ + 1245.0, + 633.0 + ], + [ + 1273.0, + 635.0 + ], + [ + 1274.0, + 640.0 + ] + ], + "center_px": [ + 1259.0, + 636.75 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 162.0, + 579.0 + ], + [ + 176.0, + 575.0 + ], + [ + 196.0, + 576.0 + ], + [ + 184.0, + 580.0 + ] + ], + "center_px": [ + 179.5, + 577.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 124.0, + 583.0 + ], + [ + 137.0, + 579.0 + ], + [ + 158.0, + 580.0 + ], + [ + 145.0, + 584.0 + ] + ], + "center_px": [ + 141.0, + 581.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 119.0, + 575.0 + ], + [ + 132.0, + 571.0 + ], + [ + 153.0, + 572.0 + ], + [ + 140.0, + 576.0 + ] + ], + "center_px": [ + 136.0, + 573.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 78.0, + 571.0 + ], + [ + 91.0, + 567.0 + ], + [ + 112.0, + 568.0 + ], + [ + 98.0, + 572.0 + ] + ], + "center_px": [ + 94.75, + 569.5 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 37.0, + 567.0 + ], + [ + 51.0, + 563.0 + ], + [ + 71.0, + 564.0 + ], + [ + 56.0, + 568.0 + ] + ], + "center_px": [ + 53.75, + 565.5 + ], + "area_px": 92.5 + }, + { + "image_points_px": [ + [ + 622.0, + 618.0 + ], + [ + 630.0, + 613.0 + ], + [ + 655.0, + 614.0 + ], + [ + 647.0, + 619.0 + ] + ], + "center_px": [ + 638.5, + 616.0 + ], + "area_px": 133.0 + }, + { + "image_points_px": [ + [ + 763.0, + 624.0 + ], + [ + 769.0, + 619.0 + ], + [ + 795.0, + 620.0 + ], + [ + 789.0, + 626.0 + ] + ], + "center_px": [ + 779.0, + 622.25 + ], + "area_px": 152.0 + }, + { + "image_points_px": [ + [ + 556.0, + 604.0 + ], + [ + 565.0, + 599.0 + ], + [ + 589.0, + 601.0 + ], + [ + 580.0, + 605.0 + ] + ], + "center_px": [ + 572.5, + 602.25 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 1242.0, + 649.0 + ], + [ + 1271.0, + 650.0 + ], + [ + 1272.0, + 655.0 + ], + [ + 1243.0, + 654.0 + ] + ], + "center_px": [ + 1257.0, + 652.0 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 507.0, + 599.0 + ], + [ + 518.0, + 594.0 + ], + [ + 540.0, + 596.0 + ], + [ + 532.0, + 600.0 + ] + ], + "center_px": [ + 524.25, + 597.25 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 387.0, + 602.0 + ], + [ + 398.0, + 597.0 + ], + [ + 420.0, + 599.0 + ], + [ + 410.0, + 603.0 + ] + ], + "center_px": [ + 403.75, + 600.25 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 471.0, + 603.0 + ], + [ + 484.0, + 598.0 + ], + [ + 504.0, + 600.0 + ], + [ + 495.0, + 604.0 + ] + ], + "center_px": [ + 488.5, + 601.25 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 412.0, + 590.0 + ], + [ + 424.0, + 585.0 + ], + [ + 445.0, + 587.0 + ], + [ + 435.0, + 591.0 + ] + ], + "center_px": [ + 429.0, + 588.25 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 377.0, + 593.0 + ], + [ + 387.0, + 589.0 + ], + [ + 410.0, + 590.0 + ], + [ + 398.0, + 595.0 + ] + ], + "center_px": [ + 393.0, + 591.75 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 1215.0, + 628.0 + ], + [ + 1217.0, + 623.0 + ], + [ + 1245.0, + 626.0 + ], + [ + 1244.0, + 631.0 + ] + ], + "center_px": [ + 1230.25, + 627.0 + ], + "area_px": 147.0 + }, + { + "image_points_px": [ + [ + 212.0, + 592.0 + ], + [ + 222.0, + 588.0 + ], + [ + 245.0, + 588.0 + ], + [ + 233.0, + 593.0 + ] + ], + "center_px": [ + 228.0, + 590.25 + ], + "area_px": 104.5 + }, + { + "image_points_px": [ + [ + 745.0, + 615.0 + ], + [ + 751.0, + 610.0 + ], + [ + 777.0, + 611.0 + ], + [ + 771.0, + 616.0 + ] + ], + "center_px": [ + 761.0, + 613.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 331.0, + 589.0 + ], + [ + 340.0, + 585.0 + ], + [ + 364.0, + 586.0 + ], + [ + 352.0, + 590.0 + ] + ], + "center_px": [ + 346.75, + 587.5 + ], + "area_px": 100.5 + }, + { + "image_points_px": [ + [ + 321.0, + 581.0 + ], + [ + 332.0, + 577.0 + ], + [ + 354.0, + 578.0 + ], + [ + 344.0, + 582.0 + ] + ], + "center_px": [ + 337.75, + 579.5 + ], + "area_px": 100.5 + }, + { + "image_points_px": [ + [ + 156.0, + 572.0 + ], + [ + 167.0, + 568.0 + ], + [ + 189.0, + 569.0 + ], + [ + 176.0, + 573.0 + ] + ], + "center_px": [ + 172.0, + 570.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 693.0, + 610.0 + ], + [ + 700.0, + 605.0 + ], + [ + 725.0, + 606.0 + ], + [ + 718.0, + 611.0 + ] + ], + "center_px": [ + 709.0, + 608.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 727.0, + 606.0 + ], + [ + 734.0, + 601.0 + ], + [ + 759.0, + 602.0 + ], + [ + 752.0, + 607.0 + ] + ], + "center_px": [ + 743.0, + 604.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 227.0, + 565.0 + ], + [ + 241.0, + 561.0 + ], + [ + 260.0, + 562.0 + ], + [ + 247.0, + 566.0 + ] + ], + "center_px": [ + 243.75, + 563.5 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 83.0, + 578.0 + ], + [ + 93.0, + 575.0 + ], + [ + 116.0, + 575.0 + ], + [ + 105.0, + 579.0 + ] + ], + "center_px": [ + 99.25, + 576.75 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 607.0, + 609.0 + ], + [ + 614.0, + 604.0 + ], + [ + 639.0, + 605.0 + ], + [ + 631.0, + 610.0 + ] + ], + "center_px": [ + 622.75, + 607.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 641.0, + 605.0 + ], + [ + 649.0, + 600.0 + ], + [ + 673.0, + 601.0 + ], + [ + 666.0, + 606.0 + ] + ], + "center_px": [ + 657.25, + 603.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 74.0, + 563.0 + ], + [ + 87.0, + 560.0 + ], + [ + 107.0, + 561.0 + ], + [ + 95.0, + 564.0 + ] + ], + "center_px": [ + 90.75, + 562.0 + ], + "area_px": 74.0 + }, + { + "image_points_px": [ + [ + 676.0, + 601.0 + ], + [ + 684.0, + 596.0 + ], + [ + 708.0, + 598.0 + ], + [ + 701.0, + 602.0 + ] + ], + "center_px": [ + 692.25, + 599.25 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 592.0, + 600.0 + ], + [ + 601.0, + 595.0 + ], + [ + 624.0, + 597.0 + ], + [ + 616.0, + 601.0 + ] + ], + "center_px": [ + 608.25, + 598.25 + ], + "area_px": 118.5 + }, + { + "image_points_px": [ + [ + 626.0, + 596.0 + ], + [ + 634.0, + 592.0 + ], + [ + 658.0, + 593.0 + ], + [ + 649.0, + 598.0 + ] + ], + "center_px": [ + 641.75, + 594.75 + ], + "area_px": 118.5 + }, + { + "image_points_px": [ + [ + 543.0, + 595.0 + ], + [ + 551.0, + 591.0 + ], + [ + 575.0, + 592.0 + ], + [ + 564.0, + 597.0 + ] + ], + "center_px": [ + 558.25, + 593.75 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 495.0, + 591.0 + ], + [ + 505.0, + 586.0 + ], + [ + 527.0, + 588.0 + ], + [ + 518.0, + 592.0 + ] + ], + "center_px": [ + 511.25, + 589.25 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 460.0, + 594.0 + ], + [ + 469.0, + 590.0 + ], + [ + 492.0, + 591.0 + ], + [ + 481.0, + 596.0 + ] + ], + "center_px": [ + 475.5, + 592.75 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 864.0, + 643.0 + ], + [ + 858.0, + 650.0 + ], + [ + 833.0, + 647.0 + ], + [ + 846.0, + 643.0 + ] + ], + "center_px": [ + 850.25, + 645.75 + ], + "area_px": 132.5 + }, + { + "image_points_px": [ + [ + 780.0, + 611.0 + ], + [ + 785.0, + 606.0 + ], + [ + 811.0, + 607.0 + ], + [ + 805.0, + 612.0 + ] + ], + "center_px": [ + 795.25, + 609.0 + ], + "area_px": 133.0 + }, + { + "image_points_px": [ + [ + 529.0, + 587.0 + ], + [ + 538.0, + 583.0 + ], + [ + 561.0, + 584.0 + ], + [ + 553.0, + 588.0 + ] + ], + "center_px": [ + 545.25, + 585.5 + ], + "area_px": 102.5 + }, + { + "image_points_px": [ + [ + 845.0, + 665.0 + ], + [ + 851.0, + 659.0 + ], + [ + 875.0, + 660.0 + ], + [ + 869.0, + 667.0 + ] + ], + "center_px": [ + 860.0, + 662.75 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 448.0, + 586.0 + ], + [ + 458.0, + 582.0 + ], + [ + 480.0, + 583.0 + ], + [ + 471.0, + 587.0 + ] + ], + "center_px": [ + 464.25, + 584.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 367.0, + 585.0 + ], + [ + 377.0, + 581.0 + ], + [ + 399.0, + 582.0 + ], + [ + 390.0, + 586.0 + ] + ], + "center_px": [ + 383.25, + 583.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 470.0, + 575.0 + ], + [ + 480.0, + 571.0 + ], + [ + 502.0, + 572.0 + ], + [ + 493.0, + 576.0 + ] + ], + "center_px": [ + 486.25, + 573.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 402.0, + 582.0 + ], + [ + 411.0, + 578.0 + ], + [ + 434.0, + 579.0 + ], + [ + 424.0, + 583.0 + ] + ], + "center_px": [ + 417.75, + 580.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 389.0, + 406.0 + ], + [ + 393.0, + 421.0 + ], + [ + 389.0, + 438.0 + ], + [ + 387.0, + 435.0 + ] + ], + "center_px": [ + 389.5, + 425.0 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 794.0, + 598.0 + ], + [ + 801.0, + 593.0 + ], + [ + 825.0, + 595.0 + ], + [ + 819.0, + 600.0 + ] + ], + "center_px": [ + 809.75, + 596.5 + ], + "area_px": 135.5 + }, + { + "image_points_px": [ + [ + 206.0, + 584.0 + ], + [ + 219.0, + 579.0 + ], + [ + 238.0, + 581.0 + ], + [ + 221.0, + 585.0 + ] + ], + "center_px": [ + 221.0, + 582.25 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 304.0, + 566.0 + ], + [ + 315.0, + 562.0 + ], + [ + 336.0, + 563.0 + ], + [ + 324.0, + 567.0 + ] + ], + "center_px": [ + 319.75, + 564.5 + ], + "area_px": 93.5 + }, + { + "image_points_px": [ + [ + 270.0, + 569.0 + ], + [ + 282.0, + 565.0 + ], + [ + 302.0, + 566.0 + ], + [ + 291.0, + 570.0 + ] + ], + "center_px": [ + 286.25, + 567.5 + ], + "area_px": 93.5 + }, + { + "image_points_px": [ + [ + 286.0, + 584.0 + ], + [ + 295.0, + 581.0 + ], + [ + 318.0, + 581.0 + ], + [ + 309.0, + 585.0 + ] + ], + "center_px": [ + 302.0, + 582.75 + ], + "area_px": 85.0 + }, + { + "image_points_px": [ + [ + 262.0, + 562.0 + ], + [ + 274.0, + 558.0 + ], + [ + 294.0, + 559.0 + ], + [ + 282.0, + 563.0 + ] + ], + "center_px": [ + 278.0, + 560.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 278.0, + 577.0 + ], + [ + 288.0, + 573.0 + ], + [ + 310.0, + 574.0 + ], + [ + 294.0, + 578.0 + ] + ], + "center_px": [ + 292.5, + 575.5 + ], + "area_px": 89.0 + }, + { + "image_points_px": [ + [ + 192.0, + 568.0 + ], + [ + 202.0, + 565.0 + ], + [ + 224.0, + 565.0 + ], + [ + 214.0, + 569.0 + ] + ], + "center_px": [ + 208.0, + 566.75 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 115.0, + 567.0 + ], + [ + 127.0, + 564.0 + ], + [ + 147.0, + 565.0 + ], + [ + 133.0, + 569.0 + ] + ], + "center_px": [ + 130.5, + 566.25 + ], + "area_px": 86.0 + }, + { + "image_points_px": [ + [ + 761.0, + 602.0 + ], + [ + 768.0, + 597.0 + ], + [ + 792.0, + 599.0 + ], + [ + 786.0, + 603.0 + ] + ], + "center_px": [ + 776.75, + 600.25 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 710.0, + 597.0 + ], + [ + 716.0, + 593.0 + ], + [ + 741.0, + 594.0 + ], + [ + 734.0, + 599.0 + ] + ], + "center_px": [ + 725.25, + 595.75 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 612.0, + 588.0 + ], + [ + 619.0, + 584.0 + ], + [ + 643.0, + 585.0 + ], + [ + 635.0, + 589.0 + ] + ], + "center_px": [ + 627.25, + 586.5 + ], + "area_px": 101.5 + }, + { + "image_points_px": [ + [ + 483.0, + 583.0 + ], + [ + 494.0, + 578.0 + ], + [ + 514.0, + 580.0 + ], + [ + 504.0, + 584.0 + ] + ], + "center_px": [ + 498.75, + 581.25 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 382.0, + 567.0 + ], + [ + 393.0, + 562.0 + ], + [ + 413.0, + 564.0 + ], + [ + 402.0, + 568.0 + ] + ], + "center_px": [ + 397.5, + 565.25 + ], + "area_px": 106.5 + }, + { + "image_points_px": [ + [ + 517.0, + 579.0 + ], + [ + 526.0, + 575.0 + ], + [ + 548.0, + 576.0 + ], + [ + 540.0, + 580.0 + ] + ], + "center_px": [ + 532.75, + 577.5 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 437.0, + 578.0 + ], + [ + 448.0, + 574.0 + ], + [ + 468.0, + 575.0 + ], + [ + 460.0, + 579.0 + ] + ], + "center_px": [ + 453.25, + 576.5 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 426.0, + 571.0 + ], + [ + 436.0, + 567.0 + ], + [ + 457.0, + 568.0 + ], + [ + 448.0, + 572.0 + ] + ], + "center_px": [ + 441.75, + 569.5 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 392.0, + 574.0 + ], + [ + 403.0, + 570.0 + ], + [ + 423.0, + 571.0 + ], + [ + 414.0, + 575.0 + ] + ], + "center_px": [ + 408.0, + 572.5 + ], + "area_px": 94.0 + }, + { + "image_points_px": [ + [ + 313.0, + 573.0 + ], + [ + 324.0, + 569.0 + ], + [ + 344.0, + 570.0 + ], + [ + 335.0, + 574.0 + ] + ], + "center_px": [ + 329.0, + 571.5 + ], + "area_px": 94.0 + }, + { + "image_points_px": [ + [ + 348.0, + 570.0 + ], + [ + 359.0, + 566.0 + ], + [ + 379.0, + 567.0 + ], + [ + 369.0, + 571.0 + ] + ], + "center_px": [ + 363.75, + 568.5 + ], + "area_px": 92.5 + }, + { + "image_points_px": [ + [ + 777.0, + 214.0 + ], + [ + 805.0, + 224.0 + ], + [ + 800.0, + 228.0 + ], + [ + 780.0, + 218.0 + ] + ], + "center_px": [ + 790.5, + 221.0 + ], + "area_px": 106.0 + }, + { + "image_points_px": [ + [ + 297.0, + 559.0 + ], + [ + 307.0, + 555.0 + ], + [ + 328.0, + 556.0 + ], + [ + 316.0, + 560.0 + ] + ], + "center_px": [ + 312.0, + 557.5 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 1221.0, + 602.0 + ], + [ + 1222.0, + 598.0 + ], + [ + 1249.0, + 600.0 + ], + [ + 1248.0, + 605.0 + ] + ], + "center_px": [ + 1235.0, + 601.25 + ], + "area_px": 124.0 + }, + { + "image_points_px": [ + [ + 339.0, + 563.0 + ], + [ + 350.0, + 559.0 + ], + [ + 370.0, + 560.0 + ], + [ + 358.0, + 564.0 + ] + ], + "center_px": [ + 354.25, + 561.5 + ], + "area_px": 89.5 + }, + { + "image_points_px": [ + [ + 221.0, + 558.0 + ], + [ + 233.0, + 554.0 + ], + [ + 252.0, + 555.0 + ], + [ + 241.0, + 559.0 + ] + ], + "center_px": [ + 236.75, + 556.5 + ], + "area_px": 89.5 + }, + { + "image_points_px": [ + [ + 255.0, + 555.0 + ], + [ + 266.0, + 551.0 + ], + [ + 286.0, + 552.0 + ], + [ + 274.0, + 556.0 + ] + ], + "center_px": [ + 270.25, + 553.5 + ], + "area_px": 89.5 + }, + { + "image_points_px": [ + [ + 186.0, + 561.0 + ], + [ + 199.0, + 557.0 + ], + [ + 217.0, + 558.0 + ], + [ + 206.0, + 562.0 + ] + ], + "center_px": [ + 202.0, + 559.5 + ], + "area_px": 88.0 + }, + { + "image_points_px": [ + [ + 67.0, + 550.0 + ], + [ + 79.0, + 546.0 + ], + [ + 98.0, + 547.0 + ], + [ + 84.0, + 551.0 + ] + ], + "center_px": [ + 82.0, + 548.5 + ], + "area_px": 85.0 + }, + { + "image_points_px": [ + [ + 235.0, + 572.0 + ], + [ + 244.0, + 569.0 + ], + [ + 266.0, + 570.0 + ], + [ + 254.0, + 574.0 + ] + ], + "center_px": [ + 249.75, + 571.25 + ], + "area_px": 87.5 + }, + { + "image_points_px": [ + [ + 145.0, + 557.0 + ], + [ + 156.0, + 554.0 + ], + [ + 176.0, + 554.0 + ], + [ + 165.0, + 558.0 + ] + ], + "center_px": [ + 160.5, + 555.75 + ], + "area_px": 75.5 + }, + { + "image_points_px": [ + [ + 744.0, + 593.0 + ], + [ + 750.0, + 589.0 + ], + [ + 774.0, + 590.0 + ], + [ + 768.0, + 595.0 + ] + ], + "center_px": [ + 759.0, + 591.75 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 578.0, + 592.0 + ], + [ + 586.0, + 587.0 + ], + [ + 608.0, + 588.0 + ], + [ + 601.0, + 593.0 + ] + ], + "center_px": [ + 593.25, + 590.0 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 151.0, + 564.0 + ], + [ + 161.0, + 561.0 + ], + [ + 182.0, + 562.0 + ], + [ + 172.0, + 565.0 + ] + ], + "center_px": [ + 166.5, + 563.0 + ], + "area_px": 73.0 + }, + { + "image_points_px": [ + [ + 101.0, + 547.0 + ], + [ + 110.0, + 544.0 + ], + [ + 132.0, + 544.0 + ], + [ + 122.0, + 547.0 + ] + ], + "center_px": [ + 116.25, + 545.5 + ], + "area_px": 64.5 + }, + { + "image_points_px": [ + [ + 727.0, + 585.0 + ], + [ + 733.0, + 581.0 + ], + [ + 757.0, + 582.0 + ], + [ + 750.0, + 587.0 + ] + ], + "center_px": [ + 741.75, + 583.75 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 110.0, + 560.0 + ], + [ + 121.0, + 557.0 + ], + [ + 141.0, + 558.0 + ], + [ + 130.0, + 561.0 + ] + ], + "center_px": [ + 125.5, + 559.0 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 106.0, + 553.0 + ], + [ + 117.0, + 550.0 + ], + [ + 137.0, + 551.0 + ], + [ + 126.0, + 554.0 + ] + ], + "center_px": [ + 121.5, + 552.0 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 71.0, + 556.0 + ], + [ + 83.0, + 553.0 + ], + [ + 102.0, + 554.0 + ], + [ + 91.0, + 557.0 + ] + ], + "center_px": [ + 86.75, + 555.0 + ], + "area_px": 70.0 + }, + { + "image_points_px": [ + [ + 62.0, + 543.0 + ], + [ + 74.0, + 540.0 + ], + [ + 93.0, + 541.0 + ], + [ + 81.0, + 544.0 + ] + ], + "center_px": [ + 77.5, + 542.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 661.0, + 592.0 + ], + [ + 668.0, + 588.0 + ], + [ + 691.0, + 589.0 + ], + [ + 684.0, + 594.0 + ] + ], + "center_px": [ + 676.0, + 590.75 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 694.0, + 589.0 + ], + [ + 702.0, + 584.0 + ], + [ + 724.0, + 586.0 + ], + [ + 718.0, + 590.0 + ] + ], + "center_px": [ + 709.5, + 587.25 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 645.0, + 584.0 + ], + [ + 653.0, + 580.0 + ], + [ + 675.0, + 581.0 + ], + [ + 668.0, + 586.0 + ] + ], + "center_px": [ + 660.25, + 582.75 + ], + "area_px": 112.5 + }, + { + "image_points_px": [ + [ + 1219.0, + 611.0 + ], + [ + 1247.0, + 614.0 + ], + [ + 1246.0, + 617.0 + ], + [ + 1219.0, + 615.0 + ] + ], + "center_px": [ + 1232.75, + 614.25 + ], + "area_px": 97.5 + }, + { + "image_points_px": [ + [ + 598.0, + 580.0 + ], + [ + 605.0, + 576.0 + ], + [ + 628.0, + 577.0 + ], + [ + 621.0, + 581.0 + ] + ], + "center_px": [ + 613.0, + 578.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 551.0, + 576.0 + ], + [ + 558.0, + 572.0 + ], + [ + 581.0, + 573.0 + ], + [ + 573.0, + 577.0 + ] + ], + "center_px": [ + 565.75, + 574.5 + ], + "area_px": 97.5 + }, + { + "image_points_px": [ + [ + 616.0, + 569.0 + ], + [ + 624.0, + 565.0 + ], + [ + 646.0, + 566.0 + ], + [ + 639.0, + 570.0 + ] + ], + "center_px": [ + 631.25, + 567.5 + ], + "area_px": 97.5 + }, + { + "image_points_px": [ + [ + 564.0, + 583.0 + ], + [ + 573.0, + 579.0 + ], + [ + 594.0, + 581.0 + ], + [ + 586.0, + 585.0 + ] + ], + "center_px": [ + 579.25, + 582.0 + ], + "area_px": 103.0 + }, + { + "image_points_px": [ + [ + 460.0, + 567.0 + ], + [ + 470.0, + 563.0 + ], + [ + 490.0, + 565.0 + ], + [ + 481.0, + 569.0 + ] + ], + "center_px": [ + 475.25, + 566.0 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 331.0, + 556.0 + ], + [ + 340.0, + 552.0 + ], + [ + 361.0, + 553.0 + ], + [ + 350.0, + 557.0 + ] + ], + "center_px": [ + 345.5, + 554.5 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 809.0, + 586.0 + ], + [ + 814.0, + 582.0 + ], + [ + 838.0, + 583.0 + ], + [ + 833.0, + 588.0 + ] + ], + "center_px": [ + 823.5, + 584.75 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 358.0, + 577.0 + ], + [ + 366.0, + 574.0 + ], + [ + 388.0, + 575.0 + ], + [ + 378.0, + 579.0 + ] + ], + "center_px": [ + 372.5, + 576.25 + ], + "area_px": 87.0 + }, + { + "image_points_px": [ + [ + 289.0, + 552.0 + ], + [ + 301.0, + 548.0 + ], + [ + 319.0, + 549.0 + ], + [ + 308.0, + 553.0 + ] + ], + "center_px": [ + 304.25, + 550.5 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 891.0, + 587.0 + ], + [ + 895.0, + 583.0 + ], + [ + 920.0, + 584.0 + ], + [ + 916.0, + 588.0 + ] + ], + "center_px": [ + 905.5, + 585.5 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 777.0, + 590.0 + ], + [ + 783.0, + 585.0 + ], + [ + 806.0, + 587.0 + ], + [ + 801.0, + 591.0 + ] + ], + "center_px": [ + 791.75, + 588.25 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 214.0, + 551.0 + ], + [ + 224.0, + 548.0 + ], + [ + 244.0, + 548.0 + ], + [ + 234.0, + 552.0 + ] + ], + "center_px": [ + 229.0, + 549.75 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 180.0, + 554.0 + ], + [ + 193.0, + 550.0 + ], + [ + 210.0, + 552.0 + ], + [ + 200.0, + 555.0 + ] + ], + "center_px": [ + 195.75, + 552.75 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 354.0, + 502.0 + ], + [ + 356.0, + 498.0 + ], + [ + 362.0, + 496.0 + ], + [ + 383.0, + 498.0 + ] + ], + "center_px": [ + 363.75, + 498.5 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 416.0, + 563.0 + ], + [ + 424.0, + 560.0 + ], + [ + 446.0, + 561.0 + ], + [ + 438.0, + 564.0 + ] + ], + "center_px": [ + 431.0, + 562.0 + ], + "area_px": 74.0 + }, + { + "image_points_px": [ + [ + 760.0, + 582.0 + ], + [ + 766.0, + 577.0 + ], + [ + 789.0, + 579.0 + ], + [ + 783.0, + 583.0 + ] + ], + "center_px": [ + 774.5, + 580.25 + ], + "area_px": 112.5 + }, + { + "image_points_px": [ + [ + 791.0, + 578.0 + ], + [ + 797.0, + 574.0 + ], + [ + 820.0, + 575.0 + ], + [ + 814.0, + 580.0 + ] + ], + "center_px": [ + 805.5, + 576.75 + ], + "area_px": 112.5 + }, + { + "image_points_px": [ + [ + 373.0, + 559.0 + ], + [ + 382.0, + 556.0 + ], + [ + 403.0, + 557.0 + ], + [ + 395.0, + 560.0 + ] + ], + "center_px": [ + 388.25, + 558.0 + ], + "area_px": 73.0 + }, + { + "image_points_px": [ + [ + 248.0, + 548.0 + ], + [ + 257.0, + 545.0 + ], + [ + 278.0, + 546.0 + ], + [ + 268.0, + 549.0 + ] + ], + "center_px": [ + 262.75, + 547.0 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 59.0, + 537.0 + ], + [ + 68.0, + 534.0 + ], + [ + 89.0, + 534.0 + ], + [ + 79.0, + 537.0 + ] + ], + "center_px": [ + 73.75, + 535.5 + ], + "area_px": 61.5 + }, + { + "image_points_px": [ + [ + 175.0, + 547.0 + ], + [ + 186.0, + 544.0 + ], + [ + 205.0, + 545.0 + ], + [ + 195.0, + 548.0 + ] + ], + "center_px": [ + 190.25, + 546.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 141.0, + 550.0 + ], + [ + 152.0, + 547.0 + ], + [ + 171.0, + 548.0 + ], + [ + 160.0, + 551.0 + ] + ], + "center_px": [ + 156.0, + 549.0 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 631.0, + 577.0 + ], + [ + 639.0, + 572.0 + ], + [ + 660.0, + 574.0 + ], + [ + 653.0, + 578.0 + ] + ], + "center_px": [ + 645.75, + 575.25 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 743.0, + 574.0 + ], + [ + 749.0, + 570.0 + ], + [ + 772.0, + 571.0 + ], + [ + 766.0, + 575.0 + ] + ], + "center_px": [ + 757.5, + 572.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 695.0, + 570.0 + ], + [ + 701.0, + 566.0 + ], + [ + 724.0, + 567.0 + ], + [ + 718.0, + 571.0 + ] + ], + "center_px": [ + 709.5, + 568.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 711.0, + 577.0 + ], + [ + 718.0, + 573.0 + ], + [ + 740.0, + 575.0 + ], + [ + 733.0, + 579.0 + ] + ], + "center_px": [ + 725.5, + 576.0 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 538.0, + 568.0 + ], + [ + 547.0, + 564.0 + ], + [ + 567.0, + 565.0 + ], + [ + 561.0, + 569.0 + ] + ], + "center_px": [ + 553.25, + 566.5 + ], + "area_px": 93.5 + }, + { + "image_points_px": [ + [ + 571.0, + 565.0 + ], + [ + 579.0, + 561.0 + ], + [ + 600.0, + 562.0 + ], + [ + 593.0, + 566.0 + ] + ], + "center_px": [ + 585.75, + 563.5 + ], + "area_px": 93.5 + }, + { + "image_points_px": [ + [ + 603.0, + 562.0 + ], + [ + 610.0, + 558.0 + ], + [ + 632.0, + 559.0 + ], + [ + 624.0, + 563.0 + ] + ], + "center_px": [ + 617.25, + 560.5 + ], + "area_px": 93.5 + }, + { + "image_points_px": [ + [ + 493.0, + 564.0 + ], + [ + 503.0, + 560.0 + ], + [ + 522.0, + 561.0 + ], + [ + 516.0, + 565.0 + ] + ], + "center_px": [ + 508.5, + 562.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 584.0, + 572.0 + ], + [ + 592.0, + 568.0 + ], + [ + 613.0, + 570.0 + ], + [ + 604.0, + 574.0 + ] + ], + "center_px": [ + 598.25, + 571.0 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 506.0, + 572.0 + ], + [ + 513.0, + 568.0 + ], + [ + 535.0, + 569.0 + ], + [ + 526.0, + 573.0 + ] + ], + "center_px": [ + 520.0, + 570.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 558.0, + 558.0 + ], + [ + 566.0, + 554.0 + ], + [ + 587.0, + 555.0 + ], + [ + 579.0, + 559.0 + ] + ], + "center_px": [ + 572.5, + 556.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 872.0, + 579.0 + ], + [ + 877.0, + 575.0 + ], + [ + 900.0, + 576.0 + ], + [ + 896.0, + 581.0 + ] + ], + "center_px": [ + 886.25, + 577.75 + ], + "area_px": 112.5 + }, + { + "image_points_px": [ + [ + 526.0, + 561.0 + ], + [ + 535.0, + 557.0 + ], + [ + 555.0, + 558.0 + ], + [ + 547.0, + 562.0 + ] + ], + "center_px": [ + 540.75, + 559.5 + ], + "area_px": 90.5 + }, + { + "image_points_px": [ + [ + 322.0, + 549.0 + ], + [ + 333.0, + 545.0 + ], + [ + 351.0, + 546.0 + ], + [ + 341.0, + 550.0 + ] + ], + "center_px": [ + 336.75, + 547.5 + ], + "area_px": 84.5 + }, + { + "image_points_px": [ + [ + 482.0, + 557.0 + ], + [ + 491.0, + 553.0 + ], + [ + 511.0, + 555.0 + ], + [ + 503.0, + 558.0 + ] + ], + "center_px": [ + 496.75, + 555.75 + ], + "area_px": 84.5 + }, + { + "image_points_px": [ + [ + 449.0, + 560.0 + ], + [ + 459.0, + 556.0 + ], + [ + 478.0, + 558.0 + ], + [ + 471.0, + 561.0 + ] + ], + "center_px": [ + 464.25, + 558.75 + ], + "area_px": 84.5 + }, + { + "image_points_px": [ + [ + 923.0, + 583.0 + ], + [ + 927.0, + 579.0 + ], + [ + 951.0, + 581.0 + ], + [ + 947.0, + 585.0 + ] + ], + "center_px": [ + 937.0, + 582.0 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 136.0, + 544.0 + ], + [ + 147.0, + 540.0 + ], + [ + 165.0, + 541.0 + ], + [ + 154.0, + 545.0 + ] + ], + "center_px": [ + 150.5, + 542.5 + ], + "area_px": 83.0 + }, + { + "image_points_px": [ + [ + 397.0, + 549.0 + ], + [ + 405.0, + 546.0 + ], + [ + 426.0, + 547.0 + ], + [ + 416.0, + 551.0 + ] + ], + "center_px": [ + 411.0, + 548.25 + ], + "area_px": 83.5 + }, + { + "image_points_px": [ + [ + 364.0, + 553.0 + ], + [ + 374.0, + 549.0 + ], + [ + 393.0, + 550.0 + ], + [ + 386.0, + 553.0 + ] + ], + "center_px": [ + 379.25, + 551.25 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 169.0, + 541.0 + ], + [ + 181.0, + 537.0 + ], + [ + 198.0, + 538.0 + ], + [ + 187.0, + 542.0 + ] + ], + "center_px": [ + 183.75, + 539.5 + ], + "area_px": 81.5 + }, + { + "image_points_px": [ + [ + 1224.0, + 589.0 + ], + [ + 1225.0, + 586.0 + ], + [ + 1251.0, + 588.0 + ], + [ + 1251.0, + 591.0 + ] + ], + "center_px": [ + 1237.75, + 588.5 + ], + "area_px": 80.5 + }, + { + "image_points_px": [ + [ + 841.0, + 582.0 + ], + [ + 846.0, + 578.0 + ], + [ + 869.0, + 580.0 + ], + [ + 865.0, + 584.0 + ] + ], + "center_px": [ + 855.25, + 581.0 + ], + "area_px": 103.0 + }, + { + "image_points_px": [ + [ + 406.0, + 556.0 + ], + [ + 414.0, + 553.0 + ], + [ + 435.0, + 554.0 + ], + [ + 428.0, + 557.0 + ] + ], + "center_px": [ + 420.75, + 555.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 439.0, + 553.0 + ], + [ + 447.0, + 550.0 + ], + [ + 468.0, + 551.0 + ], + [ + 460.0, + 554.0 + ] + ], + "center_px": [ + 453.5, + 552.0 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 281.0, + 545.0 + ], + [ + 291.0, + 542.0 + ], + [ + 310.0, + 543.0 + ], + [ + 301.0, + 546.0 + ] + ], + "center_px": [ + 295.75, + 544.0 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 209.0, + 544.0 + ], + [ + 219.0, + 541.0 + ], + [ + 238.0, + 542.0 + ], + [ + 228.0, + 545.0 + ] + ], + "center_px": [ + 223.5, + 543.0 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 202.0, + 538.0 + ], + [ + 212.0, + 535.0 + ], + [ + 231.0, + 536.0 + ], + [ + 221.0, + 539.0 + ] + ], + "center_px": [ + 216.5, + 537.0 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 775.0, + 571.0 + ], + [ + 779.0, + 567.0 + ], + [ + 803.0, + 568.0 + ], + [ + 797.0, + 572.0 + ] + ], + "center_px": [ + 788.5, + 569.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 235.0, + 535.0 + ], + [ + 246.0, + 532.0 + ], + [ + 264.0, + 533.0 + ], + [ + 254.0, + 536.0 + ] + ], + "center_px": [ + 249.75, + 534.0 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 97.0, + 540.0 + ], + [ + 108.0, + 537.0 + ], + [ + 126.0, + 538.0 + ], + [ + 115.0, + 541.0 + ] + ], + "center_px": [ + 111.5, + 539.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 131.0, + 537.0 + ], + [ + 142.0, + 534.0 + ], + [ + 160.0, + 535.0 + ], + [ + 149.0, + 538.0 + ] + ], + "center_px": [ + 145.5, + 536.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 126.0, + 531.0 + ], + [ + 137.0, + 528.0 + ], + [ + 155.0, + 529.0 + ], + [ + 144.0, + 532.0 + ] + ], + "center_px": [ + 140.5, + 530.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 823.0, + 575.0 + ], + [ + 828.0, + 571.0 + ], + [ + 851.0, + 572.0 + ], + [ + 846.0, + 576.0 + ] + ], + "center_px": [ + 837.0, + 573.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 56.0, + 530.0 + ], + [ + 69.0, + 527.0 + ], + [ + 85.0, + 528.0 + ], + [ + 74.0, + 531.0 + ] + ], + "center_px": [ + 71.0, + 529.0 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 805.0, + 567.0 + ], + [ + 811.0, + 563.0 + ], + [ + 833.0, + 565.0 + ], + [ + 828.0, + 569.0 + ] + ], + "center_px": [ + 819.25, + 566.0 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 903.0, + 575.0 + ], + [ + 907.0, + 572.0 + ], + [ + 931.0, + 573.0 + ], + [ + 927.0, + 577.0 + ] + ], + "center_px": [ + 917.0, + 574.25 + ], + "area_px": 90.0 + }, + { + "image_points_px": [ + [ + 649.0, + 566.0 + ], + [ + 655.0, + 562.0 + ], + [ + 677.0, + 563.0 + ], + [ + 671.0, + 567.0 + ] + ], + "center_px": [ + 663.0, + 564.5 + ], + "area_px": 94.0 + }, + { + "image_points_px": [ + [ + 758.0, + 563.0 + ], + [ + 764.0, + 559.0 + ], + [ + 786.0, + 561.0 + ], + [ + 779.0, + 565.0 + ] + ], + "center_px": [ + 771.75, + 562.0 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 635.0, + 559.0 + ], + [ + 641.0, + 555.0 + ], + [ + 663.0, + 556.0 + ], + [ + 656.0, + 560.0 + ] + ], + "center_px": [ + 648.75, + 557.5 + ], + "area_px": 92.5 + }, + { + "image_points_px": [ + [ + 590.0, + 555.0 + ], + [ + 597.0, + 551.0 + ], + [ + 618.0, + 552.0 + ], + [ + 611.0, + 556.0 + ] + ], + "center_px": [ + 604.0, + 553.5 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 727.0, + 566.0 + ], + [ + 732.0, + 563.0 + ], + [ + 755.0, + 564.0 + ], + [ + 749.0, + 568.0 + ] + ], + "center_px": [ + 740.75, + 565.25 + ], + "area_px": 87.0 + }, + { + "image_points_px": [ + [ + 546.0, + 551.0 + ], + [ + 554.0, + 547.0 + ], + [ + 574.0, + 549.0 + ], + [ + 567.0, + 552.0 + ] + ], + "center_px": [ + 560.25, + 549.75 + ], + "area_px": 83.0 + }, + { + "image_points_px": [ + [ + 514.0, + 554.0 + ], + [ + 523.0, + 550.0 + ], + [ + 542.0, + 552.0 + ], + [ + 535.0, + 555.0 + ] + ], + "center_px": [ + 528.5, + 552.75 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 429.0, + 546.0 + ], + [ + 438.0, + 543.0 + ], + [ + 457.0, + 544.0 + ], + [ + 448.0, + 548.0 + ] + ], + "center_px": [ + 443.0, + 545.25 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 355.0, + 546.0 + ], + [ + 363.0, + 543.0 + ], + [ + 383.0, + 543.0 + ], + [ + 374.0, + 547.0 + ] + ], + "center_px": [ + 368.75, + 544.75 + ], + "area_px": 72.5 + }, + { + "image_points_px": [ + [ + 1230.0, + 564.0 + ], + [ + 1255.0, + 566.0 + ], + [ + 1254.0, + 570.0 + ], + [ + 1230.0, + 568.0 + ] + ], + "center_px": [ + 1242.25, + 567.0 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 503.0, + 547.0 + ], + [ + 510.0, + 544.0 + ], + [ + 531.0, + 545.0 + ], + [ + 524.0, + 548.0 + ] + ], + "center_px": [ + 517.0, + 546.0 + ], + "area_px": 70.0 + }, + { + "image_points_px": [ + [ + 534.0, + 544.0 + ], + [ + 541.0, + 541.0 + ], + [ + 562.0, + 542.0 + ], + [ + 555.0, + 545.0 + ] + ], + "center_px": [ + 548.0, + 543.0 + ], + "area_px": 70.0 + }, + { + "image_points_px": [ + [ + 854.0, + 571.0 + ], + [ + 859.0, + 567.0 + ], + [ + 881.0, + 569.0 + ], + [ + 877.0, + 573.0 + ] + ], + "center_px": [ + 867.75, + 570.0 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 387.0, + 543.0 + ], + [ + 395.0, + 540.0 + ], + [ + 415.0, + 541.0 + ], + [ + 407.0, + 544.0 + ] + ], + "center_px": [ + 401.0, + 542.0 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 419.0, + 540.0 + ], + [ + 427.0, + 537.0 + ], + [ + 447.0, + 538.0 + ], + [ + 439.0, + 541.0 + ] + ], + "center_px": [ + 433.0, + 539.0 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 347.0, + 539.0 + ], + [ + 356.0, + 536.0 + ], + [ + 375.0, + 537.0 + ], + [ + 367.0, + 540.0 + ] + ], + "center_px": [ + 361.25, + 538.0 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 338.0, + 533.0 + ], + [ + 347.0, + 530.0 + ], + [ + 366.0, + 531.0 + ], + [ + 357.0, + 534.0 + ] + ], + "center_px": [ + 352.0, + 532.0 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 242.0, + 541.0 + ], + [ + 253.0, + 538.0 + ], + [ + 270.0, + 539.0 + ], + [ + 262.0, + 542.0 + ] + ], + "center_px": [ + 256.75, + 540.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 222.0, + 523.0 + ], + [ + 233.0, + 520.0 + ], + [ + 250.0, + 521.0 + ], + [ + 241.0, + 524.0 + ] + ], + "center_px": [ + 236.5, + 522.0 + ], + "area_px": 64.0 + }, + { + "image_points_px": [ + [ + 229.0, + 529.0 + ], + [ + 239.0, + 526.0 + ], + [ + 257.0, + 527.0 + ], + [ + 247.0, + 530.0 + ] + ], + "center_px": [ + 243.0, + 528.0 + ], + "area_px": 64.0 + }, + { + "image_points_px": [ + [ + 93.0, + 534.0 + ], + [ + 103.0, + 531.0 + ], + [ + 121.0, + 532.0 + ], + [ + 110.0, + 535.0 + ] + ], + "center_px": [ + 106.75, + 533.0 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 89.0, + 528.0 + ], + [ + 99.0, + 525.0 + ], + [ + 117.0, + 526.0 + ], + [ + 105.0, + 529.0 + ] + ], + "center_px": [ + 102.5, + 527.0 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 122.0, + 525.0 + ], + [ + 133.0, + 522.0 + ], + [ + 150.0, + 523.0 + ], + [ + 139.0, + 526.0 + ] + ], + "center_px": [ + 136.0, + 524.0 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 836.0, + 564.0 + ], + [ + 841.0, + 560.0 + ], + [ + 863.0, + 562.0 + ], + [ + 859.0, + 565.0 + ] + ], + "center_px": [ + 849.75, + 562.75 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 788.0, + 560.0 + ], + [ + 794.0, + 556.0 + ], + [ + 815.0, + 558.0 + ], + [ + 811.0, + 561.0 + ] + ], + "center_px": [ + 802.0, + 558.75 + ], + "area_px": 84.5 + }, + { + "image_points_px": [ + [ + 681.0, + 562.0 + ], + [ + 686.0, + 559.0 + ], + [ + 708.0, + 560.0 + ], + [ + 702.0, + 564.0 + ] + ], + "center_px": [ + 694.25, + 561.25 + ], + "area_px": 83.5 + }, + { + "image_points_px": [ + [ + 712.0, + 559.0 + ], + [ + 717.0, + 556.0 + ], + [ + 739.0, + 557.0 + ], + [ + 733.0, + 561.0 + ] + ], + "center_px": [ + 725.25, + 558.25 + ], + "area_px": 83.5 + }, + { + "image_points_px": [ + [ + 666.0, + 555.0 + ], + [ + 672.0, + 552.0 + ], + [ + 693.0, + 553.0 + ], + [ + 687.0, + 557.0 + ] + ], + "center_px": [ + 679.5, + 554.25 + ], + "area_px": 82.5 + }, + { + "image_points_px": [ + [ + 697.0, + 552.0 + ], + [ + 702.0, + 549.0 + ], + [ + 724.0, + 550.0 + ], + [ + 717.0, + 554.0 + ] + ], + "center_px": [ + 710.0, + 551.25 + ], + "area_px": 82.5 + }, + { + "image_points_px": [ + [ + 492.0, + 541.0 + ], + [ + 500.0, + 537.0 + ], + [ + 519.0, + 538.0 + ], + [ + 511.0, + 542.0 + ] + ], + "center_px": [ + 505.5, + 539.5 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 742.0, + 556.0 + ], + [ + 747.0, + 553.0 + ], + [ + 769.0, + 554.0 + ], + [ + 765.0, + 557.0 + ] + ], + "center_px": [ + 755.75, + 555.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 577.0, + 548.0 + ], + [ + 585.0, + 544.0 + ], + [ + 604.0, + 546.0 + ], + [ + 598.0, + 549.0 + ] + ], + "center_px": [ + 591.0, + 546.75 + ], + "area_px": 80.5 + }, + { + "image_points_px": [ + [ + 772.0, + 553.0 + ], + [ + 777.0, + 550.0 + ], + [ + 799.0, + 551.0 + ], + [ + 794.0, + 554.0 + ] + ], + "center_px": [ + 785.5, + 552.0 + ], + "area_px": 71.0 + }, + { + "image_points_px": [ + [ + 379.0, + 536.0 + ], + [ + 388.0, + 533.0 + ], + [ + 406.0, + 534.0 + ], + [ + 397.0, + 538.0 + ] + ], + "center_px": [ + 392.5, + 535.25 + ], + "area_px": 76.5 + }, + { + "image_points_px": [ + [ + 565.0, + 541.0 + ], + [ + 572.0, + 538.0 + ], + [ + 592.0, + 539.0 + ], + [ + 586.0, + 542.0 + ] + ], + "center_px": [ + 578.75, + 540.0 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 553.0, + 535.0 + ], + [ + 560.0, + 532.0 + ], + [ + 580.0, + 533.0 + ], + [ + 573.0, + 536.0 + ] + ], + "center_px": [ + 566.5, + 534.0 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 165.0, + 535.0 + ], + [ + 176.0, + 531.0 + ], + [ + 192.0, + 532.0 + ], + [ + 183.0, + 535.0 + ] + ], + "center_px": [ + 179.0, + 533.25 + ], + "area_px": 64.5 + }, + { + "image_points_px": [ + [ + 451.0, + 537.0 + ], + [ + 458.0, + 534.0 + ], + [ + 478.0, + 535.0 + ], + [ + 470.0, + 538.0 + ] + ], + "center_px": [ + 464.25, + 536.0 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 431.0, + 525.0 + ], + [ + 439.0, + 522.0 + ], + [ + 458.0, + 523.0 + ], + [ + 450.0, + 526.0 + ] + ], + "center_px": [ + 444.5, + 524.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 370.0, + 530.0 + ], + [ + 379.0, + 527.0 + ], + [ + 397.0, + 528.0 + ], + [ + 389.0, + 531.0 + ] + ], + "center_px": [ + 383.75, + 529.0 + ], + "area_px": 64.0 + }, + { + "image_points_px": [ + [ + 866.0, + 561.0 + ], + [ + 870.0, + 557.0 + ], + [ + 892.0, + 559.0 + ], + [ + 889.0, + 562.0 + ] + ], + "center_px": [ + 879.25, + 559.75 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 185.0, + 520.0 + ], + [ + 195.0, + 517.0 + ], + [ + 212.0, + 518.0 + ], + [ + 202.0, + 521.0 + ] + ], + "center_px": [ + 198.5, + 519.0 + ], + "area_px": 61.0 + }, + { + "image_points_px": [ + [ + 118.0, + 519.0 + ], + [ + 129.0, + 516.0 + ], + [ + 145.0, + 517.0 + ], + [ + 135.0, + 520.0 + ] + ], + "center_px": [ + 131.75, + 518.0 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 652.0, + 549.0 + ], + [ + 658.0, + 545.0 + ], + [ + 678.0, + 546.0 + ], + [ + 673.0, + 550.0 + ] + ], + "center_px": [ + 665.25, + 547.5 + ], + "area_px": 87.5 + }, + { + "image_points_px": [ + [ + 848.0, + 554.0 + ], + [ + 853.0, + 550.0 + ], + [ + 874.0, + 552.0 + ], + [ + 870.0, + 555.0 + ] + ], + "center_px": [ + 861.25, + 552.75 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 1205.0, + 560.0 + ], + [ + 1206.0, + 557.0 + ], + [ + 1230.0, + 559.0 + ], + [ + 1229.0, + 562.0 + ] + ], + "center_px": [ + 1217.5, + 559.5 + ], + "area_px": 74.0 + }, + { + "image_points_px": [ + [ + 1208.0, + 550.0 + ], + [ + 1209.0, + 547.0 + ], + [ + 1233.0, + 549.0 + ], + [ + 1232.0, + 552.0 + ] + ], + "center_px": [ + 1220.5, + 549.5 + ], + "area_px": 74.0 + }, + { + "image_points_px": [ + [ + 963.0, + 688.0 + ], + [ + 964.0, + 690.0 + ], + [ + 949.0, + 710.0 + ], + [ + 948.0, + 708.0 + ] + ], + "center_px": [ + 956.0, + 699.0 + ], + "area_px": 50.0 + }, + { + "image_points_px": [ + [ + 727.0, + 549.0 + ], + [ + 732.0, + 546.0 + ], + [ + 753.0, + 547.0 + ], + [ + 747.0, + 551.0 + ] + ], + "center_px": [ + 739.75, + 548.25 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 757.0, + 546.0 + ], + [ + 762.0, + 543.0 + ], + [ + 783.0, + 544.0 + ], + [ + 777.0, + 548.0 + ] + ], + "center_px": [ + 769.75, + 545.25 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 831.0, + 547.0 + ], + [ + 835.0, + 544.0 + ], + [ + 857.0, + 545.0 + ], + [ + 853.0, + 548.0 + ] + ], + "center_px": [ + 844.0, + 546.0 + ], + "area_px": 70.0 + }, + { + "image_points_px": [ + [ + 860.0, + 544.0 + ], + [ + 864.0, + 541.0 + ], + [ + 886.0, + 542.0 + ], + [ + 882.0, + 545.0 + ] + ], + "center_px": [ + 873.0, + 543.0 + ], + "area_px": 70.0 + }, + { + "image_points_px": [ + [ + 814.0, + 541.0 + ], + [ + 818.0, + 538.0 + ], + [ + 840.0, + 539.0 + ], + [ + 835.0, + 542.0 + ] + ], + "center_px": [ + 826.75, + 540.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 842.0, + 538.0 + ], + [ + 847.0, + 535.0 + ], + [ + 868.0, + 536.0 + ], + [ + 864.0, + 539.0 + ] + ], + "center_px": [ + 855.25, + 537.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 770.0, + 537.0 + ], + [ + 775.0, + 534.0 + ], + [ + 796.0, + 535.0 + ], + [ + 791.0, + 538.0 + ] + ], + "center_px": [ + 783.0, + 536.0 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 799.0, + 534.0 + ], + [ + 804.0, + 531.0 + ], + [ + 825.0, + 532.0 + ], + [ + 820.0, + 535.0 + ] + ], + "center_px": [ + 812.0, + 533.0 + ], + "area_px": 68.0 + }, + { + "image_points_px": [ + [ + 754.0, + 531.0 + ], + [ + 760.0, + 528.0 + ], + [ + 780.0, + 529.0 + ], + [ + 775.0, + 532.0 + ] + ], + "center_px": [ + 767.25, + 530.0 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 1228.0, + 576.0 + ], + [ + 1250.0, + 576.0 + ], + [ + 1253.0, + 579.0 + ], + [ + 1229.0, + 579.0 + ] + ], + "center_px": [ + 1240.0, + 577.5 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 482.0, + 534.0 + ], + [ + 489.0, + 531.0 + ], + [ + 508.0, + 532.0 + ], + [ + 502.0, + 535.0 + ] + ], + "center_px": [ + 495.25, + 533.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 583.0, + 532.0 + ], + [ + 590.0, + 529.0 + ], + [ + 609.0, + 530.0 + ], + [ + 603.0, + 533.0 + ] + ], + "center_px": [ + 596.25, + 531.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 410.0, + 534.0 + ], + [ + 417.0, + 531.0 + ], + [ + 436.0, + 532.0 + ], + [ + 429.0, + 535.0 + ] + ], + "center_px": [ + 423.0, + 533.0 + ], + "area_px": 64.0 + }, + { + "image_points_px": [ + [ + 441.0, + 531.0 + ], + [ + 448.0, + 528.0 + ], + [ + 467.0, + 529.0 + ], + [ + 460.0, + 532.0 + ] + ], + "center_px": [ + 454.0, + 530.0 + ], + "area_px": 64.0 + }, + { + "image_points_px": [ + [ + 392.0, + 522.0 + ], + [ + 399.0, + 519.0 + ], + [ + 418.0, + 520.0 + ], + [ + 409.0, + 523.0 + ] + ], + "center_px": [ + 404.5, + 521.0 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 596.0, + 538.0 + ], + [ + 602.0, + 535.0 + ], + [ + 621.0, + 536.0 + ], + [ + 615.0, + 540.0 + ] + ], + "center_px": [ + 608.5, + 537.25 + ], + "area_px": 75.5 + }, + { + "image_points_px": [ + [ + 795.0, + 520.0 + ], + [ + 800.0, + 517.0 + ], + [ + 820.0, + 518.0 + ], + [ + 815.0, + 521.0 + ] + ], + "center_px": [ + 807.5, + 519.0 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 542.0, + 529.0 + ], + [ + 548.0, + 526.0 + ], + [ + 567.0, + 527.0 + ], + [ + 561.0, + 530.0 + ] + ], + "center_px": [ + 554.5, + 528.0 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 422.0, + 519.0 + ], + [ + 430.0, + 516.0 + ], + [ + 447.0, + 517.0 + ], + [ + 441.0, + 520.0 + ] + ], + "center_px": [ + 435.0, + 518.0 + ], + "area_px": 61.0 + }, + { + "image_points_px": [ + [ + 402.0, + 528.0 + ], + [ + 408.0, + 525.0 + ], + [ + 427.0, + 526.0 + ], + [ + 418.0, + 529.0 + ] + ], + "center_px": [ + 413.75, + 527.0 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 331.0, + 527.0 + ], + [ + 339.0, + 524.0 + ], + [ + 356.0, + 525.0 + ], + [ + 349.0, + 528.0 + ] + ], + "center_px": [ + 343.75, + 526.0 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 37.0, + 497.0 + ], + [ + 47.0, + 495.0 + ], + [ + 62.0, + 496.0 + ], + [ + 52.0, + 498.0 + ] + ], + "center_px": [ + 49.5, + 496.5 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 1111.0, + 693.0 + ], + [ + 1115.0, + 685.0 + ], + [ + 1131.0, + 687.0 + ], + [ + 1129.0, + 694.0 + ] + ], + "center_px": [ + 1121.5, + 689.75 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 741.0, + 525.0 + ], + [ + 745.0, + 522.0 + ], + [ + 765.0, + 523.0 + ], + [ + 761.0, + 526.0 + ] + ], + "center_px": [ + 753.0, + 524.0 + ], + "area_px": 64.0 + }, + { + "image_points_px": [ + [ + 1241.0, + 518.0 + ], + [ + 1263.0, + 519.0 + ], + [ + 1263.0, + 522.0 + ], + [ + 1241.0, + 521.0 + ] + ], + "center_px": [ + 1252.0, + 520.0 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 865.0, + 520.0 + ], + [ + 868.0, + 518.0 + ], + [ + 889.0, + 519.0 + ], + [ + 886.0, + 521.0 + ] + ], + "center_px": [ + 877.0, + 519.5 + ], + "area_px": 45.0 + }, + { + "image_points_px": [ + [ + 659.0, + 505.0 + ], + [ + 664.0, + 503.0 + ], + [ + 683.0, + 503.0 + ], + [ + 678.0, + 506.0 + ] + ], + "center_px": [ + 671.0, + 504.25 + ], + "area_px": 50.0 + }, + { + "image_points_px": [ + [ + 875.0, + 512.0 + ], + [ + 879.0, + 510.0 + ], + [ + 899.0, + 511.0 + ], + [ + 896.0, + 513.0 + ] + ], + "center_px": [ + 887.25, + 511.5 + ], + "area_px": 44.5 + }, + { + "image_points_px": [ + [ + 768.0, + 522.0 + ], + [ + 772.0, + 520.0 + ], + [ + 792.0, + 521.0 + ], + [ + 788.0, + 523.0 + ] + ], + "center_px": [ + 780.0, + 521.5 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 833.0, + 509.0 + ], + [ + 838.0, + 507.0 + ], + [ + 857.0, + 508.0 + ], + [ + 853.0, + 510.0 + ] + ], + "center_px": [ + 845.25, + 508.5 + ], + "area_px": 43.5 + }, + { + "image_points_px": [ + [ + 414.0, + 513.0 + ], + [ + 420.0, + 511.0 + ], + [ + 438.0, + 512.0 + ], + [ + 432.0, + 514.0 + ] + ], + "center_px": [ + 426.0, + 512.5 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 256.0, + 520.0 + ], + [ + 262.0, + 518.0 + ], + [ + 280.0, + 519.0 + ], + [ + 273.0, + 521.0 + ] + ], + "center_px": [ + 267.75, + 519.5 + ], + "area_px": 41.5 + }, + { + "image_points_px": [ + [ + 218.0, + 517.0 + ], + [ + 226.0, + 515.0 + ], + [ + 242.0, + 516.0 + ], + [ + 235.0, + 518.0 + ] + ], + "center_px": [ + 230.25, + 516.5 + ], + "area_px": 40.5 + }, + { + "image_points_px": [ + [ + 171.0, + 503.0 + ], + [ + 179.0, + 501.0 + ], + [ + 195.0, + 502.0 + ], + [ + 187.0, + 504.0 + ] + ], + "center_px": [ + 183.0, + 502.5 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 166.0, + 498.0 + ], + [ + 174.0, + 496.0 + ], + [ + 190.0, + 497.0 + ], + [ + 182.0, + 499.0 + ] + ], + "center_px": [ + 178.0, + 497.5 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 784.0, + 528.0 + ], + [ + 788.0, + 525.0 + ], + [ + 807.0, + 526.0 + ], + [ + 804.0, + 529.0 + ] + ], + "center_px": [ + 795.75, + 527.0 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 1233.0, + 555.0 + ], + [ + 1252.0, + 555.0 + ], + [ + 1256.0, + 558.0 + ], + [ + 1236.0, + 558.0 + ] + ], + "center_px": [ + 1244.25, + 556.5 + ], + "area_px": 58.5 + }, + { + "image_points_px": [ + [ + 1243.0, + 510.0 + ], + [ + 1264.0, + 511.0 + ], + [ + 1264.0, + 514.0 + ], + [ + 1243.0, + 513.0 + ] + ], + "center_px": [ + 1253.5, + 512.0 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 860.0, + 507.0 + ], + [ + 864.0, + 504.0 + ], + [ + 883.0, + 505.0 + ], + [ + 878.0, + 508.0 + ] + ], + "center_px": [ + 871.25, + 506.0 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 844.0, + 502.0 + ], + [ + 848.0, + 499.0 + ], + [ + 867.0, + 500.0 + ], + [ + 864.0, + 502.0 + ] + ], + "center_px": [ + 855.75, + 500.75 + ], + "area_px": 50.5 + }, + { + "image_points_px": [ + [ + 884.0, + 568.0 + ], + [ + 889.0, + 564.0 + ], + [ + 905.0, + 565.0 + ], + [ + 905.0, + 569.0 + ] + ], + "center_px": [ + 895.75, + 566.5 + ], + "area_px": 76.5 + }, + { + "image_points_px": [ + [ + 699.0, + 508.0 + ], + [ + 704.0, + 506.0 + ], + [ + 722.0, + 506.0 + ], + [ + 718.0, + 509.0 + ] + ], + "center_px": [ + 710.75, + 507.25 + ], + "area_px": 48.5 + }, + { + "image_points_px": [ + [ + 793.0, + 506.0 + ], + [ + 797.0, + 504.0 + ], + [ + 816.0, + 505.0 + ], + [ + 812.0, + 507.0 + ] + ], + "center_px": [ + 804.5, + 505.5 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 778.0, + 501.0 + ], + [ + 782.0, + 499.0 + ], + [ + 801.0, + 500.0 + ], + [ + 797.0, + 502.0 + ] + ], + "center_px": [ + 789.5, + 500.5 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 739.0, + 498.0 + ], + [ + 743.0, + 496.0 + ], + [ + 762.0, + 497.0 + ], + [ + 757.0, + 499.0 + ] + ], + "center_px": [ + 750.25, + 497.5 + ], + "area_px": 41.5 + }, + { + "image_points_px": [ + [ + 128.0, + 491.0 + ], + [ + 137.0, + 488.0 + ], + [ + 151.0, + 489.0 + ], + [ + 144.0, + 491.0 + ] + ], + "center_px": [ + 140.0, + 489.75 + ], + "area_px": 41.5 + }, + { + "image_points_px": [ + [ + 627.0, + 479.0 + ], + [ + 631.0, + 477.0 + ], + [ + 650.0, + 477.0 + ], + [ + 644.0, + 479.0 + ] + ], + "center_px": [ + 638.0, + 478.0 + ], + "area_px": 36.0 + }, + { + "image_points_px": [ + [ + 700.0, + 495.0 + ], + [ + 706.0, + 493.0 + ], + [ + 723.0, + 494.0 + ], + [ + 718.0, + 496.0 + ] + ], + "center_px": [ + 711.75, + 494.5 + ], + "area_px": 40.5 + }, + { + "image_points_px": [ + [ + 279.0, + 512.0 + ], + [ + 287.0, + 510.0 + ], + [ + 302.0, + 511.0 + ], + [ + 296.0, + 513.0 + ] + ], + "center_px": [ + 291.0, + 511.5 + ], + "area_px": 39.0 + }, + { + "image_points_px": [ + [ + 162.0, + 493.0 + ], + [ + 169.0, + 491.0 + ], + [ + 185.0, + 492.0 + ], + [ + 177.0, + 494.0 + ] + ], + "center_px": [ + 173.25, + 492.5 + ], + "area_px": 38.5 + }, + { + "image_points_px": [ + [ + 91.0, + 483.0 + ], + [ + 100.0, + 481.0 + ], + [ + 114.0, + 482.0 + ], + [ + 105.0, + 484.0 + ] + ], + "center_px": [ + 102.5, + 482.5 + ], + "area_px": 37.0 + }, + { + "image_points_px": [ + [ + 870.0, + 499.0 + ], + [ + 873.0, + 497.0 + ], + [ + 892.0, + 498.0 + ], + [ + 889.0, + 500.0 + ] + ], + "center_px": [ + 881.0, + 498.5 + ], + "area_px": 41.0 + }, + { + "image_points_px": [ + [ + 830.0, + 496.0 + ], + [ + 834.0, + 494.0 + ], + [ + 852.0, + 495.0 + ], + [ + 849.0, + 497.0 + ] + ], + "center_px": [ + 841.25, + 495.5 + ], + "area_px": 40.5 + }, + { + "image_points_px": [ + [ + 879.0, + 492.0 + ], + [ + 883.0, + 490.0 + ], + [ + 901.0, + 491.0 + ], + [ + 898.0, + 493.0 + ] + ], + "center_px": [ + 890.25, + 491.5 + ], + "area_px": 40.5 + }, + { + "image_points_px": [ + [ + 864.0, + 487.0 + ], + [ + 868.0, + 485.0 + ], + [ + 886.0, + 486.0 + ], + [ + 883.0, + 488.0 + ] + ], + "center_px": [ + 875.25, + 486.5 + ], + "area_px": 40.5 + }, + { + "image_points_px": [ + [ + 850.0, + 483.0 + ], + [ + 853.0, + 481.0 + ], + [ + 872.0, + 481.0 + ], + [ + 868.0, + 483.0 + ] + ], + "center_px": [ + 860.75, + 482.0 + ], + "area_px": 37.0 + }, + { + "image_points_px": [ + [ + 714.0, + 500.0 + ], + [ + 718.0, + 498.0 + ], + [ + 736.0, + 499.0 + ], + [ + 732.0, + 501.0 + ] + ], + "center_px": [ + 725.0, + 499.5 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 855.0, + 494.0 + ], + [ + 859.0, + 492.0 + ], + [ + 877.0, + 493.0 + ], + [ + 873.0, + 495.0 + ] + ], + "center_px": [ + 866.0, + 493.5 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 726.0, + 493.0 + ], + [ + 730.0, + 491.0 + ], + [ + 748.0, + 492.0 + ], + [ + 744.0, + 494.0 + ] + ], + "center_px": [ + 737.0, + 492.5 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 812.0, + 480.0 + ], + [ + 816.0, + 478.0 + ], + [ + 834.0, + 479.0 + ], + [ + 830.0, + 481.0 + ] + ], + "center_px": [ + 823.0, + 479.5 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 775.0, + 478.0 + ], + [ + 778.0, + 476.0 + ], + [ + 797.0, + 476.0 + ], + [ + 792.0, + 478.0 + ] + ], + "center_px": [ + 785.5, + 477.0 + ], + "area_px": 36.0 + }, + { + "image_points_px": [ + [ + 840.0, + 489.0 + ], + [ + 845.0, + 487.0 + ], + [ + 862.0, + 488.0 + ], + [ + 858.0, + 490.0 + ] + ], + "center_px": [ + 851.25, + 488.5 + ], + "area_px": 39.5 + }, + { + "image_points_px": [ + [ + 738.0, + 486.0 + ], + [ + 743.0, + 484.0 + ], + [ + 760.0, + 485.0 + ], + [ + 756.0, + 487.0 + ] + ], + "center_px": [ + 749.25, + 485.5 + ], + "area_px": 39.5 + }, + { + "image_points_px": [ + [ + 763.0, + 484.0 + ], + [ + 767.0, + 482.0 + ], + [ + 785.0, + 483.0 + ], + [ + 780.0, + 485.0 + ] + ], + "center_px": [ + 773.75, + 483.5 + ], + "area_px": 39.5 + }, + { + "image_points_px": [ + [ + 701.0, + 484.0 + ], + [ + 706.0, + 482.0 + ], + [ + 723.0, + 482.0 + ], + [ + 719.0, + 484.0 + ] + ], + "center_px": [ + 712.25, + 483.0 + ], + "area_px": 35.0 + }, + { + "image_points_px": [ + [ + 726.0, + 482.0 + ], + [ + 730.0, + 480.0 + ], + [ + 748.0, + 480.0 + ], + [ + 743.0, + 482.0 + ] + ], + "center_px": [ + 736.75, + 481.0 + ], + "area_px": 35.0 + }, + { + "image_points_px": [ + [ + 751.0, + 491.0 + ], + [ + 756.0, + 489.0 + ], + [ + 773.0, + 490.0 + ], + [ + 768.0, + 492.0 + ] + ], + "center_px": [ + 762.0, + 490.5 + ], + "area_px": 39.0 + }, + { + "image_points_px": [ + [ + 556.0, + 474.0 + ], + [ + 561.0, + 472.0 + ], + [ + 578.0, + 472.0 + ], + [ + 573.0, + 474.0 + ] + ], + "center_px": [ + 567.0, + 473.0 + ], + "area_px": 34.0 + }, + { + "image_points_px": [ + [ + 785.0, + 471.0 + ], + [ + 793.0, + 469.0 + ], + [ + 807.0, + 470.0 + ], + [ + 802.0, + 472.0 + ] + ], + "center_px": [ + 796.75, + 470.5 + ], + "area_px": 37.5 + }, + { + "image_points_px": [ + [ + 144.0, + 475.0 + ], + [ + 151.0, + 473.0 + ], + [ + 166.0, + 473.0 + ], + [ + 160.0, + 475.0 + ] + ], + "center_px": [ + 155.25, + 474.0 + ], + "area_px": 31.0 + }, + { + "image_points_px": [ + [ + 1239.0, + 528.0 + ], + [ + 1254.0, + 527.0 + ], + [ + 1261.0, + 529.0 + ], + [ + 1247.0, + 530.0 + ] + ], + "center_px": [ + 1250.25, + 528.5 + ], + "area_px": 36.5 + }, + { + "image_points_px": [ + [ + 148.0, + 479.0 + ], + [ + 156.0, + 477.0 + ], + [ + 170.0, + 478.0 + ], + [ + 163.0, + 480.0 + ] + ], + "center_px": [ + 159.25, + 478.5 + ], + "area_px": 36.5 + }, + { + "image_points_px": [ + [ + 120.0, + 481.0 + ], + [ + 128.0, + 479.0 + ], + [ + 142.0, + 480.0 + ], + [ + 134.0, + 482.0 + ] + ], + "center_px": [ + 131.0, + 480.5 + ], + "area_px": 36.0 + }, + { + "image_points_px": [ + [ + 63.0, + 485.0 + ], + [ + 72.0, + 483.0 + ], + [ + 85.0, + 484.0 + ], + [ + 76.0, + 486.0 + ] + ], + "center_px": [ + 74.0, + 484.5 + ], + "area_px": 35.0 + }, + { + "image_points_px": [ + [ + 1196.0, + 630.0 + ], + [ + 1213.0, + 630.0 + ], + [ + 1212.0, + 636.0 + ], + [ + 1197.0, + 635.0 + ] + ], + "center_px": [ + 1204.5, + 632.75 + ], + "area_px": 88.0 + }, + { + "image_points_px": [ + [ + 826.0, + 485.0 + ], + [ + 829.0, + 483.0 + ], + [ + 847.0, + 483.0 + ], + [ + 844.0, + 485.0 + ] + ], + "center_px": [ + 836.5, + 484.0 + ], + "area_px": 36.0 + }, + { + "image_points_px": [ + [ + 822.0, + 474.0 + ], + [ + 826.0, + 472.0 + ], + [ + 843.0, + 472.0 + ], + [ + 840.0, + 474.0 + ] + ], + "center_px": [ + 832.75, + 473.0 + ], + "area_px": 35.0 + }, + { + "image_points_px": [ + [ + 860.0, + 476.0 + ], + [ + 863.0, + 474.0 + ], + [ + 881.0, + 475.0 + ], + [ + 876.0, + 477.0 + ] + ], + "center_px": [ + 870.0, + 475.5 + ], + "area_px": 38.0 + }, + { + "image_points_px": [ + [ + 788.0, + 482.0 + ], + [ + 792.0, + 480.0 + ], + [ + 809.0, + 481.0 + ], + [ + 805.0, + 483.0 + ] + ], + "center_px": [ + 798.5, + 481.5 + ], + "area_px": 38.0 + }, + { + "image_points_px": [ + [ + 689.0, + 479.0 + ], + [ + 694.0, + 477.0 + ], + [ + 710.0, + 478.0 + ], + [ + 705.0, + 480.0 + ] + ], + "center_px": [ + 699.5, + 478.5 + ], + "area_px": 37.0 + }, + { + "image_points_px": [ + [ + 595.0, + 466.0 + ], + [ + 601.0, + 464.0 + ], + [ + 616.0, + 464.0 + ], + [ + 611.0, + 466.0 + ] + ], + "center_px": [ + 605.75, + 465.0 + ], + "area_px": 31.0 + }, + { + "image_points_px": [ + [ + 1217.0, + 522.0 + ], + [ + 1228.0, + 521.0 + ], + [ + 1238.0, + 523.0 + ], + [ + 1223.0, + 524.0 + ] + ], + "center_px": [ + 1226.5, + 522.5 + ], + "area_px": 34.0 + }, + { + "image_points_px": [ + [ + 1208.0, + 481.0 + ], + [ + 1209.0, + 479.0 + ], + [ + 1228.0, + 480.0 + ], + [ + 1227.0, + 482.0 + ] + ], + "center_px": [ + 1218.0, + 480.5 + ], + "area_px": 39.0 + }, + { + "image_points_px": [ + [ + 1228.0, + 484.0 + ], + [ + 1247.0, + 484.0 + ], + [ + 1248.0, + 486.0 + ], + [ + 1230.0, + 486.0 + ] + ], + "center_px": [ + 1238.25, + 485.0 + ], + "area_px": 37.0 + }, + { + "image_points_px": [ + [ + 1245.0, + 504.0 + ], + [ + 1259.0, + 503.0 + ], + [ + 1265.0, + 505.0 + ], + [ + 1259.0, + 506.0 + ] + ], + "center_px": [ + 1257.0, + 504.5 + ], + "area_px": 30.0 + }, + { + "image_points_px": [ + [ + 1220.0, + 514.0 + ], + [ + 1232.0, + 513.0 + ], + [ + 1240.0, + 515.0 + ], + [ + 1230.0, + 516.0 + ] + ], + "center_px": [ + 1230.5, + 514.5 + ], + "area_px": 31.0 + }, + { + "image_points_px": [ + [ + 1211.0, + 473.0 + ], + [ + 1228.0, + 473.0 + ], + [ + 1230.0, + 475.0 + ], + [ + 1216.0, + 475.0 + ] + ], + "center_px": [ + 1221.25, + 474.0 + ], + "area_px": 31.0 + }, + { + "image_points_px": [ + [ + 1232.0, + 471.0 + ], + [ + 1246.0, + 471.0 + ], + [ + 1251.0, + 473.0 + ], + [ + 1235.0, + 473.0 + ] + ], + "center_px": [ + 1241.0, + 472.0 + ], + "area_px": 30.0 + }, + { + "image_points_px": [ + [ + 1236.0, + 459.0 + ], + [ + 1248.0, + 459.0 + ], + [ + 1254.0, + 461.0 + ], + [ + 1240.0, + 461.0 + ] + ], + "center_px": [ + 1244.5, + 460.0 + ], + "area_px": 26.0 + } + ] +} \ No newline at end of file diff --git a/pipeline/2_Multiview_Trial/robot_1_control.json b/pipeline/2_Multiview_Trial/robot_1_control.json new file mode 100644 index 0000000..442e2d2 --- /dev/null +++ b/pipeline/2_Multiview_Trial/robot_1_control.json @@ -0,0 +1,462 @@ +{ + "coordinateSystem": { + "handedness": "right", + "x": "right", + "y": "backward", + "z": "up" + }, + "units": { + "length": "mm", + "rotation": "degree" + }, + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "renderingInfo": { + "width": 1280, + "height": 720, + "cameraPosition": [-200, -900, 200], + "cameraTarget": [210, -180, 180], + "cameraUpVector": [0, 0, 1], + "lightPosition": [-500, -500, 500], + "lightTarget": [0, 0, 0], + "lightUpVector": [0, 0, 1], + "metric": "mm", + "showSkeleton": true, + "showMarkers": true, + "backgroundColor": [0.70, 0.85, 1.0], + "backgroundStrength": 0.20, + "sunEnergy": 0.35, + "areaEnergy": 120, + "exposure": -1.5, + "materials": { + "wood": { + "baseColor": [0.72, 0.52, 0.33], + "roughness": 0.85, + "metallic": 0.0 + }, + "plaWhite": { + "baseColor": [0.95, 0.95, 0.95], + "roughness": 0.45, + "metallic": 0.0 + }, + "steel": { + "baseColor": [0.72, 0.72, 0.75], + "roughness": 0.25, + "metallic": 1.0 + }, + "powderCoatBlue": { + "baseColor": [0.15, 0.25, 0.7], + "roughness": 0.55, + "metallic": 0.0 + }, + "defaultPlastic": { + "baseColor": [0.95, 0.95, 0.95], + "roughness": 0.4, + "metallic": 0.0 + }, + "skeletonRed": { + "baseColor": [0.85, 0.20, 0.20], + "roughness": 0.35, + "metallic": 0.0 + }, + "markerBlack": { + "baseColor": [0.04, 0.04, 0.04], + "roughness": 0.80, + "metallic": 0.0 + } + }, + "skeletonDefaults": { + "radius": 4, + "color": [0.85, 0.20, 0.20] + }, + "markerDefaults": { + "size": 25, + "thickness": 1, + "color": [0.04, 0.04, 0.04] + } + }, + "defaultPosition": { + "x": 100, + "y": 30, + "z": -30, + "a": -120, + "b": 22, + "c": 91, + "e": 10 + }, + "recognized": { + "x": null, + "y": null, + "z": null, + "a": null, + "b": null, + "c": null, + "e": null + }, + "multiview_calculation": { + "combine_mode": "mean", + "size_ref_px": 50.0, + "border_ref_px": 120.0, + "center_ref_norm": 0.01, + "sharpness_ref": 2500.0, + "homography_ref": 0.18, + "size_factor": 0.3, + "aspect_factor": 0.3, + "border_factor": 0.01, + "center_factor": 0.01, + "sharpness_factor": 0.5, + "homography_factor": 0.2, + "normal_visibility_factor": 0.01, + "spin_factor": 0.3, + "weight_floor": 0.3 + }, + "movements": { + "x": null, + "y": null, + "z": null, + "a": null, + "b": null, + "c": null, + "e": null + }, + "links": { + "Board": { + "parent": null, + "size": [1000, 200, 25], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + "skeleton": { + "from": [0, 0, 16], + "to": [1000, 0, 16], + "radius": 4, + "color": [0.85, 0.20, 0.20] + }, + "markers":[ + {"id":210,"position":[20, -20, 0.3], "normal":[0,0,1]}, + {"id":211,"position":[250, -10, 0.3], "normal":[0,0,1]}, + {"id":215,"position":[250, -90, 0.3], "normal":[0,0,1]}, + {"id":214,"position":[350, -10, 0.3], "normal":[0,0,1]}, + {"id":208,"position":[350, -90, 0.3], "normal":[0,0,1]}, + {"id":206,"position":[650, -10, 0.3], "normal":[0,0,1]}, + {"id":205,"position":[750, -90, 0.3], "normal":[0,0,1]}, + {"id":207,"position":[750, -10, 0.3], "normal":[0,0,1]}, + {"id":217,"position":[650, -90, 0.3], "normal":[0,0,1]} + ], + "model": [ + { + "stlFile": "surfaces/Board.stl", + "originOfModel": [0, 0, 0], + "rotationOfModelDegree": [0, 0, -90], + "material": "wood" + }, + { + "stlFile": "surfaces/BoardRail.stl", + "originOfModel": [0, 0, 0], + "rotationOfModelDegree": [0, 0, -90], + "material": "steel" + } + ] + }, + "Base": { + "parent": "Board", + "size": [150, 200, 150], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + "jointToParent": { + "name": "Slider", + "type": "linear", + "axis": [1, 0, 0], + "origin": [0, 0, 16], + "rotation": [0, 0, 0], + "variable": "x" + }, + "skeleton": { + "from": [0, 108, 45], + "to": [110, 108, 45], + "radius": 4, + "color": [0.20, 0.80, 0.20] + }, + "markers": [ + ], + "model": [ + { + "stlFile": "surfaces/Base.stl", + "originOfModel": [-30, 0, -35], + "rotationOfModelDegree": [0, 0, 0], + "material": "plaWhite" + } + ] + }, + "Arm1": { + "parent": "Base", + "size": [70, 250, 70], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + "jointToParent": { + "name": "Joint1", + "type": "revolute", + "axis": [-1, 0, 0], + "origin": [110, 108, 45], + "rotation": [0, 0, 0], + "variable": "y" + }, + "skeleton": { + "from": [0, 0, 0], + "to": [0, -250, 0], + "radius": 4, + "color": [0.20, 0.20, 0.90] + }, + "markers": [ + { + "id": 198, + "name": "aruco_198", + "position": [0, -160, 35], + "normal": [0, 0, 1], + "size": 25, + "spin": 0 + }, + { + "id": 229, + "name": "aruco_229", + "position": [0, -250, 35], + "normal": [0, 0, 1], + "size": 25, + "spin": 0 + }, + { + "id": 242, + "name": "aruco_242", + "position": [0, -250, -35], + "normal": [0, 0, -1], + "size": 25, + "spin": 0 + }, + { + "id": 243, + "name": "aruco_243", + "position": [0, -285, 0], + "normal": [0, -1, 0], + "size": 25, + "spin": 0 + } + ], + "model": [ + { + "stlFile": "surfaces/Holm.stl", + "originOfModel__": [-25,29,-28.5], + "originOfModel": [-29,25,28.5], + "rotationOfModelDegree__": [0, 0, 0], + "rotationOfModelDegree": [180, 0, -90], + "material": "powderCoatBlue" + } + ] + }, + "Ellbow": { + "parent": "Arm1", + + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + + "jointToParent": { + "name": "Joint2", + "type": "revolute", + "axis": [-1, 0, 0], + "origin": [0, -250, 0], + "rotation": [0, 0, 0], + "variable": "z" + }, + + "skeleton": { + "from": [0, 0, 0], + "to": [90, 0, 0], + "radius": 4, + "color": [0.90, 0.20, 0.20] + }, + "model": [ + { + "stlFile": "surfaces/Ellebogen.stl", + "originOfModel": [90,0,0], + "rotationOfModelDegree": [0,-90,-90], + "material": "defaultPlastic" + } + ], + "markers": [ + { + "id": 244, + "name": "aruco_244", + "position": [125, 0, 0], + "normal": [1, 0, 0], + "size": 25, + "spin": 0 + }, + { + "id": 245, + "name": "aruco_245", + "position": [90, 0, -35], + "normal": [0, 0, -1], + "size": 25, + "spin": 0 + }, + { + "id": 246, + "name": "aruco_246", + "position": [90, 0, 35], + "normal": [0, 0, 1], + "size": 25 + }, + { + "id": 247, + "name": "aruco_247", + "position": [52.5, 0, 35], + "normal": [0, 0, 1], + "size": 25 + } + ] + + }, + "Arm2": { + "parent": "Ellbow", + + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + + "jointToParent": { + "name": "Joint3", + "type": "revolute", + "axis": [0, -1, 0], + "origin": [90, 0, 0], + "rotation": [0, 0, 0], + "variable": "a" + }, + + "skeleton": { + "from": [0, 0, 0], + "to": [0, -250, 0], + "radius": 4, + "color": [0.95, 0.85, 0.20] + }, + "model": [ + { + "stlFile": "surfaces/Unterarm.stl", + "originOfModel": [0,-250,0], + "rotationOfModelDegree": [180, 0, -90], + "material": "defaultPlastic" + } + ], + "markers":[ + + {"id":124, "position":[24.75, -112, -24.75],"normal":[1,0,-1]}, + {"id":122, "name": "aruco_122", "position":[-35,-112,0], "normal":[-1,0,0]}, + {"id":218, "name": "aruco_218", "position":[35,-112,0], "normal":[1,0,0]}, + {"id":122, "name": "aruco_122", "position":[0, -182, 30],"normal":[0,0,1]}, + {"id":101, "name": "aruco_122", "position":[ 24.75, -182, -24.75],"normal":[ 1,0,-1]}, + {"id":102, "name": "aruco_122", "position":[-24.75, -182, -24.75],"normal":[-1,0,-1]}, + {"id":124, "name": "aruco_124", "position":[-35,-219,0], "normal":[-1,0,0]}, + {"id":219, "name": "aruco_219", "position":[35,-219,0], "normal":[1,0,0]} + + ] + }, + "Hand": { + "parent": "Arm2", + + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + + "jointToParent": { + "name": "Joint4", + "type": "revolute", + "axis": [1, 0, 0], + "origin": [0, -250, 0], + "rotation": [0, 0, 0], + "variable": "b" + }, + + "skeleton": { + "from": [0, 0, 0], + "to": [0, -35, 0], + "radius": 4, + "color": [0.95, 0.55, 0.15] + } + }, + "Palm": { + "parent": "Hand", + + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + + "jointToParent": { + "name": "Joint3", + "type": "revolute", + "axis": [0, -1, 0], + "origin": [0, 0, 0], + "rotation": [0, 0, 0], + "variable": "c" + }, + + "skeleton": { + "from": [-50, -35, 0], + "to": [50, -35, 0], + "radius": 7, + "color": [0.95, 0.20, 0.20] + } + }, + "FingerA": { + "parent": "Palm", + "size": [80, 60, 20], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + "jointToParent": { + "name": "Slider", + "type": "linear", + "axis": [1, 0, 0], + "origin": [4, -35,0], + "rotation": [0, 0, 0], + "variable": "e" + }, + "skeleton": { + "from": [0, 0,0], + "to": [0, -60, 0], + "radius": 4, + "color": [0.20, 0.80, 0.20] + }, + "model": [ + { + "stlFile": "surfaces/Finger.stl", + "originOfModel": [24,0,-9.1], + "rotationOfModelDegree": [90, -90,0], + "material": "defaultPlastic" + } + ] + }, + "FingerB": { + "parent": "Palm", + "size": [80, 60, 20], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + "jointToParent": { + "name": "Slider", + "type": "linear", + "axis": [-1, 0, 0], + "origin": [-4, -35,0], + "rotation": [0, 0, 0], + "variable": "e" + }, + "skeleton": { + "from": [0, 0,0], + "to": [0, -60, 0], + "radius": 4, + "color": [0.20, 0.80, 0.20] + }, + "model": [ + { + "stlFile": "surfaces/Finger.stl", + "originOfModel": [-24,0,9.1], + "rotationOfModelDegree": [90, 90,0], + "material": "defaultPlastic" + } + ] + } + } +} \ No newline at end of file diff --git a/pipeline/run_pipeline.bat b/pipeline/2_Multiview_Trial/run_pipeline_1.bat similarity index 69% rename from pipeline/run_pipeline.bat rename to pipeline/2_Multiview_Trial/run_pipeline_1.bat index d4c0207..645e352 100644 --- a/pipeline/run_pipeline.bat +++ b/pipeline/2_Multiview_Trial/run_pipeline_1.bat @@ -2,5 +2,6 @@ python3 1_detect_aruco_observations.py --image render_1a.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . python3 1_detect_aruco_observations.py --image render_1b.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . python3 1_detect_aruco_observations.py --image render_1c.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . +python3 1_detect_aruco_observations.py --image render_1d.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . -python3 2_Multiview.py --robot ../robot.json --detections render_1a_aruco_detection.json render_1b_aruco_detection.json render_1c_aruco_detection.json --outDir . --write-summary --max-iter 120 +python3 2_Multiview.py --robot ../robot.json --detections render_1a_aruco_detection.json render_1b_aruco_detection.json render_1c_aruco_detection.json render_1d_aruco_detection.json --outDir . --write-summary --max-iter 120 diff --git a/pipeline/2_Multiview_Trial/run_pipeline_2.bat b/pipeline/2_Multiview_Trial/run_pipeline_2.bat new file mode 100644 index 0000000..fb751bc --- /dev/null +++ b/pipeline/2_Multiview_Trial/run_pipeline_2.bat @@ -0,0 +1,7 @@ + +python3 1_detect_aruco_observations.py --image render_2a.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . +python3 1_detect_aruco_observations.py --image render_2b.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . +python3 1_detect_aruco_observations.py --image render_2c.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . +python3 1_detect_aruco_observations.py --image render_2d.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . + +python3 2_Multiview.py --robot ../robot.json --detections render_2a_aruco_detection.json render_2b_aruco_detection.json render_2c_aruco_detection.json render_2d_aruco_detection.json --outDir . --write-summary --max-iter 120 diff --git a/pipeline/2_Multiview_Weighted.py b/pipeline/2_Multiview_Weighted.py deleted file mode 100644 index fa8d461..0000000 --- a/pipeline/2_Multiview_Weighted.py +++ /dev/null @@ -1,1079 +0,0 @@ -#!/usr/bin/env python3 - -""" -============================================================ -STEP 2b — Simultane Multiview-Optimierung für Roboterpose -============================================================ - -Ziel: - Aus mehreren ArUco-Detektionsdateien die gemeinsame - Roboterpose (x,y,z,a,b,c,e) schätzen und jede Kamera-Pose - sowie Marker-Weltpositionen ausgeben. - -Eingabe: - --robot ../robot.json - --detections render_1a_aruco_detection.json render_1b_aruco_detection.json ... - --outDir . - -Ausgabe: - multiview_pose.json - -Hinweis: - Dieses Skript verwendet die Markerpositionen aus robot.json - als kinematische Constraints und optimiert gleichzeitig: - - Roboterzustand (x,y,z,a,b,c,e) - - Kameraextrinsische Parameter pro Bild - -""" - -import argparse -import datetime -import json -import math -import os -import time -from pathlib import Path -from typing import Any, Dict, List, Tuple - -import cv2 -import numpy as np -from scipy.optimize import least_squares - -STATE_KEYS = ["x", "y", "z", "a", "b", "c", "e"] - -# ------------------------------------------------------------------ -# Constraint definitions and validation -# ------------------------------------------------------------------ - -class ConstraintResult: - """Result of validating/applying a single constraint""" - def __init__(self, name: str, enabled: bool, reason: str = ""): - self.name = name - self.enabled = enabled - self.reason = reason - self.residuals = [] - - def __str__(self) -> str: - status = "✓ ENABLED" if self.enabled else "✗ DISABLED" - return f"{self.name:40s} {status:12s} {self.reason}" - - -def validate_constraints(robot: Dict[str, Any], robot_markers: Dict[int, Dict[str, Any]]) -> Dict[str, ConstraintResult]: - """ - Validate which constraints can be applied based on robot geometry. - Returns a dict of constraint_name -> ConstraintResult - """ - results = {} - - # --- Constraint 1: Rigid body distances within each link --- - rigid_body_result = ConstraintResult("RigidBodyDistances", False) - try: - rigid_body_count = 0 - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) >= 2: - rigid_body_count += 1 - if rigid_body_count >= 2: - rigid_body_result.enabled = True - rigid_body_result.reason = f"Found {rigid_body_count} links with 2+ markers each" - else: - rigid_body_result.reason = "Not enough rigid links with multiple markers" - except Exception as e: - rigid_body_result.reason = f"Error: {str(e)}" - results['RigidBodyDistances'] = rigid_body_result - - # --- Constraint 2: Fixed X-distances between links (rotation around X-axis) --- - inter_link_x_result = ConstraintResult("InterLinkXDistances", False) - try: - links_with_markers = set(m['link_name'] for m in robot_markers.values()) - x_rotated_links = [] - for link_name in ['Arm1', 'Ellbow']: - if link_name in links_with_markers: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) >= 1: - x_rotated_links.append(link_name) - if len(x_rotated_links) >= 2: - inter_link_x_result.enabled = True - inter_link_x_result.reason = f"Found {len(x_rotated_links)} X-rotation links: {', '.join(x_rotated_links)}" - else: - inter_link_x_result.reason = "Not enough X-rotation links" - except Exception as e: - inter_link_x_result.reason = f"Error: {str(e)}" - results['InterLinkXDistances'] = inter_link_x_result - - # --- Sanity check (not a hard constraint): Arm2 sin(a) dependency --- - arm2_sina_result = ConstraintResult("Arm2SinADependency", True, "Sanity check only (not enforced)") - try: - arm2_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm2'] - if len(arm2_markers) >= 2: - z_values = set(m['position_m'][2] for m in arm2_markers) - if len(z_values) > 1: - arm2_sina_result.enabled = True - arm2_sina_result.reason = "Multiple Z-values detected; sin(a) dependency confirmed" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "No Z-variation in Arm2 markers (cannot use sin(a) constraint)" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "Not enough Arm2 markers" - except Exception as e: - arm2_sina_result.reason = f"Error: {str(e)}" - results['Arm2SinADependency'] = arm2_sina_result - - return results - - -# ------------------------------------------------------------------ -# JSON helpers -# ------------------------------------------------------------------ - -def load_json(path: str) -> Dict[str, Any]: - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - - -def save_json(data: Dict[str, Any], path: Path) -> None: - with open(path, 'w', encoding='utf-8') as f: - json.dump(data, f, indent=2) - - -# ------------------------------------------------------------------ -# robot.json helpers -# ------------------------------------------------------------------ - -def resolve_scalar(value: Any, default: float = 0.0) -> float: - if value is None: - return default - if isinstance(value, (int, float)): - return float(value) - try: - return float(str(value).strip()) - except ValueError: - return default - - -def resolve_vector(value: Any, default_len: int = 3) -> Tuple[float, ...]: - if value is None: - return tuple(0.0 for _ in range(default_len)) - if isinstance(value, (int, float, str)): - return (resolve_scalar(value),) + tuple(0.0 for _ in range(default_len - 1)) - if isinstance(value, (list, tuple)): - resolved = [resolve_scalar(v) for v in value] - if len(resolved) < default_len: - resolved.extend([0.0] * (default_len - len(resolved))) - return tuple(resolved[:default_len]) - return tuple(0.0 for _ in range(default_len)) - - -def parse_metric_scale(robot: Dict[str, Any]) -> float: - rendering_info = robot.get('renderingInfo', {}) or {} - metric = rendering_info.get('metric', 'mm') - return 0.001 if str(metric).strip().lower() == 'mm' else 1.0 - - -def normalize_axis(axis: Any) -> np.ndarray: - vec = np.asarray(axis, dtype=np.float64) - if vec.shape != (3,): - vec = vec.reshape(-1)[:3] - norm = np.linalg.norm(vec) - return vec / max(norm, 1e-9) - - -def euler_deg_to_matrix(euler_deg: Any) -> np.ndarray: - x_deg, y_deg, z_deg = resolve_vector(euler_deg, 3) - x = math.radians(x_deg) - y = math.radians(y_deg) - z = math.radians(z_deg) - - cx = math.cos(x) - sx = math.sin(x) - cy = math.cos(y) - sy = math.sin(y) - cz = math.cos(z) - sz = math.sin(z) - - Rx = np.array([ - [1.0, 0.0, 0.0], - [0.0, cx, -sx], - [0.0, sx, cx] - ], dtype=np.float64) - - Ry = np.array([ - [cy, 0.0, sy], - [0.0, 1.0, 0.0], - [-sy, 0.0, cy] - ], dtype=np.float64) - - Rz = np.array([ - [cz, -sz, 0.0], - [sz, cz, 0.0], - [0.0, 0.0, 1.0] - ], dtype=np.float64) - - return Rz @ Ry @ Rx - - -def transform_from_translation_rotation(translation: Any, rotation_deg: Any) -> np.ndarray: - T = np.eye(4, dtype=np.float64) - pos = np.asarray(resolve_vector(translation, 3), dtype=np.float64) - T[:3, 3] = pos - T[:3, :3] = euler_deg_to_matrix(rotation_deg) - return T - - -def axis_angle_matrix(axis: Any, angle_deg: float) -> np.ndarray: - axis_vec = normalize_axis(axis) - theta = math.radians(angle_deg) - kx, ky, kz = axis_vec - c = math.cos(theta) - s = math.sin(theta) - v = 1.0 - c - R = np.array([ - [kx * kx * v + c, kx * ky * v - kz * s, kx * kz * v + ky * s], - [ky * kx * v + kz * s, ky * ky * v + c, ky * kz * v - kx * s], - [kz * kx * v - ky * s, kz * ky * v + kx * s, kz * kz * v + c] - ], dtype=np.float64) - T = np.eye(4, dtype=np.float64) - T[:3, :3] = R - return T - - -# ------------------------------------------------------------------ -# Kinematics and marker extraction -# ------------------------------------------------------------------ - -def extract_markers(robot: Dict[str, Any], scale: float) -> Dict[int, Dict[str, Any]]: - markers = {} - links = robot.get('links', {}) or {} - marker_defaults = (robot.get('renderingInfo', {}) or {}).get('markerDefaults', {}) or {} - default_size_mm = float(marker_defaults.get('size', 25.0)) - - for link_name, link_info in links.items(): - for marker in link_info.get('markers', []) or []: - marker_id = int(marker.get('id', -1)) - if marker_id < 0: - continue - - pos = resolve_vector(marker.get('position', [0, 0, 0]), 3) - size_mm = float(marker.get('size', default_size_mm)) - markers[marker_id] = { - 'marker_id': marker_id, - 'link_name': link_name, - 'position_m': np.asarray([pos[0] * scale, pos[1] * scale, pos[2] * scale], dtype=np.float64), - 'normal': normalize_axis(resolve_vector(marker.get('normal', [0, 0, 1]), 3)), - 'spin_deg': float(marker.get('spin', 0.0)), - 'size_m': size_mm * scale, - } - - return markers - - -def compute_marker_observation_quality( - corners_px: np.ndarray, - image_shape: Tuple[int, int] -) -> Dict[str, float]: - """ - Compute quality metrics for a marker observation based on: - - Orientation/distortion in the image - - Size (distance) to camera - - Returns dict with: - - 'orientation_quality': 0..1 (1 = frontal, 0 = very skewed) - - 'size_quality': 0..1 (1 = reasonable size, 0 = too small or too large) - - 'combined_quality': product of both - """ - if corners_px.shape[0] != 4: - return { - 'orientation_quality': 0.5, - 'size_quality': 0.5, - 'combined_quality': 0.25 - } - - # Compute edge lengths - corners = corners_px.astype(np.float64) - edges = [ - np.linalg.norm(corners[(i+1) % 4] - corners[i]) - for i in range(4) - ] - - # Orientation quality: low aspect ratio means frontal (1.0 = square) - aspect_ratio = max(edges) / (min(edges) + 1e-6) - # For aspect ratio 1.0->1, 1.5->0.8, 3.0->0.4, 5.0->0.2 - orientation_quality = max(0.1, 2.0 / (1.0 + aspect_ratio)) - - # Size quality: area-based - area_px = cv2.contourArea(corners.astype(np.int32)) - image_area = image_shape[0] * image_shape[1] - - # Ideal: marker should be 5-20% of image area - # Too small: <1%, too large: >40% - area_ratio = area_px / image_area - - if area_ratio < 0.01: - size_quality = 0.3 + area_ratio * 20 # linear growth 0-0.3 - elif area_ratio > 0.4: - size_quality = 0.3 + (1.0 - area_ratio) * 2.33 # linear decay from 1.0 - else: - # 1% to 40%: bell curve, max at ~5-20% - ideal_ratio = 0.10 - size_quality = 1.0 - (area_ratio - ideal_ratio) ** 2 / (0.15 ** 2) - size_quality = max(0.3, min(1.0, size_quality)) - - combined_quality = orientation_quality * size_quality - - return { - 'orientation_quality': float(orientation_quality), - 'size_quality': float(size_quality), - 'combined_quality': float(combined_quality) - } - - -def marker_plane_axes(normal: np.ndarray, spin_deg: float) -> Tuple[np.ndarray, np.ndarray]: - n = normalize_axis(normal) - candidate = np.array((0.0, 0.0, 1.0), dtype=np.float64) - if abs(np.dot(n, candidate)) > 0.99: - candidate = np.array((1.0, 0.0, 0.0), dtype=np.float64) - - x_dir = np.cross(candidate, n) - x_dir /= max(np.linalg.norm(x_dir), 1e-9) - y_dir = np.cross(n, x_dir) - - if abs(spin_deg) > 1e-6: - theta = math.radians(spin_deg) - cos_t = math.cos(theta) - sin_t = math.sin(theta) - x_rot = x_dir * cos_t + np.cross(n, x_dir) * sin_t + n * np.dot(n, x_dir) * (1.0 - cos_t) - y_rot = y_dir * cos_t + np.cross(n, y_dir) * sin_t + n * np.dot(n, y_dir) * (1.0 - cos_t) - return x_rot, y_rot - - return x_dir, y_dir - - -def marker_object_corners(marker: Dict[str, Any]) -> np.ndarray: - half = marker['size_m'] * 0.5 - x_dir, y_dir = marker_plane_axes(marker['normal'], marker['spin_deg']) - corners = np.stack([ - -x_dir * half + y_dir * half, - x_dir * half + y_dir * half, - x_dir * half - y_dir * half, - -x_dir * half - y_dir * half - ], axis=0) - return marker['position_m'].reshape(1, 3) + corners - - -def build_link_chain(robot: Dict[str, Any]) -> List[str]: - links = robot.get('links', {}) or {} - ordered: List[str] = [] - remaining = set(links.keys()) - - while remaining: - progress = False - for name in list(remaining): - parent = links[name].get('parent') - if not parent or parent in ordered: - ordered.append(name) - remaining.remove(name) - progress = True - if not progress: - raise RuntimeError('Cycle detected in robot link tree or missing parent link') - return ordered - - -def compute_link_transforms(robot: Dict[str, Any], state: Dict[str, float], scale: float) -> Dict[str, np.ndarray]: - links = robot.get('links', {}) or {} - ordered_links = build_link_chain(robot) - transforms: Dict[str, np.ndarray] = {} - - for link_name in ordered_links: - link_info = links[link_name] or {} - parent_name = link_info.get('parent') - parent_transform = transforms[parent_name] if parent_name else np.eye(4, dtype=np.float64) - - mount_translation = np.asarray(resolve_vector(link_info.get('mountPosition', [0, 0, 0]), 3), dtype=np.float64) * scale - mount = transform_from_translation_rotation( - mount_translation, - link_info.get('mountRotation', [0, 0, 0]) - ) - - joint_info = link_info.get('jointToParent', {}) or {} - joint_origin = np.asarray(resolve_vector(joint_info.get('origin', [0, 0, 0]), 3), dtype=np.float64) * scale - joint = transform_from_translation_rotation( - joint_origin, - joint_info.get('rotation', [0, 0, 0]) - ) - - motion = np.eye(4, dtype=np.float64) - joint_type = str(joint_info.get('type', 'fixed')).strip().lower() - control_var = str(joint_info.get('variable', joint_info.get('control', ''))).strip().lower() - axis = resolve_vector(joint_info.get('axis', [1, 0, 0]), 3) - - if joint_type == 'linear': - motion[:3, 3] = normalize_axis(axis) * state.get(control_var, 0.0) * scale - elif joint_type == 'revolute': - motion = axis_angle_matrix(axis, state.get(control_var, 0.0)) - - transforms[link_name] = parent_transform @ mount @ joint @ motion - - return transforms - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = np.ones(4, dtype=np.float64) - local[:3] = marker['position_m'] - world = link_transform @ local - return world[:3] - - -# ------------------------------------------------------------------ -# Camera / observation helpers -# ------------------------------------------------------------------ - -def load_intrinsics(detection_json: Dict[str, Any]) -> Tuple[np.ndarray, np.ndarray]: - cam = detection_json['camera'] - K = np.asarray(cam['camera_matrix'], dtype=np.float64) - D = np.asarray(cam.get('distortion_coefficients', [0, 0, 0, 0, 0]), dtype=np.float64).reshape(-1, 1) - return K, D - - -def collect_views_and_observations( - detection_files: List[str], - robot_markers: Dict[int, Dict[str, Any]] -) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]: - views: List[Dict[str, Any]] = [] - observations: List[Dict[str, Any]] = [] - - for idx, det_path in enumerate(detection_files): - detection_json = load_json(det_path) - K, D = load_intrinsics(detection_json) - image_shape = detection_json.get('image', {}).get('image_shape') - if not image_shape: - image_shape = (720, 1280) # fallback - - views.append({ - 'index': idx, - 'source_file': os.path.abspath(det_path), - 'camera_id': detection_json.get('camera', {}).get('camera_id', f'cam{idx+1}'), - 'image_file': detection_json.get('image', {}).get('image_file'), - 'image_shape': image_shape, - 'K': K, - 'D': D - }) - - for det in detection_json.get('detections', []) or []: - marker_id = int(det.get('marker_id', -1)) - if marker_id < 0 or marker_id not in robot_markers: - continue - - image_points = det.get('image_points_px') - if isinstance(image_points, list) and len(image_points) == 4: - image_points = np.asarray(image_points, dtype=np.float64) - else: - center = resolve_vector(det.get('center_px', [0, 0]), 2) - image_points = np.asarray([center], dtype=np.float64) - - confidence = float(det.get('confidence', 1.0)) - - # Compute observation quality metrics - quality_metrics = compute_marker_observation_quality(image_points, tuple(image_shape)) - - # Blend base confidence and observation quality instead of multiplying them. - # Reduce the distance/size-based quality influence by roughly 40% relative to the previous blend. - base_confidence = max(0.01, min(1.0, confidence)) - combined_quality = quality_metrics['combined_quality'] - combined_confidence = base_confidence * 0.76 + combined_quality * 0.24 - - marker = robot_markers[marker_id] - observations.append({ - 'view_index': idx, - 'marker_id': marker_id, - 'marker_link_corners': marker_object_corners(marker), - 'image_points_px': image_points, - 'confidence_base': base_confidence, - 'quality_metrics': quality_metrics, - 'confidence': max(0.01, min(1.0, combined_confidence)) - }) - - if len(views) == 0: - raise RuntimeError('No valid detection views found') - - if len(observations) == 0: - raise RuntimeError('No marker observations matched robot.json markers') - - return views, observations - - -def compute_marker_world_corners(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = marker_object_corners(marker) - homogeneous = np.concatenate([local, np.ones((local.shape[0], 1), dtype=np.float64)], axis=1) - world = (link_transform @ homogeneous.T).T - return world[:, :3] - - -def initial_camera_guess( - view: Dict[str, Any], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - default_state: Dict[str, float], - scale: float, - robot: Dict[str, Any] -) -> Tuple[np.ndarray, np.ndarray]: - object_points = [] - image_points = [] - - link_transforms = compute_link_transforms(robot, default_state, scale) - - for obs in observations: - if obs['view_index'] != view['index']: - continue - marker = robot_markers[obs['marker_id']] - object_points.append(compute_marker_world_corners(marker, link_transforms)) - image_points.append(obs['image_points_px']) - - if len(object_points) == 0: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - object_points = np.vstack(object_points) - image_points = np.vstack(image_points) - - if object_points.shape[0] < 4: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - success, rvec, tvec = cv2.solvePnP( - object_points, - image_points, - view['K'], - view['D'], - flags=cv2.SOLVEPNP_ITERATIVE - ) - - if not success: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - return rvec, tvec - - -def project_points( - points_3d: np.ndarray, - rvec: np.ndarray, - tvec: np.ndarray, - K: np.ndarray, - D: np.ndarray -) -> np.ndarray: - projected, _ = cv2.projectPoints(points_3d, rvec, tvec, K, D) - return projected.reshape(-1, 2) - - -def compute_soft_constraint_residuals( - robot_state: Dict[str, float], - robot_markers: Dict[int, Dict[str, Any]], - link_transforms: Dict[str, np.ndarray], - robot: Dict[str, Any], - enabled_constraints: Dict[str, ConstraintResult] -) -> List[float]: - """ - Compute residuals from soft constraints (kinematic consistency, rigid body distances). - Returns a list of constraint residuals to append to the total residual vector. - """ - residuals = [] - weight_scale = 0.1 # Weight for soft constraints relative to reprojection errors - - # Constraint 1: Rigid body distances within each link - if enabled_constraints['RigidBodyDistances'].enabled: - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) < 2: - continue - - # Compute all pairwise distances in world coords - for i in range(len(link_markers)): - for j in range(i + 1, len(link_markers)): - m_i = link_markers[i] - m_j = link_markers[j] - - pos_i = compute_marker_world_position(m_i, link_transforms) - pos_j = compute_marker_world_position(m_j, link_transforms) - - dist_world = np.linalg.norm(pos_i - pos_j) - - # Reference distance in local coords - dist_local = np.linalg.norm(m_i['position_m'] - m_j['position_m']) - - # Residual: difference should be zero (rigid body) - error = dist_world - dist_local - residuals.append(error * weight_scale * 0.1) # Very soft weight - - # Constraint 2: Fixed X-distances between links (Arm1 <-> Ellbow) - if enabled_constraints['InterLinkXDistances'].enabled: - arm1_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm1'] - ellbow_markers = [m for m in robot_markers.values() if m['link_name'] == 'Ellbow'] - - if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: - # Get first marker from each link - m_arm1 = arm1_markers[0] - m_ellbow = ellbow_markers[0] - - pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) - pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) - - # X-distance in world should match reference (relative position) - # Since both rotate around X-axis at different points, we check consistency - x_diff_world = pos_ellbow[0] - pos_arm1[0] - x_diff_ref = m_ellbow['position_m'][0] - m_arm1['position_m'][0] - - error = x_diff_world - x_diff_ref - residuals.append(error * weight_scale) - - return residuals - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - """Compute the world position of a marker given current link transforms.""" - link_transform = link_transforms[marker['link_name']] - local_pos = np.concatenate([marker['position_m'], [1.0]]) - world_pos = (link_transform @ local_pos)[:3] - return world_pos - - -# ------------------------------------------------------------------ -# Optimization -# ------------------------------------------------------------------ - -def pack_parameters(robot_state: Dict[str, float], camera_params: List[Tuple[np.ndarray, np.ndarray]]) -> np.ndarray: - state_vec = np.asarray([robot_state[k] for k in STATE_KEYS], dtype=np.float64) - cams = [] - for rvec, tvec in camera_params: - cams.append(rvec.reshape(3)) - cams.append(tvec.reshape(3)) - return np.concatenate([state_vec] + cams) - - -def unpack_parameters(params: np.ndarray, n_views: int) -> Tuple[Dict[str, float], List[Tuple[np.ndarray, np.ndarray]]]: - robot_state = {STATE_KEYS[i]: float(params[i]) for i in range(len(STATE_KEYS))} - camera_params = [] - offset = len(STATE_KEYS) - for _ in range(n_views): - rvec = params[offset:offset + 3].reshape(3, 1) - tvec = params[offset + 3:offset + 6].reshape(3, 1) - camera_params.append((rvec, tvec)) - offset += 6 - return robot_state, camera_params - - -def residuals_for_parameters( - params: np.ndarray, - views: List[Dict[str, Any]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - robot: Dict[str, Any], - scale: float, - default_state: Dict[str, float], - enabled_constraints: Dict[str, ConstraintResult] -) -> np.ndarray: - robot_state, camera_params = unpack_parameters(params, len(views)) - link_transforms = compute_link_transforms(robot, robot_state, scale) - - residuals = [] - - # Reprojection residuals (primary observation) - for obs in observations: - marker = robot_markers[obs['marker_id']] - world_corners = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(world_corners, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - weight = math.sqrt(obs['confidence']) - residuals.extend((diffs * weight).reshape(-1)) - - # Weak priors on robot state - for key in STATE_KEYS: - diff = robot_state[key] - default_state.get(key, 0.0) - if key in ('x', 'y', 'z', 'e'): - w = 0.001 - else: - w = 0.01 - residuals.append(diff * w) - - # Soft constraints (kinematic consistency, rigid body constraints) - soft_constraint_residuals = compute_soft_constraint_residuals( - robot_state, robot_markers, link_transforms, robot, enabled_constraints - ) - residuals.extend(soft_constraint_residuals) - - return np.asarray(residuals, dtype=np.float64) - - - -def estimate_uncertainty(result: Any, n_params: int) -> np.ndarray: - if result.jac is None: - return np.full(n_params, float('nan'), dtype=np.float64) - J = result.jac - m, n = J.shape - JTJ = J.T @ J - try: - cov = np.linalg.pinv(JTJ) - except np.linalg.LinAlgError: - cov = np.linalg.pinv(JTJ + np.eye(n) * 1e-9) - residuals = result.fun - dof = max(1, m - n) - sigma2 = float(np.sum(residuals ** 2) / dof) - cov *= sigma2 - return np.sqrt(np.diag(cov)) - - -def print_constraint_sanity_check( - robot_state: Dict[str, float], - robot_markers: Dict[int, Dict[str, Any]], - link_transforms: Dict[str, np.ndarray], - robot: Dict[str, Any], - enabled_constraints: Dict[str, ConstraintResult] -) -> None: - """ - Print sanity checks for all constraints to verify the optimization result. - """ - print("\n" + "=" * 70) - print("CONSTRAINT SANITY CHECKS (after optimization)") - print("=" * 70) - - # Check 1: Rigid body distances - if enabled_constraints['RigidBodyDistances'].enabled: - print("\n1. RIGID BODY DISTANCES") - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) < 2: - continue - - max_error = 0.0 - for i in range(len(link_markers)): - for j in range(i + 1, len(link_markers)): - m_i = link_markers[i] - m_j = link_markers[j] - - pos_i = compute_marker_world_position(m_i, link_transforms) - pos_j = compute_marker_world_position(m_j, link_transforms) - - dist_world = np.linalg.norm(pos_i - pos_j) - dist_local = np.linalg.norm(m_i['position_m'] - m_j['position_m']) - error = abs(dist_world - dist_local) - max_error = max(max_error, error) - - status = "✓" if max_error < 1.0 else "⚠" if max_error < 5.0 else "✗" - print(f" {link_name:10s}: max_error = {max_error:.3f} mm {status}") - - # Check 2: Inter-link X distances - if enabled_constraints['InterLinkXDistances'].enabled: - print("\n2. INTER-LINK X-DISTANCES") - arm1_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm1'] - ellbow_markers = [m for m in robot_markers.values() if m['link_name'] == 'Ellbow'] - - if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: - m_arm1 = arm1_markers[0] - m_ellbow = ellbow_markers[0] - - pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) - pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) - - x_diff_world = pos_ellbow[0] - pos_arm1[0] - x_diff_ref = m_ellbow['position_m'][0] - m_arm1['position_m'][0] - error = abs(x_diff_world - x_diff_ref) - - status = "✓" if error < 1.0 else "⚠" if error < 5.0 else "✗" - print(f" Arm1 <-> Ellbow: error = {error:.3f} mm {status}") - - # Check 3: Arm2 sin(a) dependency - if enabled_constraints['Arm2SinADependency'].enabled: - print("\n3. ARM2 sin(a) DEPENDENCY (sanity check)") - arm2_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm2'] - if len(arm2_markers) >= 2: - # Check that markers with different Z values have different X spreads - a_rad = math.radians(robot_state['a']) - sin_a = math.sin(a_rad) - cos_a = math.cos(a_rad) - - z_variations = {} - for m in arm2_markers: - z_local = m['position_m'][2] - x_local = m['position_m'][0] - pos_world = compute_marker_world_position(m, link_transforms) - x_world = pos_world[0] - - # Expected: x_world = 90 + x_local * cos(a) - z_local * sin(a) - x_expected = 90 * (robot.get('renderingInfo', {}).get('metric', 'mm') == 'mm' and 0.09 or 0.09) + x_local * cos_a - z_local * sin_a - x_error = abs(x_world - x_expected) - - if z_local not in z_variations: - z_variations[z_local] = [] - z_variations[z_local].append(x_error) - - max_error = max(max(errors) for errors in z_variations.values()) if z_variations else 0.0 - status = "✓" if max_error < 5.0 else "⚠" if max_error < 10.0 else "⚠" - print(f" X-consistency with sin(a): max_error = {max_error:.3f} mm {status}") - print(f" (Note: this is a consistency check, not a hard constraint)") - - print("=" * 70) - - -def camera_position_world(rvec: np.ndarray, tvec: np.ndarray) -> np.ndarray: - R, _ = cv2.Rodrigues(rvec) - return (-R.T @ tvec).reshape(3) - - -def build_output( - robot_state: Dict[str, float], - state_uncertainty: np.ndarray, - views: List[Dict[str, Any]], - camera_params: List[Tuple[np.ndarray, np.ndarray]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - scale: float, - robot: Dict[str, Any], - robot_json_path: str -) -> Dict[str, Any]: - link_transforms = compute_link_transforms(robot, robot_state, scale) - - marker_summary: Dict[int, Dict[str, Any]] = {} - for marker_id, marker in robot_markers.items(): - marker_summary[marker_id] = { - 'marker_id': marker_id, - 'link_name': marker['link_name'], - 'position_world_m': compute_marker_world_position(marker, link_transforms).tolist(), - 'size_m': marker['size_m'], - 'observation_count': 0, - 'mean_confidence': None, - 'mean_reprojection_error_px': None, - 'observations': [] - } - - per_marker_errors: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - per_marker_confidences: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - - link_transforms = compute_link_transforms(robot, robot_state, scale) - for obs in observations: - marker_id = obs['marker_id'] - marker = robot_markers[marker_id] - object_points_m = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(object_points_m, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - errors = np.linalg.norm(diffs, axis=1) - repro_error = float(np.mean(errors)) - per_marker_errors[marker_id].extend(errors.tolist()) - per_marker_confidences[marker_id].append(obs['confidence']) - marker_summary[marker_id]['observation_count'] += 1 - marker_summary[marker_id]['observations'].append({ - 'view_index': obs['view_index'], - 'source_file': views[obs['view_index']]['source_file'], - 'image_file': views[obs['view_index']]['image_file'], - 'confidence': obs['confidence'], - 'mean_reprojection_error_px': repro_error, - 'corner_reprojection_errors_px': errors.tolist() - }) - - for marker_id, summary in marker_summary.items(): - if summary['observation_count'] > 0: - summary['mean_confidence'] = float(np.mean(per_marker_confidences[marker_id])) - summary['mean_reprojection_error_px'] = float(np.mean(per_marker_errors[marker_id])) - - camera_outputs = [] - for idx, view in enumerate(views): - rvec, tvec = camera_params[idx] - cam_pos = camera_position_world(rvec, tvec) - observed_count = sum(1 for obs in observations if obs['view_index'] == idx) - camera_outputs.append({ - 'view_index': idx, - 'source_file': view['source_file'], - 'camera_id': view['camera_id'], - 'camera_position_world_m': cam_pos.tolist(), - 'rvec': rvec.reshape(-1).tolist(), - 'tvec': tvec.reshape(-1).tolist(), - 'intrinsics': { - 'camera_matrix': view['K'].tolist(), - 'distortion_coefficients': view['D'].reshape(-1).tolist() - }, - 'observation_count': observed_count - }) - - robot_pose_output = { - 'state': {k: float(robot_state[k]) for k in STATE_KEYS}, - 'uncertainty': { - 'x_mm': float(state_uncertainty[0]), - 'y_mm': float(state_uncertainty[1]), - 'z_mm': float(state_uncertainty[2]), - 'a_deg': float(state_uncertainty[3]), - 'b_deg': float(state_uncertainty[4]), - 'c_deg': float(state_uncertainty[5]), - 'e_mm': float(state_uncertainty[6]) - }, - 'confidence': { - 'x': float(math.exp(-state_uncertainty[0] / 10.0)), - 'y': float(math.exp(-state_uncertainty[1] / 10.0)), - 'z': float(math.exp(-state_uncertainty[2] / 10.0)), - 'a': float(math.exp(-state_uncertainty[3] / 10.0)), - 'b': float(math.exp(-state_uncertainty[4] / 10.0)), - 'c': float(math.exp(-state_uncertainty[5] / 10.0)), - 'e': float(math.exp(-state_uncertainty[6] / max(1.0, state_uncertainty[6]))) - } - } - - return { - 'schema_version': '1.0', - 'created_utc': datetime.datetime.utcnow().isoformat() + 'Z', - 'source_robot_json': os.path.abspath(robot_json_path), - 'source_detections': [view['source_file'] for view in views], - 'robot_pose': robot_pose_output, - 'camera_poses': camera_outputs, - 'marker_positions': list(marker_summary.values()) - } - - -# ------------------------------------------------------------------ -# Main -# ------------------------------------------------------------------ - -def main() -> None: - parser = argparse.ArgumentParser(description='Multiview optimization of robot pose and camera extrinsics') - parser.add_argument('--robot', required=True, help='Path to robot.json') - parser.add_argument('--detections', required=True, nargs='+', help='List of detection JSON files') - parser.add_argument('--outDir', required=True, help='Output directory') - parser.add_argument('--write-summary', action='store_true', help='Write summary file') - parser.add_argument('--max-iter', type=int, default=500, help='Maximum optimizer iterations') - args = parser.parse_args() - - os.makedirs(args.outDir, exist_ok=True) - - robot_json_path = os.path.abspath(args.robot) - robot = load_json(robot_json_path) - scale = parse_metric_scale(robot) - - default_state = { - k: float(robot.get('defaultPosition', {}).get(k, 0.0) or 0.0) - for k in STATE_KEYS - } - - robot_markers = extract_markers(robot, scale) - - # Validate constraints - print("\n" + "=" * 70) - print("CONSTRAINT VALIDATION") - print("=" * 70) - enabled_constraints = validate_constraints(robot, robot_markers) - for constraint_name, result in enabled_constraints.items(): - print(result) - print("=" * 70) - - views, observations = collect_views_and_observations(args.detections, robot_markers) - - # Print observation quality summary - print("\n" + "=" * 70) - print("OBSERVATION QUALITY SUMMARY") - print("=" * 70) - print(f"Total observations: {len(observations)}") - print() - - # Aggregate quality metrics - quality_by_marker = {} - for obs in observations: - mid = obs['marker_id'] - if mid not in quality_by_marker: - quality_by_marker[mid] = [] - quality_by_marker[mid].append(obs['quality_metrics']) - - print(f"{'Marker':>8} {'Link':>12} {'Count':>6} {'Avg Orient.':>12} {'Avg Size':>12} {'Avg Conf.':>12}") - print("-" * 70) - for marker_id in sorted(quality_by_marker.keys()): - marker = robot_markers[marker_id] - quality_list = quality_by_marker[marker_id] - avg_orient = np.mean([q['orientation_quality'] for q in quality_list]) - avg_size = np.mean([q['size_quality'] for q in quality_list]) - - obs_for_marker = [o for o in observations if o['marker_id'] == marker_id] - avg_conf = np.mean([o['confidence'] for o in obs_for_marker]) - - print(f"{marker_id:8d} {marker['link_name']:>12} {len(quality_list):6d} " - f"{avg_orient:12.3f} {avg_size:12.3f} {avg_conf:12.3f}") - print("=" * 70) - - camera_guesses = [] - for view in views: - rvec, tvec = initial_camera_guess(view, observations, robot_markers, default_state, scale, robot) - camera_guesses.append((rvec, tvec)) - - - x0 = pack_parameters(default_state, camera_guesses) - - progress = { - 'iter': 0, - 'last_cost': None, - 'last_print': time.time(), - 'prev_x': x0.copy() - } - - def progress_callback(xk: np.ndarray) -> None: - progress['iter'] += 1 - now = time.time() - if progress['iter'] == 1 or now - progress['last_print'] >= 1.0: - res = residuals_for_parameters(xk, views, observations, robot_markers, robot, scale, default_state, enabled_constraints) - cost = 0.5 * float(np.dot(res, res)) - delta_cost = None - convergence = '' - if progress['last_cost'] is not None: - delta_cost = cost - progress['last_cost'] - if abs(delta_cost) < 1e-3: - convergence = ' stable' - elif delta_cost < 0: - convergence = ' improving' - else: - convergence = ' worsening' - step_norm = float(np.linalg.norm(xk - progress['prev_x'])) - print( - f'[Multiview] iter={progress["iter"]:4d} cost={cost:.4f}' - + (f' delta={delta_cost:.4g}' if delta_cost is not None else '') - + f' step={step_norm:.4g}' - + convergence - ) - progress['last_cost'] = cost - progress['last_print'] = now - progress['prev_x'] = xk.copy() - - result = least_squares( - residuals_for_parameters, - x0, - args=(views, observations, robot_markers, robot, scale, default_state, enabled_constraints), - jac='2-point', - method='trf', - loss='soft_l1', - f_scale=1.0, - max_nfev=args.max_iter, - callback=progress_callback - ) - - robot_state, camera_params = unpack_parameters(result.x, len(views)) - uncertainties = estimate_uncertainty(result, len(result.x)) - - # Print constraint sanity checks - link_transforms = compute_link_transforms(robot, robot_state, scale) - print_constraint_sanity_check(robot_state, robot_markers, link_transforms, robot, enabled_constraints) - - output = build_output(robot_state, uncertainties[:len(STATE_KEYS)], views, camera_params, observations, robot_markers, scale, robot, robot_json_path) - - out_path = Path(args.outDir) / 'multiview_pose.json' - save_json(output, out_path) - - print(f'Saved: {out_path}') - if args.write_summary: - summary_path = Path(args.outDir) / 'multiview_pose_summary.json' - summary = { - 'final_cost': float(result.cost), - 'status': int(result.status), - 'message': result.message, - 'robot_state': output['robot_pose'], - 'camera_count': len(views), - 'marker_count': len(robot_markers) - } - save_json(summary, summary_path) - print(f'Saved: {summary_path}') - - -if __name__ == '__main__': - main() diff --git a/pipeline/2_Multiview_confidence_fehlt.py b/pipeline/2_Multiview_confidence_fehlt.py deleted file mode 100644 index 948fb88..0000000 --- a/pipeline/2_Multiview_confidence_fehlt.py +++ /dev/null @@ -1,787 +0,0 @@ -#!/usr/bin/env python3 - -""" -============================================================ -STEP 2b — Simultane Multiview-Optimierung für Roboterpose -============================================================ - -Ziel: - Aus mehreren ArUco-Detektionsdateien die gemeinsame - Roboterpose (x,y,z,a,b,c,e) schätzen und jede Kamera-Pose - sowie Marker-Weltpositionen ausgeben. - -Eingabe: - --robot ../robot.json - --detections render_1a_aruco_detection.json render_1b_aruco_detection.json ... - --outDir . - -Ausgabe: - multiview_pose.json - -Hinweis: - Dieses Skript verwendet die Markerpositionen aus robot.json - als kinematische Constraints und optimiert gleichzeitig: - - Roboterzustand (x,y,z,a,b,c,e) - - Kameraextrinsische Parameter pro Bild - -""" - -import argparse -import datetime -import json -import math -import os -import time -from pathlib import Path -from typing import Any, Dict, List, Tuple - -import cv2 -import numpy as np -from scipy.optimize import least_squares - -STATE_KEYS = ["x", "y", "z", "a", "b", "c", "e"] - -# ------------------------------------------------------------------ -# Constraint definitions and validation -# ------------------------------------------------------------------ - -class ConstraintResult: - """Result of validating/applying a single constraint""" - def __init__(self, name: str, enabled: bool, reason: str = ""): - self.name = name - self.enabled = enabled - self.reason = reason - self.residuals = [] - - def __str__(self) -> str: - status = "✓ ENABLED" if self.enabled else "✗ DISABLED" - return f"{self.name:40s} {status:12s} {self.reason}" - - -def validate_constraints(robot: Dict[str, Any], robot_markers: Dict[int, Dict[str, Any]]) -> Dict[str, ConstraintResult]: - """ - Validate which constraints can be applied based on robot geometry. - Returns a dict of constraint_name -> ConstraintResult - """ - results = {} - - # --- Constraint 1: Rigid body distances within each link --- - rigid_body_result = ConstraintResult("RigidBodyDistances", False) - try: - rigid_body_count = 0 - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) >= 2: - rigid_body_count += 1 - if rigid_body_count >= 2: - rigid_body_result.enabled = True - rigid_body_result.reason = f"Found {rigid_body_count} links with 2+ markers each" - else: - rigid_body_result.reason = "Not enough rigid links with multiple markers" - except Exception as e: - rigid_body_result.reason = f"Error: {str(e)}" - results['RigidBodyDistances'] = rigid_body_result - - # --- Constraint 2: Fixed X-distances between links (rotation around X-axis) --- - inter_link_x_result = ConstraintResult("InterLinkXDistances", False) - try: - links_with_markers = set(m['link_name'] for m in robot_markers.values()) - x_rotated_links = [] - for link_name in ['Arm1', 'Ellbow']: - if link_name in links_with_markers: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) >= 1: - x_rotated_links.append(link_name) - if len(x_rotated_links) >= 2: - inter_link_x_result.enabled = True - inter_link_x_result.reason = f"Found {len(x_rotated_links)} X-rotation links: {', '.join(x_rotated_links)}" - else: - inter_link_x_result.reason = "Not enough X-rotation links" - except Exception as e: - inter_link_x_result.reason = f"Error: {str(e)}" - results['InterLinkXDistances'] = inter_link_x_result - - # --- Sanity check (not a hard constraint): Arm2 sin(a) dependency --- - arm2_sina_result = ConstraintResult("Arm2SinADependency", True, "Sanity check only (not enforced)") - try: - arm2_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm2'] - if len(arm2_markers) >= 2: - z_values = set(m['position_m'][2] for m in arm2_markers) - if len(z_values) > 1: - arm2_sina_result.enabled = True - arm2_sina_result.reason = "Multiple Z-values detected; sin(a) dependency confirmed" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "No Z-variation in Arm2 markers (cannot use sin(a) constraint)" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "Not enough Arm2 markers" - except Exception as e: - arm2_sina_result.reason = f"Error: {str(e)}" - results['Arm2SinADependency'] = arm2_sina_result - - return results - - -# ------------------------------------------------------------------ -# JSON helpers -# ------------------------------------------------------------------ - -def load_json(path: str) -> Dict[str, Any]: - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - - -def save_json(data: Dict[str, Any], path: Path) -> None: - with open(path, 'w', encoding='utf-8') as f: - json.dump(data, f, indent=2) - - -# ------------------------------------------------------------------ -# robot.json helpers -# ------------------------------------------------------------------ - -def resolve_scalar(value: Any, default: float = 0.0) -> float: - if value is None: - return default - if isinstance(value, (int, float)): - return float(value) - try: - return float(str(value).strip()) - except ValueError: - return default - - -def resolve_vector(value: Any, default_len: int = 3) -> Tuple[float, ...]: - if value is None: - return tuple(0.0 for _ in range(default_len)) - if isinstance(value, (int, float, str)): - return (resolve_scalar(value),) + tuple(0.0 for _ in range(default_len - 1)) - if isinstance(value, (list, tuple)): - resolved = [resolve_scalar(v) for v in value] - if len(resolved) < default_len: - resolved.extend([0.0] * (default_len - len(resolved))) - return tuple(resolved[:default_len]) - return tuple(0.0 for _ in range(default_len)) - - -def parse_metric_scale(robot: Dict[str, Any]) -> float: - rendering_info = robot.get('renderingInfo', {}) or {} - metric = rendering_info.get('metric', 'mm') - return 0.001 if str(metric).strip().lower() == 'mm' else 1.0 - - -def normalize_axis(axis: Any) -> np.ndarray: - vec = np.asarray(axis, dtype=np.float64) - if vec.shape != (3,): - vec = vec.reshape(-1)[:3] - norm = np.linalg.norm(vec) - return vec / max(norm, 1e-9) - - -def euler_deg_to_matrix(euler_deg: Any) -> np.ndarray: - x_deg, y_deg, z_deg = resolve_vector(euler_deg, 3) - x = math.radians(x_deg) - y = math.radians(y_deg) - z = math.radians(z_deg) - - cx = math.cos(x) - sx = math.sin(x) - cy = math.cos(y) - sy = math.sin(y) - cz = math.cos(z) - sz = math.sin(z) - - Rx = np.array([ - [1.0, 0.0, 0.0], - [0.0, cx, -sx], - [0.0, sx, cx] - ], dtype=np.float64) - - Ry = np.array([ - [cy, 0.0, sy], - [0.0, 1.0, 0.0], - [-sy, 0.0, cy] - ], dtype=np.float64) - - Rz = np.array([ - [cz, -sz, 0.0], - [sz, cz, 0.0], - [0.0, 0.0, 1.0] - ], dtype=np.float64) - - return Rz @ Ry @ Rx - - -def transform_from_translation_rotation(translation: Any, rotation_deg: Any) -> np.ndarray: - T = np.eye(4, dtype=np.float64) - pos = np.asarray(resolve_vector(translation, 3), dtype=np.float64) - T[:3, 3] = pos - T[:3, :3] = euler_deg_to_matrix(rotation_deg) - return T - - -def axis_angle_matrix(axis: Any, angle_deg: float) -> np.ndarray: - axis_vec = normalize_axis(axis) - theta = math.radians(angle_deg) - kx, ky, kz = axis_vec - c = math.cos(theta) - s = math.sin(theta) - v = 1.0 - c - R = np.array([ - [kx * kx * v + c, kx * ky * v - kz * s, kx * kz * v + ky * s], - [ky * kx * v + kz * s, ky * ky * v + c, ky * kz * v - kx * s], - [kz * kx * v - ky * s, kz * ky * v + kx * s, kz * kz * v + c] - ], dtype=np.float64) - T = np.eye(4, dtype=np.float64) - T[:3, :3] = R - return T - - -# ------------------------------------------------------------------ -# Kinematics and marker extraction -# ------------------------------------------------------------------ - -def extract_markers(robot: Dict[str, Any], scale: float) -> Dict[int, Dict[str, Any]]: - markers = {} - links = robot.get('links', {}) or {} - marker_defaults = (robot.get('renderingInfo', {}) or {}).get('markerDefaults', {}) or {} - default_size_mm = float(marker_defaults.get('size', 25.0)) - - for link_name, link_info in links.items(): - for marker in link_info.get('markers', []) or []: - marker_id = int(marker.get('id', -1)) - if marker_id < 0: - continue - - pos = resolve_vector(marker.get('position', [0, 0, 0]), 3) - size_mm = float(marker.get('size', default_size_mm)) - markers[marker_id] = { - 'marker_id': marker_id, - 'link_name': link_name, - 'position_m': np.asarray([pos[0] * scale, pos[1] * scale, pos[2] * scale], dtype=np.float64), - 'normal': normalize_axis(resolve_vector(marker.get('normal', [0, 0, 1]), 3)), - 'spin_deg': float(marker.get('spin', 0.0)), - 'size_m': size_mm * scale, - } - - return markers - - -def marker_plane_axes(normal: np.ndarray, spin_deg: float) -> Tuple[np.ndarray, np.ndarray]: - n = normalize_axis(normal) - candidate = np.array((0.0, 0.0, 1.0), dtype=np.float64) - if abs(np.dot(n, candidate)) > 0.99: - candidate = np.array((1.0, 0.0, 0.0), dtype=np.float64) - - x_dir = np.cross(candidate, n) - x_dir /= max(np.linalg.norm(x_dir), 1e-9) - y_dir = np.cross(n, x_dir) - - if abs(spin_deg) > 1e-6: - theta = math.radians(spin_deg) - cos_t = math.cos(theta) - sin_t = math.sin(theta) - x_rot = x_dir * cos_t + np.cross(n, x_dir) * sin_t + n * np.dot(n, x_dir) * (1.0 - cos_t) - y_rot = y_dir * cos_t + np.cross(n, y_dir) * sin_t + n * np.dot(n, y_dir) * (1.0 - cos_t) - return x_rot, y_rot - - return x_dir, y_dir - - -def marker_object_corners(marker: Dict[str, Any]) -> np.ndarray: - half = marker['size_m'] * 0.5 - x_dir, y_dir = marker_plane_axes(marker['normal'], marker['spin_deg']) - corners = np.stack([ - -x_dir * half + y_dir * half, - x_dir * half + y_dir * half, - x_dir * half - y_dir * half, - -x_dir * half - y_dir * half - ], axis=0) - return marker['position_m'].reshape(1, 3) + corners - - -def build_link_chain(robot: Dict[str, Any]) -> List[str]: - links = robot.get('links', {}) or {} - ordered: List[str] = [] - remaining = set(links.keys()) - - while remaining: - progress = False - for name in list(remaining): - parent = links[name].get('parent') - if not parent or parent in ordered: - ordered.append(name) - remaining.remove(name) - progress = True - if not progress: - raise RuntimeError('Cycle detected in robot link tree or missing parent link') - return ordered - - -def compute_link_transforms(robot: Dict[str, Any], state: Dict[str, float], scale: float) -> Dict[str, np.ndarray]: - links = robot.get('links', {}) or {} - ordered_links = build_link_chain(robot) - transforms: Dict[str, np.ndarray] = {} - - for link_name in ordered_links: - link_info = links[link_name] or {} - parent_name = link_info.get('parent') - parent_transform = transforms[parent_name] if parent_name else np.eye(4, dtype=np.float64) - - mount_translation = np.asarray(resolve_vector(link_info.get('mountPosition', [0, 0, 0]), 3), dtype=np.float64) * scale - mount = transform_from_translation_rotation( - mount_translation, - link_info.get('mountRotation', [0, 0, 0]) - ) - - joint_info = link_info.get('jointToParent', {}) or {} - joint_origin = np.asarray(resolve_vector(joint_info.get('origin', [0, 0, 0]), 3), dtype=np.float64) * scale - joint = transform_from_translation_rotation( - joint_origin, - joint_info.get('rotation', [0, 0, 0]) - ) - - motion = np.eye(4, dtype=np.float64) - joint_type = str(joint_info.get('type', 'fixed')).strip().lower() - control_var = str(joint_info.get('variable', joint_info.get('control', ''))).strip().lower() - axis = resolve_vector(joint_info.get('axis', [1, 0, 0]), 3) - - if joint_type == 'linear': - motion[:3, 3] = normalize_axis(axis) * state.get(control_var, 0.0) * scale - elif joint_type == 'revolute': - motion = axis_angle_matrix(axis, state.get(control_var, 0.0)) - - transforms[link_name] = parent_transform @ mount @ joint @ motion - - return transforms - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = np.ones(4, dtype=np.float64) - local[:3] = marker['position_m'] - world = link_transform @ local - return world[:3] - - -# ------------------------------------------------------------------ -# Camera / observation helpers -# ------------------------------------------------------------------ - -def load_intrinsics(detection_json: Dict[str, Any]) -> Tuple[np.ndarray, np.ndarray]: - cam = detection_json['camera'] - K = np.asarray(cam['camera_matrix'], dtype=np.float64) - D = np.asarray(cam.get('distortion_coefficients', [0, 0, 0, 0, 0]), dtype=np.float64).reshape(-1, 1) - return K, D - - -def collect_views_and_observations( - detection_files: List[str], - robot_markers: Dict[int, Dict[str, Any]] -) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]: - views: List[Dict[str, Any]] = [] - observations: List[Dict[str, Any]] = [] - - for idx, det_path in enumerate(detection_files): - detection_json = load_json(det_path) - K, D = load_intrinsics(detection_json) - views.append({ - 'index': idx, - 'source_file': os.path.abspath(det_path), - 'camera_id': detection_json.get('camera', {}).get('camera_id', f'cam{idx+1}'), - 'image_file': detection_json.get('image', {}).get('image_file'), - 'K': K, - 'D': D - }) - - for det in detection_json.get('detections', []) or []: - marker_id = int(det.get('marker_id', -1)) - if marker_id < 0 or marker_id not in robot_markers: - continue - - image_points = det.get('image_points_px') - if isinstance(image_points, list) and len(image_points) == 4: - image_points = np.asarray(image_points, dtype=np.float64) - else: - center = resolve_vector(det.get('center_px', [0, 0]), 2) - image_points = np.asarray([center], dtype=np.float64) - - confidence = float(det.get('confidence', 1.0)) - marker = robot_markers[marker_id] - observations.append({ - 'view_index': idx, - 'marker_id': marker_id, - 'marker_link_corners': marker_object_corners(marker), - 'image_points_px': image_points, - 'confidence': max(0.01, min(1.0, confidence)) - }) - - if len(views) == 0: - raise RuntimeError('No valid detection views found') - - if len(observations) == 0: - raise RuntimeError('No marker observations matched robot.json markers') - - return views, observations - - -def compute_marker_world_corners(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = marker_object_corners(marker) - homogeneous = np.concatenate([local, np.ones((local.shape[0], 1), dtype=np.float64)], axis=1) - world = (link_transform @ homogeneous.T).T - return world[:, :3] - - -def initial_camera_guess( - view: Dict[str, Any], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - default_state: Dict[str, float], - scale: float, - robot: Dict[str, Any] -) -> Tuple[np.ndarray, np.ndarray]: - object_points = [] - image_points = [] - - link_transforms = compute_link_transforms(robot, default_state, scale) - - for obs in observations: - if obs['view_index'] != view['index']: - continue - marker = robot_markers[obs['marker_id']] - object_points.append(compute_marker_world_corners(marker, link_transforms)) - image_points.append(obs['image_points_px']) - - if len(object_points) == 0: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - object_points = np.vstack(object_points) - image_points = np.vstack(image_points) - - if object_points.shape[0] < 4: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - success, rvec, tvec = cv2.solvePnP( - object_points, - image_points, - view['K'], - view['D'], - flags=cv2.SOLVEPNP_ITERATIVE - ) - - if not success: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - return rvec, tvec - - -def project_points( - points_3d: np.ndarray, - rvec: np.ndarray, - tvec: np.ndarray, - K: np.ndarray, - D: np.ndarray -) -> np.ndarray: - projected, _ = cv2.projectPoints(points_3d, rvec, tvec, K, D) - return projected.reshape(-1, 2) - - -# ------------------------------------------------------------------ -# Optimization -# ------------------------------------------------------------------ - -def pack_parameters(robot_state: Dict[str, float], camera_params: List[Tuple[np.ndarray, np.ndarray]]) -> np.ndarray: - state_vec = np.asarray([robot_state[k] for k in STATE_KEYS], dtype=np.float64) - cams = [] - for rvec, tvec in camera_params: - cams.append(rvec.reshape(3)) - cams.append(tvec.reshape(3)) - return np.concatenate([state_vec] + cams) - - -def unpack_parameters(params: np.ndarray, n_views: int) -> Tuple[Dict[str, float], List[Tuple[np.ndarray, np.ndarray]]]: - robot_state = {STATE_KEYS[i]: float(params[i]) for i in range(len(STATE_KEYS))} - camera_params = [] - offset = len(STATE_KEYS) - for _ in range(n_views): - rvec = params[offset:offset + 3].reshape(3, 1) - tvec = params[offset + 3:offset + 6].reshape(3, 1) - camera_params.append((rvec, tvec)) - offset += 6 - return robot_state, camera_params - - -def residuals_for_parameters( - params: np.ndarray, - views: List[Dict[str, Any]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - robot: Dict[str, Any], - scale: float, - default_state: Dict[str, float] -) -> np.ndarray: - robot_state, camera_params = unpack_parameters(params, len(views)) - link_transforms = compute_link_transforms(robot, robot_state, scale) - - residuals = [] - for obs in observations: - marker = robot_markers[obs['marker_id']] - world_corners = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(world_corners, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - weight = math.sqrt(obs['confidence']) - residuals.extend((diffs * weight).reshape(-1)) - - for key in STATE_KEYS: - diff = robot_state[key] - default_state.get(key, 0.0) - if key in ('x', 'y', 'z', 'e'): - w = 0.001 - else: - w = 0.01 - residuals.append(diff * w) - - return np.asarray(residuals, dtype=np.float64) - - -def estimate_uncertainty(result: Any, n_params: int) -> np.ndarray: - if result.jac is None: - return np.full(n_params, float('nan'), dtype=np.float64) - J = result.jac - m, n = J.shape - JTJ = J.T @ J - try: - cov = np.linalg.pinv(JTJ) - except np.linalg.LinAlgError: - cov = np.linalg.pinv(JTJ + np.eye(n) * 1e-9) - residuals = result.fun - dof = max(1, m - n) - sigma2 = float(np.sum(residuals ** 2) / dof) - cov *= sigma2 - return np.sqrt(np.diag(cov)) - - -# ------------------------------------------------------------------ -# Output assembly -# ------------------------------------------------------------------ - -def camera_position_world(rvec: np.ndarray, tvec: np.ndarray) -> np.ndarray: - R, _ = cv2.Rodrigues(rvec) - return (-R.T @ tvec).reshape(3) - - -def build_output( - robot_state: Dict[str, float], - state_uncertainty: np.ndarray, - views: List[Dict[str, Any]], - camera_params: List[Tuple[np.ndarray, np.ndarray]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - scale: float, - robot: Dict[str, Any], - robot_json_path: str -) -> Dict[str, Any]: - link_transforms = compute_link_transforms(robot, robot_state, scale) - - marker_summary: Dict[int, Dict[str, Any]] = {} - for marker_id, marker in robot_markers.items(): - marker_summary[marker_id] = { - 'marker_id': marker_id, - 'link_name': marker['link_name'], - 'position_world_m': compute_marker_world_position(marker, link_transforms).tolist(), - 'size_m': marker['size_m'], - 'observation_count': 0, - 'mean_confidence': None, - 'mean_reprojection_error_px': None, - 'observations': [] - } - - per_marker_errors: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - per_marker_confidences: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - - link_transforms = compute_link_transforms(robot, robot_state, scale) - for obs in observations: - marker_id = obs['marker_id'] - marker = robot_markers[marker_id] - object_points_m = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(object_points_m, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - errors = np.linalg.norm(diffs, axis=1) - repro_error = float(np.mean(errors)) - per_marker_errors[marker_id].extend(errors.tolist()) - per_marker_confidences[marker_id].append(obs['confidence']) - marker_summary[marker_id]['observation_count'] += 1 - marker_summary[marker_id]['observations'].append({ - 'view_index': obs['view_index'], - 'source_file': views[obs['view_index']]['source_file'], - 'image_file': views[obs['view_index']]['image_file'], - 'confidence': obs['confidence'], - 'mean_reprojection_error_px': repro_error, - 'corner_reprojection_errors_px': errors.tolist() - }) - - for marker_id, summary in marker_summary.items(): - if summary['observation_count'] > 0: - summary['mean_confidence'] = float(np.mean(per_marker_confidences[marker_id])) - summary['mean_reprojection_error_px'] = float(np.mean(per_marker_errors[marker_id])) - - camera_outputs = [] - for idx, view in enumerate(views): - rvec, tvec = camera_params[idx] - cam_pos = camera_position_world(rvec, tvec) - observed_count = sum(1 for obs in observations if obs['view_index'] == idx) - camera_outputs.append({ - 'view_index': idx, - 'source_file': view['source_file'], - 'camera_id': view['camera_id'], - 'camera_position_world_m': cam_pos.tolist(), - 'rvec': rvec.reshape(-1).tolist(), - 'tvec': tvec.reshape(-1).tolist(), - 'intrinsics': { - 'camera_matrix': view['K'].tolist(), - 'distortion_coefficients': view['D'].reshape(-1).tolist() - }, - 'observation_count': observed_count - }) - - robot_pose_output = { - 'state': {k: float(robot_state[k]) for k in STATE_KEYS}, - 'uncertainty': { - 'x_mm': float(state_uncertainty[0]), - 'y_mm': float(state_uncertainty[1]), - 'z_mm': float(state_uncertainty[2]), - 'a_deg': float(state_uncertainty[3]), - 'b_deg': float(state_uncertainty[4]), - 'c_deg': float(state_uncertainty[5]), - 'e_mm': float(state_uncertainty[6]) - }, - 'confidence': { - 'x': float(math.exp(-state_uncertainty[0] / 10.0)), - 'y': float(math.exp(-state_uncertainty[1] / 10.0)), - 'z': float(math.exp(-state_uncertainty[2] / 10.0)), - 'a': float(math.exp(-state_uncertainty[3] / 10.0)), - 'b': float(math.exp(-state_uncertainty[4] / 10.0)), - 'c': float(math.exp(-state_uncertainty[5] / 10.0)), - 'e': float(math.exp(-state_uncertainty[6] / max(1.0, state_uncertainty[6]))) - } - } - - return { - 'schema_version': '1.0', - 'created_utc': datetime.datetime.utcnow().isoformat() + 'Z', - 'source_robot_json': os.path.abspath(robot_json_path), - 'source_detections': [view['source_file'] for view in views], - 'robot_pose': robot_pose_output, - 'camera_poses': camera_outputs, - 'marker_positions': list(marker_summary.values()) - } - - -# ------------------------------------------------------------------ -# Main -# ------------------------------------------------------------------ - -def main() -> None: - parser = argparse.ArgumentParser(description='Multiview optimization of robot pose and camera extrinsics') - parser.add_argument('--robot', required=True, help='Path to robot.json') - parser.add_argument('--detections', required=True, nargs='+', help='List of detection JSON files') - parser.add_argument('--outDir', required=True, help='Output directory') - parser.add_argument('--write-summary', action='store_true', help='Write summary file') - parser.add_argument('--max-iter', type=int, default=500, help='Maximum optimizer iterations') - args = parser.parse_args() - - os.makedirs(args.outDir, exist_ok=True) - - robot_json_path = os.path.abspath(args.robot) - robot = load_json(robot_json_path) - scale = parse_metric_scale(robot) - - default_state = { - k: float(robot.get('defaultPosition', {}).get(k, 0.0) or 0.0) - for k in STATE_KEYS - } - - robot_markers = extract_markers(robot, scale) - views, observations = collect_views_and_observations(args.detections, robot_markers) - - camera_guesses = [] - for view in views: - rvec, tvec = initial_camera_guess(view, observations, robot_markers, default_state, scale, robot) - camera_guesses.append((rvec, tvec)) - - x0 = pack_parameters(default_state, camera_guesses) - - progress = { - 'iter': 0, - 'last_cost': None, - 'last_print': time.time(), - 'prev_x': x0.copy() - } - - def progress_callback(xk: np.ndarray) -> None: - progress['iter'] += 1 - now = time.time() - if progress['iter'] == 1 or now - progress['last_print'] >= 1.0: - res = residuals_for_parameters(xk, views, observations, robot_markers, robot, scale, default_state) - cost = 0.5 * float(np.dot(res, res)) - delta_cost = None - convergence = '' - if progress['last_cost'] is not None: - delta_cost = cost - progress['last_cost'] - if abs(delta_cost) < 1e-3: - convergence = ' stable' - elif delta_cost < 0: - convergence = ' improving' - else: - convergence = ' worsening' - step_norm = float(np.linalg.norm(xk - progress['prev_x'])) - print( - f'[Multiview] iter={progress["iter"]:4d} cost={cost:.4f}' - + (f' delta={delta_cost:.4g}' if delta_cost is not None else '') - + f' step={step_norm:.4g}' - + convergence - ) - progress['last_cost'] = cost - progress['last_print'] = now - progress['prev_x'] = xk.copy() - - result = least_squares( - residuals_for_parameters, - x0, - args=(views, observations, robot_markers, robot, scale, default_state), - jac='2-point', - method='trf', - loss='soft_l1', - f_scale=1.0, - max_nfev=args.max_iter, - callback=progress_callback - ) - - robot_state, camera_params = unpack_parameters(result.x, len(views)) - uncertainties = estimate_uncertainty(result, len(result.x)) - - output = build_output(robot_state, uncertainties[:len(STATE_KEYS)], views, camera_params, observations, robot_markers, scale, robot, robot_json_path) - - out_path = Path(args.outDir) / 'multiview_pose.json' - save_json(output, out_path) - - print(f'Saved: {out_path}') - if args.write_summary: - summary_path = Path(args.outDir) / 'multiview_pose_summary.json' - summary = { - 'final_cost': float(result.cost), - 'status': int(result.status), - 'message': result.message, - 'robot_state': output['robot_pose'], - 'camera_count': len(views), - 'marker_count': len(robot_markers) - } - save_json(summary, summary_path) - print(f'Saved: {summary_path}') - - -if __name__ == '__main__': - main() diff --git a/pipeline/2_Multiview_ersteVersion.py b/pipeline/2_Multiview_ersteVersion.py deleted file mode 100644 index 59c3b1e..0000000 --- a/pipeline/2_Multiview_ersteVersion.py +++ /dev/null @@ -1,706 +0,0 @@ -#!/usr/bin/env python3 - -""" -============================================================ -STEP 2b — Simultane Multiview-Optimierung für Roboterpose -============================================================ - -Ziel: - Aus mehreren ArUco-Detektionsdateien die gemeinsame - Roboterpose (x,y,z,a,b,c,e) schätzen und jede Kamera-Pose - sowie Marker-Weltpositionen ausgeben. - -Eingabe: - --robot ../robot.json - --detections render_1a_aruco_detection.json render_1b_aruco_detection.json ... - --outDir . - -Ausgabe: - multiview_pose.json - -Hinweis: - Dieses Skript verwendet die Markerpositionen aus robot.json - als kinematische Constraints und optimiert gleichzeitig: - - Roboterzustand (x,y,z,a,b,c,e) - - Kameraextrinsische Parameter pro Bild - -""" - -import argparse -import datetime -import json -import math -import os -import time -from pathlib import Path -from typing import Any, Dict, List, Tuple - -import cv2 -import numpy as np -from scipy.optimize import least_squares - -STATE_KEYS = ["x", "y", "z", "a", "b", "c", "e"] - - -# ------------------------------------------------------------------ -# JSON helpers -# ------------------------------------------------------------------ - -def load_json(path: str) -> Dict[str, Any]: - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - - -def save_json(data: Dict[str, Any], path: Path) -> None: - with open(path, 'w', encoding='utf-8') as f: - json.dump(data, f, indent=2) - - -# ------------------------------------------------------------------ -# robot.json helpers -# ------------------------------------------------------------------ - -def resolve_scalar(value: Any, default: float = 0.0) -> float: - if value is None: - return default - if isinstance(value, (int, float)): - return float(value) - try: - return float(str(value).strip()) - except ValueError: - return default - - -def resolve_vector(value: Any, default_len: int = 3) -> Tuple[float, ...]: - if value is None: - return tuple(0.0 for _ in range(default_len)) - if isinstance(value, (int, float, str)): - return (resolve_scalar(value),) + tuple(0.0 for _ in range(default_len - 1)) - if isinstance(value, (list, tuple)): - resolved = [resolve_scalar(v) for v in value] - if len(resolved) < default_len: - resolved.extend([0.0] * (default_len - len(resolved))) - return tuple(resolved[:default_len]) - return tuple(0.0 for _ in range(default_len)) - - -def parse_metric_scale(robot: Dict[str, Any]) -> float: - rendering_info = robot.get('renderingInfo', {}) or {} - metric = rendering_info.get('metric', 'mm') - return 0.001 if str(metric).strip().lower() == 'mm' else 1.0 - - -def normalize_axis(axis: Any) -> np.ndarray: - vec = np.asarray(axis, dtype=np.float64) - if vec.shape != (3,): - vec = vec.reshape(-1)[:3] - norm = np.linalg.norm(vec) - return vec / max(norm, 1e-9) - - -def euler_deg_to_matrix(euler_deg: Any) -> np.ndarray: - x_deg, y_deg, z_deg = resolve_vector(euler_deg, 3) - x = math.radians(x_deg) - y = math.radians(y_deg) - z = math.radians(z_deg) - - cx = math.cos(x) - sx = math.sin(x) - cy = math.cos(y) - sy = math.sin(y) - cz = math.cos(z) - sz = math.sin(z) - - Rx = np.array([ - [1.0, 0.0, 0.0], - [0.0, cx, -sx], - [0.0, sx, cx] - ], dtype=np.float64) - - Ry = np.array([ - [cy, 0.0, sy], - [0.0, 1.0, 0.0], - [-sy, 0.0, cy] - ], dtype=np.float64) - - Rz = np.array([ - [cz, -sz, 0.0], - [sz, cz, 0.0], - [0.0, 0.0, 1.0] - ], dtype=np.float64) - - return Rz @ Ry @ Rx - - -def transform_from_translation_rotation(translation: Any, rotation_deg: Any) -> np.ndarray: - T = np.eye(4, dtype=np.float64) - pos = np.asarray(resolve_vector(translation, 3), dtype=np.float64) - T[:3, 3] = pos - T[:3, :3] = euler_deg_to_matrix(rotation_deg) - return T - - -def axis_angle_matrix(axis: Any, angle_deg: float) -> np.ndarray: - axis_vec = normalize_axis(axis) - theta = math.radians(angle_deg) - kx, ky, kz = axis_vec - c = math.cos(theta) - s = math.sin(theta) - v = 1.0 - c - R = np.array([ - [kx * kx * v + c, kx * ky * v - kz * s, kx * kz * v + ky * s], - [ky * kx * v + kz * s, ky * ky * v + c, ky * kz * v - kx * s], - [kz * kx * v - ky * s, kz * ky * v + kx * s, kz * kz * v + c] - ], dtype=np.float64) - T = np.eye(4, dtype=np.float64) - T[:3, :3] = R - return T - - -# ------------------------------------------------------------------ -# Kinematics and marker extraction -# ------------------------------------------------------------------ - -def extract_markers(robot: Dict[str, Any], scale: float) -> Dict[int, Dict[str, Any]]: - markers = {} - links = robot.get('links', {}) or {} - marker_defaults = (robot.get('renderingInfo', {}) or {}).get('markerDefaults', {}) or {} - default_size_mm = float(marker_defaults.get('size', 25.0)) - - for link_name, link_info in links.items(): - for marker in link_info.get('markers', []) or []: - marker_id = int(marker.get('id', -1)) - if marker_id < 0: - continue - - pos = resolve_vector(marker.get('position', [0, 0, 0]), 3) - size_mm = float(marker.get('size', default_size_mm)) - markers[marker_id] = { - 'marker_id': marker_id, - 'link_name': link_name, - 'position_m': np.asarray([pos[0] * scale, pos[1] * scale, pos[2] * scale], dtype=np.float64), - 'normal': normalize_axis(resolve_vector(marker.get('normal', [0, 0, 1]), 3)), - 'spin_deg': float(marker.get('spin', 0.0)), - 'size_m': size_mm * scale, - } - - return markers - - -def marker_plane_axes(normal: np.ndarray, spin_deg: float) -> Tuple[np.ndarray, np.ndarray]: - n = normalize_axis(normal) - candidate = np.array((0.0, 0.0, 1.0), dtype=np.float64) - if abs(np.dot(n, candidate)) > 0.99: - candidate = np.array((1.0, 0.0, 0.0), dtype=np.float64) - - x_dir = np.cross(candidate, n) - x_dir /= max(np.linalg.norm(x_dir), 1e-9) - y_dir = np.cross(n, x_dir) - - if abs(spin_deg) > 1e-6: - theta = math.radians(spin_deg) - cos_t = math.cos(theta) - sin_t = math.sin(theta) - x_rot = x_dir * cos_t + np.cross(n, x_dir) * sin_t + n * np.dot(n, x_dir) * (1.0 - cos_t) - y_rot = y_dir * cos_t + np.cross(n, y_dir) * sin_t + n * np.dot(n, y_dir) * (1.0 - cos_t) - return x_rot, y_rot - - return x_dir, y_dir - - -def marker_object_corners(marker: Dict[str, Any]) -> np.ndarray: - half = marker['size_m'] * 0.5 - x_dir, y_dir = marker_plane_axes(marker['normal'], marker['spin_deg']) - corners = np.stack([ - -x_dir * half + y_dir * half, - x_dir * half + y_dir * half, - x_dir * half - y_dir * half, - -x_dir * half - y_dir * half - ], axis=0) - return marker['position_m'].reshape(1, 3) + corners - - -def build_link_chain(robot: Dict[str, Any]) -> List[str]: - links = robot.get('links', {}) or {} - ordered: List[str] = [] - remaining = set(links.keys()) - - while remaining: - progress = False - for name in list(remaining): - parent = links[name].get('parent') - if not parent or parent in ordered: - ordered.append(name) - remaining.remove(name) - progress = True - if not progress: - raise RuntimeError('Cycle detected in robot link tree or missing parent link') - return ordered - - -def compute_link_transforms(robot: Dict[str, Any], state: Dict[str, float], scale: float) -> Dict[str, np.ndarray]: - links = robot.get('links', {}) or {} - ordered_links = build_link_chain(robot) - transforms: Dict[str, np.ndarray] = {} - - for link_name in ordered_links: - link_info = links[link_name] or {} - parent_name = link_info.get('parent') - parent_transform = transforms[parent_name] if parent_name else np.eye(4, dtype=np.float64) - - mount_translation = np.asarray(resolve_vector(link_info.get('mountPosition', [0, 0, 0]), 3), dtype=np.float64) * scale - mount = transform_from_translation_rotation( - mount_translation, - link_info.get('mountRotation', [0, 0, 0]) - ) - - joint_info = link_info.get('jointToParent', {}) or {} - joint_origin = np.asarray(resolve_vector(joint_info.get('origin', [0, 0, 0]), 3), dtype=np.float64) * scale - joint = transform_from_translation_rotation( - joint_origin, - joint_info.get('rotation', [0, 0, 0]) - ) - - motion = np.eye(4, dtype=np.float64) - joint_type = str(joint_info.get('type', 'fixed')).strip().lower() - control_var = str(joint_info.get('variable', joint_info.get('control', ''))).strip().lower() - axis = resolve_vector(joint_info.get('axis', [1, 0, 0]), 3) - - if joint_type == 'linear': - motion[:3, 3] = normalize_axis(axis) * state.get(control_var, 0.0) * scale - elif joint_type == 'revolute': - motion = axis_angle_matrix(axis, state.get(control_var, 0.0)) - - transforms[link_name] = parent_transform @ mount @ joint @ motion - - return transforms - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = np.ones(4, dtype=np.float64) - local[:3] = marker['position_m'] - world = link_transform @ local - return world[:3] - - -# ------------------------------------------------------------------ -# Camera / observation helpers -# ------------------------------------------------------------------ - -def load_intrinsics(detection_json: Dict[str, Any]) -> Tuple[np.ndarray, np.ndarray]: - cam = detection_json['camera'] - K = np.asarray(cam['camera_matrix'], dtype=np.float64) - D = np.asarray(cam.get('distortion_coefficients', [0, 0, 0, 0, 0]), dtype=np.float64).reshape(-1, 1) - return K, D - - -def collect_views_and_observations( - detection_files: List[str], - robot_markers: Dict[int, Dict[str, Any]] -) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]: - views: List[Dict[str, Any]] = [] - observations: List[Dict[str, Any]] = [] - - for idx, det_path in enumerate(detection_files): - detection_json = load_json(det_path) - K, D = load_intrinsics(detection_json) - views.append({ - 'index': idx, - 'source_file': os.path.abspath(det_path), - 'camera_id': detection_json.get('camera', {}).get('camera_id', f'cam{idx+1}'), - 'image_file': detection_json.get('image', {}).get('image_file'), - 'K': K, - 'D': D - }) - - for det in detection_json.get('detections', []) or []: - marker_id = int(det.get('marker_id', -1)) - if marker_id < 0 or marker_id not in robot_markers: - continue - - image_points = det.get('image_points_px') - if isinstance(image_points, list) and len(image_points) == 4: - image_points = np.asarray(image_points, dtype=np.float64) - else: - center = resolve_vector(det.get('center_px', [0, 0]), 2) - image_points = np.asarray([center], dtype=np.float64) - - confidence = float(det.get('confidence', 1.0)) - marker = robot_markers[marker_id] - observations.append({ - 'view_index': idx, - 'marker_id': marker_id, - 'marker_link_corners': marker_object_corners(marker), - 'image_points_px': image_points, - 'confidence': max(0.01, min(1.0, confidence)) - }) - - if len(views) == 0: - raise RuntimeError('No valid detection views found') - - if len(observations) == 0: - raise RuntimeError('No marker observations matched robot.json markers') - - return views, observations - - -def compute_marker_world_corners(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = marker_object_corners(marker) - homogeneous = np.concatenate([local, np.ones((local.shape[0], 1), dtype=np.float64)], axis=1) - world = (link_transform @ homogeneous.T).T - return world[:, :3] - - -def initial_camera_guess( - view: Dict[str, Any], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - default_state: Dict[str, float], - scale: float, - robot: Dict[str, Any] -) -> Tuple[np.ndarray, np.ndarray]: - object_points = [] - image_points = [] - - link_transforms = compute_link_transforms(robot, default_state, scale) - - for obs in observations: - if obs['view_index'] != view['index']: - continue - marker = robot_markers[obs['marker_id']] - object_points.append(compute_marker_world_corners(marker, link_transforms)) - image_points.append(obs['image_points_px']) - - if len(object_points) == 0: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - object_points = np.vstack(object_points) - image_points = np.vstack(image_points) - - if object_points.shape[0] < 4: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - success, rvec, tvec = cv2.solvePnP( - object_points, - image_points, - view['K'], - view['D'], - flags=cv2.SOLVEPNP_ITERATIVE - ) - - if not success: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - return rvec, tvec - - -def project_points( - points_3d: np.ndarray, - rvec: np.ndarray, - tvec: np.ndarray, - K: np.ndarray, - D: np.ndarray -) -> np.ndarray: - projected, _ = cv2.projectPoints(points_3d, rvec, tvec, K, D) - return projected.reshape(-1, 2) - - -# ------------------------------------------------------------------ -# Optimization -# ------------------------------------------------------------------ - -def pack_parameters(robot_state: Dict[str, float], camera_params: List[Tuple[np.ndarray, np.ndarray]]) -> np.ndarray: - state_vec = np.asarray([robot_state[k] for k in STATE_KEYS], dtype=np.float64) - cams = [] - for rvec, tvec in camera_params: - cams.append(rvec.reshape(3)) - cams.append(tvec.reshape(3)) - return np.concatenate([state_vec] + cams) - - -def unpack_parameters(params: np.ndarray, n_views: int) -> Tuple[Dict[str, float], List[Tuple[np.ndarray, np.ndarray]]]: - robot_state = {STATE_KEYS[i]: float(params[i]) for i in range(len(STATE_KEYS))} - camera_params = [] - offset = len(STATE_KEYS) - for _ in range(n_views): - rvec = params[offset:offset + 3].reshape(3, 1) - tvec = params[offset + 3:offset + 6].reshape(3, 1) - camera_params.append((rvec, tvec)) - offset += 6 - return robot_state, camera_params - - -def residuals_for_parameters( - params: np.ndarray, - views: List[Dict[str, Any]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - robot: Dict[str, Any], - scale: float, - default_state: Dict[str, float] -) -> np.ndarray: - robot_state, camera_params = unpack_parameters(params, len(views)) - link_transforms = compute_link_transforms(robot, robot_state, scale) - - residuals = [] - for obs in observations: - marker = robot_markers[obs['marker_id']] - world_corners = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(world_corners, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - weight = math.sqrt(obs['confidence']) - residuals.extend((diffs * weight).reshape(-1)) - - for key in STATE_KEYS: - diff = robot_state[key] - default_state.get(key, 0.0) - if key in ('x', 'y', 'z', 'e'): - w = 0.001 - else: - w = 0.01 - residuals.append(diff * w) - - return np.asarray(residuals, dtype=np.float64) - - -def estimate_uncertainty(result: Any, n_params: int) -> np.ndarray: - if result.jac is None: - return np.full(n_params, float('nan'), dtype=np.float64) - J = result.jac - m, n = J.shape - JTJ = J.T @ J - try: - cov = np.linalg.pinv(JTJ) - except np.linalg.LinAlgError: - cov = np.linalg.pinv(JTJ + np.eye(n) * 1e-9) - residuals = result.fun - dof = max(1, m - n) - sigma2 = float(np.sum(residuals ** 2) / dof) - cov *= sigma2 - return np.sqrt(np.diag(cov)) - - -# ------------------------------------------------------------------ -# Output assembly -# ------------------------------------------------------------------ - -def camera_position_world(rvec: np.ndarray, tvec: np.ndarray) -> np.ndarray: - R, _ = cv2.Rodrigues(rvec) - return (-R.T @ tvec).reshape(3) - - -def build_output( - robot_state: Dict[str, float], - state_uncertainty: np.ndarray, - views: List[Dict[str, Any]], - camera_params: List[Tuple[np.ndarray, np.ndarray]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - scale: float, - robot: Dict[str, Any], - robot_json_path: str -) -> Dict[str, Any]: - link_transforms = compute_link_transforms(robot, robot_state, scale) - - marker_summary: Dict[int, Dict[str, Any]] = {} - for marker_id, marker in robot_markers.items(): - marker_summary[marker_id] = { - 'marker_id': marker_id, - 'link_name': marker['link_name'], - 'position_world_m': compute_marker_world_position(marker, link_transforms).tolist(), - 'size_m': marker['size_m'], - 'observation_count': 0, - 'mean_confidence': None, - 'mean_reprojection_error_px': None, - 'observations': [] - } - - per_marker_errors: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - per_marker_confidences: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - - link_transforms = compute_link_transforms(robot, robot_state, scale) - for obs in observations: - marker_id = obs['marker_id'] - marker = robot_markers[marker_id] - object_points_m = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(object_points_m, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - errors = np.linalg.norm(diffs, axis=1) - repro_error = float(np.mean(errors)) - per_marker_errors[marker_id].extend(errors.tolist()) - per_marker_confidences[marker_id].append(obs['confidence']) - marker_summary[marker_id]['observation_count'] += 1 - marker_summary[marker_id]['observations'].append({ - 'view_index': obs['view_index'], - 'source_file': views[obs['view_index']]['source_file'], - 'image_file': views[obs['view_index']]['image_file'], - 'confidence': obs['confidence'], - 'mean_reprojection_error_px': repro_error, - 'corner_reprojection_errors_px': errors.tolist() - }) - - for marker_id, summary in marker_summary.items(): - if summary['observation_count'] > 0: - summary['mean_confidence'] = float(np.mean(per_marker_confidences[marker_id])) - summary['mean_reprojection_error_px'] = float(np.mean(per_marker_errors[marker_id])) - - camera_outputs = [] - for idx, view in enumerate(views): - rvec, tvec = camera_params[idx] - cam_pos = camera_position_world(rvec, tvec) - observed_count = sum(1 for obs in observations if obs['view_index'] == idx) - camera_outputs.append({ - 'view_index': idx, - 'source_file': view['source_file'], - 'camera_id': view['camera_id'], - 'camera_position_world_m': cam_pos.tolist(), - 'rvec': rvec.reshape(-1).tolist(), - 'tvec': tvec.reshape(-1).tolist(), - 'intrinsics': { - 'camera_matrix': view['K'].tolist(), - 'distortion_coefficients': view['D'].reshape(-1).tolist() - }, - 'observation_count': observed_count - }) - - robot_pose_output = { - 'state': {k: float(robot_state[k]) for k in STATE_KEYS}, - 'uncertainty': { - 'x_mm': float(state_uncertainty[0]), - 'y_mm': float(state_uncertainty[1]), - 'z_mm': float(state_uncertainty[2]), - 'a_deg': float(state_uncertainty[3]), - 'b_deg': float(state_uncertainty[4]), - 'c_deg': float(state_uncertainty[5]), - 'e_mm': float(state_uncertainty[6]) - }, - 'confidence': { - 'x': float(math.exp(-state_uncertainty[0] / 10.0)), - 'y': float(math.exp(-state_uncertainty[1] / 10.0)), - 'z': float(math.exp(-state_uncertainty[2] / 10.0)), - 'a': float(math.exp(-state_uncertainty[3] / 10.0)), - 'b': float(math.exp(-state_uncertainty[4] / 10.0)), - 'c': float(math.exp(-state_uncertainty[5] / 10.0)), - 'e': float(math.exp(-state_uncertainty[6] / max(1.0, state_uncertainty[6]))) - } - } - - return { - 'schema_version': '1.0', - 'created_utc': datetime.datetime.utcnow().isoformat() + 'Z', - 'source_robot_json': os.path.abspath(robot_json_path), - 'source_detections': [view['source_file'] for view in views], - 'robot_pose': robot_pose_output, - 'camera_poses': camera_outputs, - 'marker_positions': list(marker_summary.values()) - } - - -# ------------------------------------------------------------------ -# Main -# ------------------------------------------------------------------ - -def main() -> None: - parser = argparse.ArgumentParser(description='Multiview optimization of robot pose and camera extrinsics') - parser.add_argument('--robot', required=True, help='Path to robot.json') - parser.add_argument('--detections', required=True, nargs='+', help='List of detection JSON files') - parser.add_argument('--outDir', required=True, help='Output directory') - parser.add_argument('--write-summary', action='store_true', help='Write summary file') - parser.add_argument('--max-iter', type=int, default=500, help='Maximum optimizer iterations') - args = parser.parse_args() - - os.makedirs(args.outDir, exist_ok=True) - - robot_json_path = os.path.abspath(args.robot) - robot = load_json(robot_json_path) - scale = parse_metric_scale(robot) - - default_state = { - k: float(robot.get('defaultPosition', {}).get(k, 0.0) or 0.0) - for k in STATE_KEYS - } - - robot_markers = extract_markers(robot, scale) - views, observations = collect_views_and_observations(args.detections, robot_markers) - - camera_guesses = [] - for view in views: - rvec, tvec = initial_camera_guess(view, observations, robot_markers, default_state, scale, robot) - camera_guesses.append((rvec, tvec)) - - x0 = pack_parameters(default_state, camera_guesses) - - progress = { - 'iter': 0, - 'last_cost': None, - 'last_print': time.time(), - 'prev_x': x0.copy() - } - - def progress_callback(xk: np.ndarray) -> None: - progress['iter'] += 1 - now = time.time() - if progress['iter'] == 1 or now - progress['last_print'] >= 1.0: - res = residuals_for_parameters(xk, views, observations, robot_markers, robot, scale, default_state) - cost = 0.5 * float(np.dot(res, res)) - delta_cost = None - convergence = '' - if progress['last_cost'] is not None: - delta_cost = cost - progress['last_cost'] - if abs(delta_cost) < 1e-3: - convergence = ' stable' - elif delta_cost < 0: - convergence = ' improving' - else: - convergence = ' worsening' - step_norm = float(np.linalg.norm(xk - progress['prev_x'])) - print( - f'[Multiview] iter={progress["iter"]:4d} cost={cost:.4f}' - + (f' delta={delta_cost:.4g}' if delta_cost is not None else '') - + f' step={step_norm:.4g}' - + convergence - ) - progress['last_cost'] = cost - progress['last_print'] = now - progress['prev_x'] = xk.copy() - - result = least_squares( - residuals_for_parameters, - x0, - args=(views, observations, robot_markers, robot, scale, default_state), - jac='2-point', - method='trf', - loss='soft_l1', - f_scale=1.0, - max_nfev=args.max_iter, - callback=progress_callback - ) - - robot_state, camera_params = unpack_parameters(result.x, len(views)) - uncertainties = estimate_uncertainty(result, len(result.x)) - - output = build_output(robot_state, uncertainties[:len(STATE_KEYS)], views, camera_params, observations, robot_markers, scale, robot, robot_json_path) - - out_path = Path(args.outDir) / 'multiview_pose.json' - save_json(output, out_path) - - print(f'Saved: {out_path}') - if args.write_summary: - summary_path = Path(args.outDir) / 'multiview_pose_summary.json' - summary = { - 'final_cost': float(result.cost), - 'status': int(result.status), - 'message': result.message, - 'robot_state': output['robot_pose'], - 'camera_count': len(views), - 'marker_count': len(robot_markers) - } - save_json(summary, summary_path) - print(f'Saved: {summary_path}') - - -if __name__ == '__main__': - main() diff --git a/pipeline/2_Multiview_neu.py b/pipeline/2_Multiview_neu.py deleted file mode 100644 index 84ea3b5..0000000 --- a/pipeline/2_Multiview_neu.py +++ /dev/null @@ -1,1158 +0,0 @@ -#!/usr/bin/env python3 -""" -Phase 1 — robust multiview robot pose estimation from aruco_detection.json + robot.json - -This version keeps the original kinematic model and optimizer structure, but changes: -- observation weighting to a saturating factor model: min(1, q + f) -- quality indicators are normalized to 0..1 -- blur/sharpness is supported but disabled by default (f=1) -- homography skew quality is added -- summary is built from the final output, so values stay consistent -- duplicate marker ids are warned about instead of being silently overwritten - -Input: - --robot robot.json - --detections render_1a_aruco_detection.json ... - --outDir output - -Output: - multiview_pose.json - multiview_pose_summary.json (optional) -""" - -import argparse -import datetime as _dt -import json -import math -import os -import time -from dataclasses import dataclass, field -from pathlib import Path -from typing import Any, Dict, List, Tuple, Optional - -import cv2 -import numpy as np -from scipy.optimize import least_squares - -STATE_KEYS = ["x", "y", "z", "a", "b", "c", "e"] - - -# ----------------------------------------------------------------------------- -# Small helpers -# ----------------------------------------------------------------------------- - -def clamp01(x: float) -> float: - return float(max(0.0, min(1.0, x))) - - -def load_json(path: str) -> Dict[str, Any]: - with open(path, "r", encoding="utf-8") as f: - return json.load(f) - - -def save_json(data: Dict[str, Any], path: Path) -> None: - with open(path, "w", encoding="utf-8") as f: - json.dump(data, f, indent=2) - - -def resolve_scalar(value: Any, default: float = 0.0) -> float: - if value is None: - return default - if isinstance(value, (int, float)): - return float(value) - try: - return float(str(value).strip()) - except Exception: - return default - - -def resolve_vector(value: Any, default_len: int = 3) -> Tuple[float, ...]: - if value is None: - return tuple(0.0 for _ in range(default_len)) - if isinstance(value, (int, float, str)): - return (resolve_scalar(value),) + tuple(0.0 for _ in range(default_len - 1)) - if isinstance(value, (list, tuple)): - resolved = [resolve_scalar(v) for v in value] - if len(resolved) < default_len: - resolved.extend([0.0] * (default_len - len(resolved))) - return tuple(resolved[:default_len]) - return tuple(0.0 for _ in range(default_len)) - - -def parse_metric_scale(robot: Dict[str, Any]) -> float: - rendering_info = robot.get("renderingInfo", {}) or {} - metric = str(rendering_info.get("metric", "mm")).strip().lower() - return 0.001 if metric == "mm" else 1.0 - - -def normalize_axis(axis: Any) -> np.ndarray: - vec = np.asarray(axis, dtype=np.float64).reshape(-1)[:3] - norm = np.linalg.norm(vec) - if norm < 1e-12: - return np.array([1.0, 0.0, 0.0], dtype=np.float64) - return vec / norm - - -def euler_deg_to_matrix(euler_deg: Any) -> np.ndarray: - x_deg, y_deg, z_deg = resolve_vector(euler_deg, 3) - x = math.radians(x_deg) - y = math.radians(y_deg) - z = math.radians(z_deg) - - cx = math.cos(x) - sx = math.sin(x) - cy = math.cos(y) - sy = math.sin(y) - cz = math.cos(z) - sz = math.sin(z) - - Rx = np.array([[1.0, 0.0, 0.0], [0.0, cx, -sx], [0.0, sx, cx]], dtype=np.float64) - Ry = np.array([[cy, 0.0, sy], [0.0, 1.0, 0.0], [-sy, 0.0, cy]], dtype=np.float64) - Rz = np.array([[cz, -sz, 0.0], [sz, cz, 0.0], [0.0, 0.0, 1.0]], dtype=np.float64) - return Rz @ Ry @ Rx - - -def transform_from_translation_rotation(translation: Any, rotation_deg: Any) -> np.ndarray: - T = np.eye(4, dtype=np.float64) - T[:3, 3] = np.asarray(resolve_vector(translation, 3), dtype=np.float64) - T[:3, :3] = euler_deg_to_matrix(rotation_deg) - return T - - -def axis_angle_matrix(axis: Any, angle_deg: float) -> np.ndarray: - axis_vec = normalize_axis(axis) - theta = math.radians(angle_deg) - kx, ky, kz = axis_vec - c = math.cos(theta) - s = math.sin(theta) - v = 1.0 - c - R = np.array([ - [kx * kx * v + c, kx * ky * v - kz * s, kx * kz * v + ky * s], - [ky * kx * v + kz * s, ky * ky * v + c, ky * kz * v - kx * s], - [kz * kx * v - ky * s, kz * ky * v + kx * s, kz * kz * v + c], - ], dtype=np.float64) - T = np.eye(4, dtype=np.float64) - T[:3, :3] = R - return T - - -# ----------------------------------------------------------------------------- -# Optional quality configuration -# ----------------------------------------------------------------------------- - -@dataclass -class ObservationQualityConfig: - # q indicators are normalized to 0..1 - size_ref_px: float = 50.0 - border_ref_px: float = 120.0 - center_ref_norm: float = 1.0 - sharpness_ref: float = 2500.0 - homography_ref: float = 0.18 - - # factor f scales the effect of each quality indicator: - # f = 1 -> indicator is fully active - # f = 0 -> indicator is ignored (neutral weight = 1) - size_factor: float = 1.0 - aspect_factor: float = 1.0 - border_factor: float = 1.0 - center_factor: float = 1.0 - sharpness_factor: float = 1.0 - homography_factor: float = 1.0 - - # Placeholders for later phases - normal_visibility_factor: float = 1.0 - spin_factor: float = 1.0 - - # Keep a tiny floor for weights so the optimizer remains numerically stable - weight_floor: float = 0.01 - - -def _load_nested_quality_config(src: Dict[str, Any]) -> Dict[str, Any]: - if not isinstance(src, dict): - return {} - for key in ("multiview_quality", "multiviewQuality", "quality_config", "multiview"): - v = src.get(key) - if isinstance(v, dict): - return v - return {} - - -def load_quality_config(robot: Dict[str, Any]) -> ObservationQualityConfig: - cfg = ObservationQualityConfig() - candidates = [] - candidates.append(_load_nested_quality_config(robot)) - candidates.append(_load_nested_quality_config(robot.get("vision_config", {}) or {})) - - for src in candidates: - if not src: - continue - for field_name in cfg.__dataclass_fields__.keys(): - if field_name in src: - setattr(cfg, field_name, resolve_scalar(src.get(field_name), getattr(cfg, field_name))) - return cfg - - -# ----------------------------------------------------------------------------- -# Marker extraction and kinematics -# ----------------------------------------------------------------------------- - -class ConstraintResult: - def __init__(self, name: str, enabled: bool, reason: str = ""): - self.name = name - self.enabled = enabled - self.reason = reason - self.residuals = [] - - def __str__(self) -> str: - status = "✓ ENABLED" if self.enabled else "✗ DISABLED" - return f"{self.name:40s} {status:12s} {self.reason}" - - -def build_link_chain(robot: Dict[str, Any]) -> List[str]: - links = robot.get("links", {}) or {} - ordered: List[str] = [] - remaining = set(links.keys()) - while remaining: - progress = False - for name in list(remaining): - parent = links[name].get("parent") - if not parent or parent in ordered: - ordered.append(name) - remaining.remove(name) - progress = True - if not progress: - raise RuntimeError("Cycle detected in robot link tree or missing parent link") - return ordered - - -def extract_markers(robot: Dict[str, Any], scale: float) -> Dict[int, Dict[str, Any]]: - markers: Dict[int, Dict[str, Any]] = {} - links = robot.get("links", {}) or {} - marker_defaults = (robot.get("renderingInfo", {}) or {}).get("markerDefaults", {}) or {} - default_size_mm = float(marker_defaults.get("size", 25.0)) - - for link_name, link_info in links.items(): - for marker in link_info.get("markers", []) or []: - marker_id = int(marker.get("id", -1)) - if marker_id < 0: - continue - if marker_id in markers: - # Duplicate ids exist in the provided robot.json. Keep the first entry and warn. - print(f"[WARN] Duplicate marker id {marker_id} on link '{link_name}'. Ignoring this duplicate entry.") - continue - - pos = resolve_vector(marker.get("position", [0, 0, 0]), 3) - size_mm = float(marker.get("size", default_size_mm)) - markers[marker_id] = { - "marker_id": marker_id, - "link_name": link_name, - "position_m": np.asarray([pos[0] * scale, pos[1] * scale, pos[2] * scale], dtype=np.float64), - "normal": normalize_axis(resolve_vector(marker.get("normal", [0, 0, 1]), 3)), - "spin_deg": float(marker.get("spin", 0.0)), - "size_m": size_mm * scale, - } - - return markers - - -def compute_link_transforms(robot: Dict[str, Any], state: Dict[str, float], scale: float) -> Dict[str, np.ndarray]: - links = robot.get("links", {}) or {} - ordered_links = build_link_chain(robot) - transforms: Dict[str, np.ndarray] = {} - - for link_name in ordered_links: - link_info = links[link_name] or {} - parent_name = link_info.get("parent") - parent_transform = transforms[parent_name] if parent_name else np.eye(4, dtype=np.float64) - - mount_translation = np.asarray(resolve_vector(link_info.get("mountPosition", [0, 0, 0]), 3), dtype=np.float64) * scale - mount = transform_from_translation_rotation(mount_translation, link_info.get("mountRotation", [0, 0, 0])) - - joint_info = link_info.get("jointToParent", {}) or {} - joint_origin = np.asarray(resolve_vector(joint_info.get("origin", [0, 0, 0]), 3), dtype=np.float64) * scale - joint = transform_from_translation_rotation(joint_origin, joint_info.get("rotation", [0, 0, 0])) - - motion = np.eye(4, dtype=np.float64) - joint_type = str(joint_info.get("type", "fixed")).strip().lower() - control_var = str(joint_info.get("variable", joint_info.get("control", ""))).strip().lower() - axis = resolve_vector(joint_info.get("axis", [1, 0, 0]), 3) - - if joint_type == "linear": - motion[:3, 3] = normalize_axis(axis) * state.get(control_var, 0.0) * scale - elif joint_type == "revolute": - motion = axis_angle_matrix(axis, state.get(control_var, 0.0)) - - transforms[link_name] = parent_transform @ mount @ joint @ motion - - return transforms - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker["link_name"]] - local = np.ones(4, dtype=np.float64) - local[:3] = marker["position_m"] - world = link_transform @ local - return world[:3] - - -def marker_plane_axes(normal: np.ndarray, spin_deg: float) -> Tuple[np.ndarray, np.ndarray]: - n = normalize_axis(normal) - candidate = np.array((0.0, 0.0, 1.0), dtype=np.float64) - if abs(np.dot(n, candidate)) > 0.99: - candidate = np.array((1.0, 0.0, 0.0), dtype=np.float64) - - x_dir = np.cross(candidate, n) - x_dir /= max(np.linalg.norm(x_dir), 1e-9) - y_dir = np.cross(n, x_dir) - - if abs(spin_deg) > 1e-9: - theta = math.radians(spin_deg) - cos_t = math.cos(theta) - sin_t = math.sin(theta) - x_rot = x_dir * cos_t + np.cross(n, x_dir) * sin_t + n * np.dot(n, x_dir) * (1.0 - cos_t) - y_rot = y_dir * cos_t + np.cross(n, y_dir) * sin_t + n * np.dot(n, y_dir) * (1.0 - cos_t) - return x_rot, y_rot - - return x_dir, y_dir - - -def marker_object_corners(marker: Dict[str, Any]) -> np.ndarray: - half = marker["size_m"] * 0.5 - x_dir, y_dir = marker_plane_axes(marker["normal"], marker["spin_deg"]) - corners = np.stack([ - -x_dir * half + y_dir * half, - x_dir * half + y_dir * half, - x_dir * half - y_dir * half, - -x_dir * half - y_dir * half, - ], axis=0) - return marker["position_m"].reshape(1, 3) + corners - - -def compute_marker_world_corners(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker["link_name"]] - local = marker_object_corners(marker) - homogeneous = np.concatenate([local, np.ones((local.shape[0], 1), dtype=np.float64)], axis=1) - world = (link_transform @ homogeneous.T).T - return world[:, :3] - - -# ----------------------------------------------------------------------------- -# Quality model -# ----------------------------------------------------------------------------- - -def quality_factor(q: float, f: float) -> float: - # Interpret f in [0, 1] as the per-indicator influence. - # f = 1.0 -> indicator is fully active; q is applied. - # f = 0.0 -> indicator is ignored and contributes a neutral weight of 1.0. - q = clamp01(q) - f = clamp01(f) - return 1.0 - f + f * q - - -def projective_homography_quality(image_points_px: np.ndarray, image_shape: Tuple[int, int], ref: float) -> float: - if image_points_px is None or len(image_points_px) != 4: - return 1.0 - - h, w = image_shape - if h <= 0 or w <= 0: - return 1.0 - - src = np.array([[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]], dtype=np.float32) - dst = np.asarray(image_points_px, dtype=np.float32).copy() - dst[:, 0] /= float(w) - dst[:, 1] /= float(h) - - try: - H = cv2.getPerspectiveTransform(src, dst).astype(np.float64) - if abs(H[2, 2]) > 1e-12: - H = H / H[2, 2] - proj_strength = float(abs(H[2, 0]) + abs(H[2, 1])) - q = 1.0 / (1.0 + proj_strength / max(ref, 1e-6)) - return clamp01(q) - except Exception: - return 1.0 - - -def compute_observation_quality( - det: Dict[str, Any], - image_shape: Tuple[int, int], - cfg: ObservationQualityConfig, -) -> Dict[str, Any]: - quality = det.get("quality", {}) or {} - geometry = quality.get("geometry", {}) or {} - sharpness = quality.get("sharpness", {}) or {} - - edge_lengths = quality.get("edge_lengths_px", []) or [] - edge_lengths = [float(x) for x in edge_lengths if x is not None] - mean_edge_px = float(np.mean(edge_lengths)) if len(edge_lengths) else math.sqrt(max(float(quality.get("area_px", 0.0)), 0.0)) - - edge_ratio = float(quality.get("edge_ratio", 1.0) or 1.0) - distance_to_border_px = float(geometry.get("distance_to_border_px", 0.0) or 0.0) - distance_to_center_norm = float(geometry.get("distance_to_center_norm", 1.0) or 1.0) - laplacian_var = float(sharpness.get("laplacian_var", 0.0) or 0.0) - - # q in 0..1 - q_size = clamp01(mean_edge_px / max(cfg.size_ref_px, 1e-6)) - q_aspect = clamp01(2.0 / (1.0 + max(edge_ratio, 1e-6))) - q_border = clamp01(distance_to_border_px / max(cfg.border_ref_px, 1e-6)) - q_center = clamp01(1.0 - (distance_to_center_norm / max(cfg.center_ref_norm, 1e-6))) - q_sharpness = clamp01(laplacian_var / max(cfg.sharpness_ref, 1e-6)) - q_homography = projective_homography_quality(np.asarray(det.get("image_points_px", []), dtype=np.float64), image_shape, cfg.homography_ref) - - factor_map = { - "size": quality_factor(q_size, cfg.size_factor), - "aspect": quality_factor(q_aspect, cfg.aspect_factor), - "border": quality_factor(q_border, cfg.border_factor), - "center": quality_factor(q_center, cfg.center_factor), - "sharpness": quality_factor(q_sharpness, cfg.sharpness_factor), - "homography": quality_factor(q_homography, cfg.homography_factor), - } - - # Currently not active in phase 1, but already supported for later phases. - # They default to f=1, which makes them neutral. - q_normal_visibility = 1.0 - q_spin = 1.0 - factor_map["normal_visibility"] = quality_factor(q_normal_visibility, cfg.normal_visibility_factor) - factor_map["spin"] = quality_factor(q_spin, cfg.spin_factor) - - weight_multiplier = 1.0 - for v in factor_map.values(): - weight_multiplier *= float(v) - - # Conservative default: if no factor is activated in robot.json, - # this remains effectively neutral. - - detector_confidence = clamp01(float(det.get("confidence", 1.0) or 1.0)) - weighted_confidence = detector_confidence * weight_multiplier - weighted_confidence = max(cfg.weight_floor, min(1.0, weighted_confidence)) - - return { - "detector_confidence": detector_confidence, - "weighted_confidence": weighted_confidence, - "q": { - "size": q_size, - "aspect": q_aspect, - "border": q_border, - "center": q_center, - "sharpness": q_sharpness, - "homography": q_homography, - "normal_visibility": q_normal_visibility, - "spin": q_spin, - }, - "factor": factor_map, - "weight_multiplier": weight_multiplier, - "raw": { - "mean_edge_px": mean_edge_px, - "edge_ratio": edge_ratio, - "distance_to_border_px": distance_to_border_px, - "distance_to_center_norm": distance_to_center_norm, - "laplacian_var": laplacian_var, - }, - } - - -# ----------------------------------------------------------------------------- -# Constraints (kept from the existing approach) -# ----------------------------------------------------------------------------- - - -def validate_constraints(robot: Dict[str, Any], robot_markers: Dict[int, Dict[str, Any]]) -> Dict[str, ConstraintResult]: - results = {} - - rigid_body_result = ConstraintResult("RigidBodyDistances", False) - try: - rigid_body_count = 0 - for link_name in ["Arm1", "Ellbow", "Arm2"]: - link_markers = [m for m in robot_markers.values() if m["link_name"] == link_name] - if len(link_markers) >= 2: - rigid_body_count += 1 - if rigid_body_count >= 2: - rigid_body_result.enabled = True - rigid_body_result.reason = f"Found {rigid_body_count} links with 2+ markers each" - else: - rigid_body_result.reason = "Not enough rigid links with multiple markers" - except Exception as e: - rigid_body_result.reason = f"Error: {str(e)}" - results["RigidBodyDistances"] = rigid_body_result - - inter_link_x_result = ConstraintResult("InterLinkXDistances", False) - try: - links_with_markers = set(m["link_name"] for m in robot_markers.values()) - x_rotated_links = [] - for link_name in ["Arm1", "Ellbow"]: - if link_name in links_with_markers: - link_markers = [m for m in robot_markers.values() if m["link_name"] == link_name] - if len(link_markers) >= 1: - x_rotated_links.append(link_name) - if len(x_rotated_links) >= 2: - inter_link_x_result.enabled = True - inter_link_x_result.reason = f"Found {len(x_rotated_links)} X-rotation links: {', '.join(x_rotated_links)}" - else: - inter_link_x_result.reason = "Not enough X-rotation links" - except Exception as e: - inter_link_x_result.reason = f"Error: {str(e)}" - results["InterLinkXDistances"] = inter_link_x_result - - arm2_sina_result = ConstraintResult("Arm2SinADependency", True, "Sanity check only (not enforced)") - try: - arm2_markers = [m for m in robot_markers.values() if m["link_name"] == "Arm2"] - if len(arm2_markers) >= 2: - z_values = set(float(m["position_m"][2]) for m in arm2_markers) - if len(z_values) > 1: - arm2_sina_result.enabled = True - arm2_sina_result.reason = "Multiple Z-values detected; sin(a) dependency confirmed" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "No Z-variation in Arm2 markers (cannot use sin(a) constraint)" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "Not enough Arm2 markers" - except Exception as e: - arm2_sina_result.reason = f"Error: {str(e)}" - results["Arm2SinADependency"] = arm2_sina_result - - return results - - -def compute_soft_constraint_residuals( - robot_state: Dict[str, float], - robot_markers: Dict[int, Dict[str, Any]], - link_transforms: Dict[str, np.ndarray], - robot: Dict[str, Any], - enabled_constraints: Dict[str, ConstraintResult], -) -> List[float]: - residuals = [] - weight_scale = 0.1 - - if enabled_constraints["RigidBodyDistances"].enabled: - for link_name in ["Arm1", "Ellbow", "Arm2"]: - link_markers = [m for m in robot_markers.values() if m["link_name"] == link_name] - if len(link_markers) < 2: - continue - for i in range(len(link_markers)): - for j in range(i + 1, len(link_markers)): - m_i = link_markers[i] - m_j = link_markers[j] - pos_i = compute_marker_world_position(m_i, link_transforms) - pos_j = compute_marker_world_position(m_j, link_transforms) - dist_world = np.linalg.norm(pos_i - pos_j) - dist_local = np.linalg.norm(m_i["position_m"] - m_j["position_m"]) - error = dist_world - dist_local - residuals.append(error * weight_scale * 0.1) - - if enabled_constraints["InterLinkXDistances"].enabled: - arm1_markers = [m for m in robot_markers.values() if m["link_name"] == "Arm1"] - ellbow_markers = [m for m in robot_markers.values() if m["link_name"] == "Ellbow"] - if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: - m_arm1 = arm1_markers[0] - m_ellbow = ellbow_markers[0] - pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) - pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) - x_diff_world = pos_ellbow[0] - pos_arm1[0] - x_diff_ref = m_ellbow["position_m"][0] - m_arm1["position_m"][0] - residuals.append((x_diff_world - x_diff_ref) * weight_scale) - - return residuals - - -# ----------------------------------------------------------------------------- -# Camera / observation helpers -# ----------------------------------------------------------------------------- - - -def load_intrinsics(detection_json: Dict[str, Any]) -> Tuple[np.ndarray, np.ndarray]: - cam = detection_json["camera"] - K = np.asarray(cam["camera_matrix"], dtype=np.float64) - D = np.asarray(cam.get("distortion_coefficients", [0, 0, 0, 0, 0]), dtype=np.float64).reshape(-1, 1) - return K, D - - -def detection_image_shape(detection_json: Dict[str, Any]) -> Tuple[int, int]: - image = detection_json.get("image", {}) or {} - h = int(image.get("height_px", detection_json.get("height_px", 720)) or 720) - w = int(image.get("width_px", detection_json.get("width_px", 1280)) or 1280) - return h, w - - -def collect_views_and_observations( - detection_files: List[str], - robot_markers: Dict[int, Dict[str, Any]], - quality_cfg: ObservationQualityConfig, -) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]: - views: List[Dict[str, Any]] = [] - observations: List[Dict[str, Any]] = [] - - for idx, det_path in enumerate(detection_files): - detection_json = load_json(det_path) - K, D = load_intrinsics(detection_json) - image_shape = detection_image_shape(detection_json) - - views.append({ - "index": idx, - "source_file": os.path.abspath(det_path), - "camera_id": detection_json.get("camera", {}).get("camera_id", f"cam{idx+1}"), - "image_file": detection_json.get("image", {}).get("image_file"), - "image_shape": image_shape, - "K": K, - "D": D, - }) - - for det in detection_json.get("detections", []) or []: - if str(det.get("type", "aruco")).lower() != "aruco": - continue - marker_id = int(det.get("marker_id", -1)) - if marker_id < 0 or marker_id not in robot_markers: - continue - - image_points = det.get("image_points_px") - if not (isinstance(image_points, list) and len(image_points) == 4): - # Phase 1 uses full marker corners only. - continue - - image_points = np.asarray(image_points, dtype=np.float64) - marker = robot_markers[marker_id] - obs_quality = compute_observation_quality(det, image_shape, quality_cfg) - - observations.append({ - "view_index": idx, - "marker_id": marker_id, - "marker_link_corners": marker_object_corners(marker), - "image_points_px": image_points, - "confidence_base": obs_quality["detector_confidence"], - "confidence": obs_quality["weighted_confidence"], - "quality": obs_quality, - "raw_detection": det, - }) - - if len(views) == 0: - raise RuntimeError("No valid detection views found") - if len(observations) == 0: - raise RuntimeError("No marker observations matched robot.json markers") - return views, observations - - -def initial_camera_guess( - view: Dict[str, Any], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - default_state: Dict[str, float], - scale: float, - robot: Dict[str, Any], -) -> Tuple[np.ndarray, np.ndarray]: - object_points = [] - image_points = [] - link_transforms = compute_link_transforms(robot, default_state, scale) - - for obs in observations: - if obs["view_index"] != view["index"]: - continue - marker = robot_markers[obs["marker_id"]] - object_points.append(compute_marker_world_corners(marker, link_transforms)) - image_points.append(obs["image_points_px"]) - - if len(object_points) == 0: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - object_points = np.vstack(object_points) - image_points = np.vstack(image_points) - - if object_points.shape[0] < 4: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - success, rvec, tvec = cv2.solvePnP( - object_points, - image_points, - view["K"], - view["D"], - flags=cv2.SOLVEPNP_ITERATIVE, - ) - - if not success: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - return rvec, tvec - - -def project_points(points_3d: np.ndarray, rvec: np.ndarray, tvec: np.ndarray, K: np.ndarray, D: np.ndarray) -> np.ndarray: - projected, _ = cv2.projectPoints(points_3d, rvec, tvec, K, D) - return projected.reshape(-1, 2) - - -# ----------------------------------------------------------------------------- -# Optimization -# ----------------------------------------------------------------------------- - - -def pack_parameters(robot_state: Dict[str, float], camera_params: List[Tuple[np.ndarray, np.ndarray]]) -> np.ndarray: - state_vec = np.asarray([robot_state[k] for k in STATE_KEYS], dtype=np.float64) - cams = [] - for rvec, tvec in camera_params: - cams.append(rvec.reshape(3)) - cams.append(tvec.reshape(3)) - return np.concatenate([state_vec] + cams) - - -def unpack_parameters(params: np.ndarray, n_views: int) -> Tuple[Dict[str, float], List[Tuple[np.ndarray, np.ndarray]]]: - robot_state = {STATE_KEYS[i]: float(params[i]) for i in range(len(STATE_KEYS))} - camera_params = [] - offset = len(STATE_KEYS) - for _ in range(n_views): - rvec = params[offset:offset + 3].reshape(3, 1) - tvec = params[offset + 3:offset + 6].reshape(3, 1) - camera_params.append((rvec, tvec)) - offset += 6 - return robot_state, camera_params - - -def residuals_for_parameters( - params: np.ndarray, - views: List[Dict[str, Any]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - robot: Dict[str, Any], - scale: float, - default_state: Dict[str, float], - enabled_constraints: Dict[str, ConstraintResult], -) -> np.ndarray: - robot_state, camera_params = unpack_parameters(params, len(views)) - link_transforms = compute_link_transforms(robot, robot_state, scale) - - residuals = [] - - for obs in observations: - marker = robot_markers[obs["marker_id"]] - world_corners = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs["view_index"]] - proj = project_points(world_corners, rvec, tvec, views[obs["view_index"]]["K"], views[obs["view_index"]]["D"]) - diffs = proj - obs["image_points_px"] - weight = math.sqrt(max(float(obs["confidence"]), 1e-9)) - residuals.extend((diffs * weight).reshape(-1)) - - for key in STATE_KEYS: - diff = robot_state[key] - default_state.get(key, 0.0) - w = 0.001 if key in ("x", "y", "z", "e") else 0.01 - residuals.append(diff * w) - - residuals.extend(compute_soft_constraint_residuals(robot_state, robot_markers, link_transforms, robot, enabled_constraints)) - - return np.asarray(residuals, dtype=np.float64) - - -def estimate_uncertainty(result: Any, n_params: int) -> np.ndarray: - if result.jac is None: - return np.full(n_params, float("nan"), dtype=np.float64) - J = result.jac - m, n = J.shape - JTJ = J.T @ J - try: - cov = np.linalg.pinv(JTJ) - except np.linalg.LinAlgError: - cov = np.linalg.pinv(JTJ + np.eye(n) * 1e-9) - residuals = result.fun - dof = max(1, m - n) - sigma2 = float(np.sum(residuals ** 2) / dof) - cov *= sigma2 - return np.sqrt(np.diag(cov)) - - -def camera_position_world(rvec: np.ndarray, tvec: np.ndarray) -> np.ndarray: - R, _ = cv2.Rodrigues(rvec) - return (-R.T @ tvec).reshape(3) - - -# ----------------------------------------------------------------------------- -# Output building -# ----------------------------------------------------------------------------- - - -def build_output( - robot_state: Dict[str, float], - state_uncertainty: np.ndarray, - views: List[Dict[str, Any]], - camera_params: List[Tuple[np.ndarray, np.ndarray]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - scale: float, - robot: Dict[str, Any], - robot_json_path: str, - quality_cfg: ObservationQualityConfig, - final_cost: Optional[float] = None, - solver_status: Optional[int] = None, - solver_message: Optional[str] = None, -) -> Dict[str, Any]: - link_transforms = compute_link_transforms(robot, robot_state, scale) - - marker_summary: Dict[int, Dict[str, Any]] = {} - for marker_id, marker in robot_markers.items(): - marker_summary[marker_id] = { - "marker_id": marker_id, - "link_name": marker["link_name"], - "position_world_m": compute_marker_world_position(marker, link_transforms).tolist(), - "size_m": marker["size_m"], - "observation_count": 0, - "mean_confidence": None, - "mean_detector_confidence": None, - "mean_reprojection_error_px": None, - "observations": [], - } - - per_marker_errors: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - per_marker_confidences: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - per_marker_detector_conf: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - - for obs in observations: - marker_id = obs["marker_id"] - marker = robot_markers[marker_id] - object_points_m = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs["view_index"]] - proj = project_points(object_points_m, rvec, tvec, views[obs["view_index"]]["K"], views[obs["view_index"]]["D"]) - diffs = proj - obs["image_points_px"] - errors = np.linalg.norm(diffs, axis=1) - repro_error = float(np.mean(errors)) - per_marker_errors[marker_id].extend(errors.tolist()) - per_marker_confidences[marker_id].append(float(obs["confidence"])) - per_marker_detector_conf[marker_id].append(float(obs["confidence_base"])) - marker_summary[marker_id]["observation_count"] += 1 - marker_summary[marker_id]["observations"].append({ - "view_index": obs["view_index"], - "source_file": views[obs["view_index"]]["source_file"], - "image_file": views[obs["view_index"]]["image_file"], - "confidence_detector": float(obs["confidence_base"]), - "confidence_weighted": float(obs["confidence"]), - "quality": obs["quality"], - "mean_reprojection_error_px": repro_error, - "corner_reprojection_errors_px": errors.tolist(), - }) - - for marker_id, summary in marker_summary.items(): - if summary["observation_count"] > 0: - summary["mean_confidence"] = float(np.mean(per_marker_confidences[marker_id])) - summary["mean_detector_confidence"] = float(np.mean(per_marker_detector_conf[marker_id])) - summary["mean_reprojection_error_px"] = float(np.mean(per_marker_errors[marker_id])) - - camera_outputs = [] - for idx, view in enumerate(views): - rvec, tvec = camera_params[idx] - cam_pos = camera_position_world(rvec, tvec) - observed_count = sum(1 for obs in observations if obs["view_index"] == idx) - camera_outputs.append({ - "view_index": idx, - "source_file": view["source_file"], - "camera_id": view["camera_id"], - "camera_position_world_m": cam_pos.tolist(), - "rvec": rvec.reshape(-1).tolist(), - "tvec": tvec.reshape(-1).tolist(), - "intrinsics": { - "camera_matrix": view["K"].tolist(), - "distortion_coefficients": view["D"].reshape(-1).tolist(), - }, - "observation_count": observed_count, - }) - - robot_pose_output = { - "state": {k: float(robot_state[k]) for k in STATE_KEYS}, - "uncertainty": { - "x_mm": float(state_uncertainty[0]), - "y_mm": float(state_uncertainty[1]), - "z_mm": float(state_uncertainty[2]), - "a_deg": float(state_uncertainty[3]), - "b_deg": float(state_uncertainty[4]), - "c_deg": float(state_uncertainty[5]), - "e_mm": float(state_uncertainty[6]), - }, - "confidence": { - "x": float(math.exp(-state_uncertainty[0] / 10.0)) if np.isfinite(state_uncertainty[0]) else 0.0, - "y": float(math.exp(-state_uncertainty[1] / 10.0)) if np.isfinite(state_uncertainty[1]) else 0.0, - "z": float(math.exp(-state_uncertainty[2] / 10.0)) if np.isfinite(state_uncertainty[2]) else 0.0, - "a": float(math.exp(-state_uncertainty[3] / 10.0)) if np.isfinite(state_uncertainty[3]) else 0.0, - "b": float(math.exp(-state_uncertainty[4] / 10.0)) if np.isfinite(state_uncertainty[4]) else 0.0, - "c": float(math.exp(-state_uncertainty[5] / 10.0)) if np.isfinite(state_uncertainty[5]) else 0.0, - "e": float(math.exp(-state_uncertainty[6] / max(1.0, state_uncertainty[6]))) if np.isfinite(state_uncertainty[6]) else 0.0, - }, - } - - all_conf = np.asarray([obs["confidence"] for obs in observations], dtype=np.float64) - all_det_conf = np.asarray([obs["confidence_base"] for obs in observations], dtype=np.float64) - all_q_size = np.asarray([obs["quality"]["q"]["size"] for obs in observations], dtype=np.float64) - all_q_aspect = np.asarray([obs["quality"]["q"]["aspect"] for obs in observations], dtype=np.float64) - all_q_border = np.asarray([obs["quality"]["q"]["border"] for obs in observations], dtype=np.float64) - all_q_homography = np.asarray([obs["quality"]["q"]["homography"] for obs in observations], dtype=np.float64) - - all_errors = [] - for marker in marker_summary.values(): - if marker["mean_reprojection_error_px"] is not None: - all_errors.append(marker["mean_reprojection_error_px"]) - - statistics = { - "observation_count": len(observations), - "camera_count": len(views), - "marker_count": len(robot_markers), - "observed_marker_count": int(sum(1 for m in marker_summary.values() if m["observation_count"] > 0)), - "mean_detector_confidence": float(np.mean(all_det_conf)) if len(all_det_conf) else None, - "mean_weighted_confidence": float(np.mean(all_conf)) if len(all_conf) else None, - "mean_reprojection_error_px": float(np.mean(all_errors)) if len(all_errors) else None, - "quality_means": { - "size": float(np.mean(all_q_size)) if len(all_q_size) else None, - "aspect": float(np.mean(all_q_aspect)) if len(all_q_aspect) else None, - "border": float(np.mean(all_q_border)) if len(all_q_border) else None, - "homography": float(np.mean(all_q_homography)) if len(all_q_homography) else None, - }, - "quality_config": { - "size_ref_px": quality_cfg.size_ref_px, - "border_ref_px": quality_cfg.border_ref_px, - "center_ref_norm": quality_cfg.center_ref_norm, - "sharpness_ref": quality_cfg.sharpness_ref, - "homography_ref": quality_cfg.homography_ref, - "size_factor": quality_cfg.size_factor, - "aspect_factor": quality_cfg.aspect_factor, - "border_factor": quality_cfg.border_factor, - "center_factor": quality_cfg.center_factor, - "sharpness_factor": quality_cfg.sharpness_factor, - "homography_factor": quality_cfg.homography_factor, - }, - } - - output = { - "schema_version": "1.0", - "created_utc": _dt.datetime.utcnow().isoformat() + "Z", - "source_robot_json": os.path.abspath(robot_json_path), - "source_detections": [view["source_file"] for view in views], - "robot_pose": robot_pose_output, - "camera_poses": camera_outputs, - "marker_positions": list(marker_summary.values()), - "statistics": statistics, - "solver": { - "final_cost": final_cost, - "status": solver_status, - "message": solver_message, - }, - } - return output - - -def build_summary(output: Dict[str, Any]) -> Dict[str, Any]: - return { - "schema_version": output.get("schema_version"), - "created_utc": output.get("created_utc"), - "source_robot_json": output.get("source_robot_json"), - "source_detections": output.get("source_detections"), - "solver": output.get("solver", {}), - "robot_pose": output.get("robot_pose"), - "statistics": output.get("statistics", {}), - } - - -# ----------------------------------------------------------------------------- -# Diagnostics -# ----------------------------------------------------------------------------- - - -def print_constraint_sanity_check( - robot_state: Dict[str, float], - robot_markers: Dict[int, Dict[str, Any]], - link_transforms: Dict[str, np.ndarray], - robot: Dict[str, Any], - enabled_constraints: Dict[str, ConstraintResult], - scale: float, -) -> None: - print("\n" + "=" * 70) - print("CONSTRAINT SANITY CHECKS (after optimization)") - print("=" * 70) - - if enabled_constraints["RigidBodyDistances"].enabled: - print("\n1. RIGID BODY DISTANCES") - for link_name in ["Arm1", "Ellbow", "Arm2"]: - link_markers = [m for m in robot_markers.values() if m["link_name"] == link_name] - if len(link_markers) < 2: - continue - max_error = 0.0 - for i in range(len(link_markers)): - for j in range(i + 1, len(link_markers)): - m_i = link_markers[i] - m_j = link_markers[j] - pos_i = compute_marker_world_position(m_i, link_transforms) - pos_j = compute_marker_world_position(m_j, link_transforms) - dist_world = np.linalg.norm(pos_i - pos_j) - dist_local = np.linalg.norm(m_i["position_m"] - m_j["position_m"]) - max_error = max(max_error, abs(dist_world - dist_local)) - status = "✓" if max_error < 1.0 else "⚠" if max_error < 5.0 else "✗" - print(f" {link_name:10s}: max_error = {max_error:.3f} mm {status}") - - if enabled_constraints["InterLinkXDistances"].enabled: - print("\n2. INTER-LINK X-DISTANCES") - arm1_markers = [m for m in robot_markers.values() if m["link_name"] == "Arm1"] - ellbow_markers = [m for m in robot_markers.values() if m["link_name"] == "Ellbow"] - if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: - m_arm1 = arm1_markers[0] - m_ellbow = ellbow_markers[0] - pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) - pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) - x_diff_world = pos_ellbow[0] - pos_arm1[0] - x_diff_ref = m_ellbow["position_m"][0] - m_arm1["position_m"][0] - error = abs(x_diff_world - x_diff_ref) - status = "✓" if error < 1.0 else "⚠" if error < 5.0 else "✗" - print(f" Arm1 <-> Ellbow: error = {error:.3f} mm {status}") - - if enabled_constraints["Arm2SinADependency"].enabled: - print("\n3. ARM2 sin(a) DEPENDENCY (sanity check)") - arm2_markers = [m for m in robot_markers.values() if m["link_name"] == "Arm2"] - if len(arm2_markers) >= 2: - a_rad = math.radians(robot_state["a"]) - sin_a = math.sin(a_rad) - cos_a = math.cos(a_rad) - max_error = 0.0 - # This remains only a qualitative check. - for m in arm2_markers: - pos_world = compute_marker_world_position(m, link_transforms) - x_world = pos_world[0] - x_local = m["position_m"][0] - z_local = m["position_m"][2] - x_expected = (90.0 * scale) + x_local * cos_a - z_local * sin_a - max_error = max(max_error, abs(x_world - x_expected)) - status = "✓" if max_error < 5.0 else "⚠" - print(f" X-consistency with sin(a): max_error = {max_error:.3f} mm {status}") - print(" (Note: this is a consistency check, not a hard constraint)") - - print("=" * 70) - - -# ----------------------------------------------------------------------------- -# Main -# ----------------------------------------------------------------------------- - - -def main() -> None: - parser = argparse.ArgumentParser(description="Multiview optimization of robot pose and camera extrinsics") - parser.add_argument("--robot", required=True, help="Path to robot.json") - parser.add_argument("--detections", required=True, nargs="+", help="List of detection JSON files") - parser.add_argument("--outDir", required=True, help="Output directory") - parser.add_argument("--write-summary", action="store_true", help="Write summary file") - parser.add_argument("--max-iter", type=int, default=500, help="Maximum optimizer iterations") - args = parser.parse_args() - - os.makedirs(args.outDir, exist_ok=True) - - robot_json_path = os.path.abspath(args.robot) - robot = load_json(robot_json_path) - scale = parse_metric_scale(robot) - quality_cfg = load_quality_config(robot) - - default_state = {k: float(robot.get("defaultPosition", {}).get(k, 0.0) or 0.0) for k in STATE_KEYS} - robot_markers = extract_markers(robot, scale) - - print("\n" + "=" * 70) - print("CONSTRAINT VALIDATION") - print("=" * 70) - enabled_constraints = validate_constraints(robot, robot_markers) - for _, result in enabled_constraints.items(): - print(result) - print("=" * 70) - - views, observations = collect_views_and_observations(args.detections, robot_markers, quality_cfg) - - print("\n" + "=" * 70) - print("OBSERVATION QUALITY SUMMARY") - print("=" * 70) - print(f"Total observations: {len(observations)}") - print() - - quality_by_marker: Dict[int, List[Dict[str, Any]]] = {} - for obs in observations: - quality_by_marker.setdefault(obs["marker_id"], []).append(obs["quality"]) - - print(f"{'Marker':>8} {'Link':>12} {'Count':>6} {'Avg Size':>10} {'Avg Aspec':>10} {'Avg Hmg.':>10} {'Avg Conf.':>10}") - print("-" * 74) - for marker_id in sorted(quality_by_marker.keys()): - marker = robot_markers[marker_id] - qlist = quality_by_marker[marker_id] - avg_size = float(np.mean([q["q"]["size"] for q in qlist])) - avg_aspect = float(np.mean([q["q"]["aspect"] for q in qlist])) - avg_homog = float(np.mean([q["q"]["homography"] for q in qlist])) - obs_for_marker = [o for o in observations if o["marker_id"] == marker_id] - avg_conf = float(np.mean([o["confidence"] for o in obs_for_marker])) - print(f"{marker_id:8d} {marker['link_name']:>12} {len(qlist):6d} {avg_size:10.3f} {avg_aspect:10.3f} {avg_homog:10.3f} {avg_conf:10.3f}") - print("=" * 70) - - camera_guesses = [] - for view in views: - rvec, tvec = initial_camera_guess(view, observations, robot_markers, default_state, scale, robot) - camera_guesses.append((rvec, tvec)) - - x0 = pack_parameters(default_state, camera_guesses) - - progress = { - "iter": 0, - "last_cost": None, - "last_print": time.time(), - "prev_x": x0.copy(), - } - - def progress_callback(xk: np.ndarray) -> None: - progress["iter"] += 1 - now = time.time() - if progress["iter"] == 1 or now - progress["last_print"] >= 1.0: - res = residuals_for_parameters(xk, views, observations, robot_markers, robot, scale, default_state, enabled_constraints) - cost = 0.5 * float(np.dot(res, res)) - delta_cost = None - convergence = "" - if progress["last_cost"] is not None: - delta_cost = cost - progress["last_cost"] - if abs(delta_cost) < 1e-3: - convergence = " stable" - elif delta_cost < 0: - convergence = " improving" - else: - convergence = " worsening" - step_norm = float(np.linalg.norm(xk - progress["prev_x"])) - print(f'[Multiview] iter={progress["iter"]:4d} cost={cost:.4f}' + (f' delta={delta_cost:.4g}' if delta_cost is not None else "") + f' step={step_norm:.4g}' + convergence) - progress["last_cost"] = cost - progress["last_print"] = now - progress["prev_x"] = xk.copy() - - result = least_squares( - residuals_for_parameters, - x0, - args=(views, observations, robot_markers, robot, scale, default_state, enabled_constraints), - jac="2-point", - method="trf", - loss="soft_l1", - f_scale=1.0, - max_nfev=args.max_iter, - callback=progress_callback, - ) - - robot_state, camera_params = unpack_parameters(result.x, len(views)) - uncertainties = estimate_uncertainty(result, len(result.x)) - - link_transforms = compute_link_transforms(robot, robot_state, scale) - print_constraint_sanity_check(robot_state, robot_markers, link_transforms, robot, enabled_constraints, scale) - - output = build_output( - robot_state, - uncertainties[:len(STATE_KEYS)], - views, - camera_params, - observations, - robot_markers, - scale, - robot, - robot_json_path, - quality_cfg, - final_cost=float(result.cost), - solver_status=int(result.status), - solver_message=str(result.message), - ) - - out_path = Path(args.outDir) / "multiview_pose.json" - save_json(output, out_path) - print(f"Saved: {out_path}") - - if args.write_summary: - summary_path = Path(args.outDir) / "multiview_pose_summary.json" - summary = build_summary(output) - save_json(summary, summary_path) - print(f"Saved: {summary_path}") - - -if __name__ == "__main__": - main() diff --git a/pipeline/2_Multiview_ohne_confidence.py b/pipeline/2_Multiview_ohne_confidence.py deleted file mode 100644 index 666bc1d..0000000 --- a/pipeline/2_Multiview_ohne_confidence.py +++ /dev/null @@ -1,971 +0,0 @@ -#!/usr/bin/env python3 - -""" -============================================================ -STEP 2b — Simultane Multiview-Optimierung für Roboterpose -============================================================ - -Ziel: - Aus mehreren ArUco-Detektionsdateien die gemeinsame - Roboterpose (x,y,z,a,b,c,e) schätzen und jede Kamera-Pose - sowie Marker-Weltpositionen ausgeben. - -Eingabe: - --robot ../robot.json - --detections render_1a_aruco_detection.json render_1b_aruco_detection.json ... - --outDir . - -Ausgabe: - multiview_pose.json - -Hinweis: - Dieses Skript verwendet die Markerpositionen aus robot.json - als kinematische Constraints und optimiert gleichzeitig: - - Roboterzustand (x,y,z,a,b,c,e) - - Kameraextrinsische Parameter pro Bild - -""" - -import argparse -import datetime -import json -import math -import os -import time -from pathlib import Path -from typing import Any, Dict, List, Tuple - -import cv2 -import numpy as np -from scipy.optimize import least_squares - -STATE_KEYS = ["x", "y", "z", "a", "b", "c", "e"] - -# ------------------------------------------------------------------ -# Constraint definitions and validation -# ------------------------------------------------------------------ - -class ConstraintResult: - """Result of validating/applying a single constraint""" - def __init__(self, name: str, enabled: bool, reason: str = ""): - self.name = name - self.enabled = enabled - self.reason = reason - self.residuals = [] - - def __str__(self) -> str: - status = "✓ ENABLED" if self.enabled else "✗ DISABLED" - return f"{self.name:40s} {status:12s} {self.reason}" - - -def validate_constraints(robot: Dict[str, Any], robot_markers: Dict[int, Dict[str, Any]]) -> Dict[str, ConstraintResult]: - """ - Validate which constraints can be applied based on robot geometry. - Returns a dict of constraint_name -> ConstraintResult - """ - results = {} - - # --- Constraint 1: Rigid body distances within each link --- - rigid_body_result = ConstraintResult("RigidBodyDistances", False) - try: - rigid_body_count = 0 - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) >= 2: - rigid_body_count += 1 - if rigid_body_count >= 2: - rigid_body_result.enabled = True - rigid_body_result.reason = f"Found {rigid_body_count} links with 2+ markers each" - else: - rigid_body_result.reason = "Not enough rigid links with multiple markers" - except Exception as e: - rigid_body_result.reason = f"Error: {str(e)}" - results['RigidBodyDistances'] = rigid_body_result - - # --- Constraint 2: Fixed X-distances between links (rotation around X-axis) --- - inter_link_x_result = ConstraintResult("InterLinkXDistances", False) - try: - links_with_markers = set(m['link_name'] for m in robot_markers.values()) - x_rotated_links = [] - for link_name in ['Arm1', 'Ellbow']: - if link_name in links_with_markers: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) >= 1: - x_rotated_links.append(link_name) - if len(x_rotated_links) >= 2: - inter_link_x_result.enabled = True - inter_link_x_result.reason = f"Found {len(x_rotated_links)} X-rotation links: {', '.join(x_rotated_links)}" - else: - inter_link_x_result.reason = "Not enough X-rotation links" - except Exception as e: - inter_link_x_result.reason = f"Error: {str(e)}" - results['InterLinkXDistances'] = inter_link_x_result - - # --- Sanity check (not a hard constraint): Arm2 sin(a) dependency --- - arm2_sina_result = ConstraintResult("Arm2SinADependency", True, "Sanity check only (not enforced)") - try: - arm2_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm2'] - if len(arm2_markers) >= 2: - z_values = set(m['position_m'][2] for m in arm2_markers) - if len(z_values) > 1: - arm2_sina_result.enabled = True - arm2_sina_result.reason = "Multiple Z-values detected; sin(a) dependency confirmed" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "No Z-variation in Arm2 markers (cannot use sin(a) constraint)" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "Not enough Arm2 markers" - except Exception as e: - arm2_sina_result.reason = f"Error: {str(e)}" - results['Arm2SinADependency'] = arm2_sina_result - - return results - - -# ------------------------------------------------------------------ -# JSON helpers -# ------------------------------------------------------------------ - -def load_json(path: str) -> Dict[str, Any]: - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - - -def save_json(data: Dict[str, Any], path: Path) -> None: - with open(path, 'w', encoding='utf-8') as f: - json.dump(data, f, indent=2) - - -# ------------------------------------------------------------------ -# robot.json helpers -# ------------------------------------------------------------------ - -def resolve_scalar(value: Any, default: float = 0.0) -> float: - if value is None: - return default - if isinstance(value, (int, float)): - return float(value) - try: - return float(str(value).strip()) - except ValueError: - return default - - -def resolve_vector(value: Any, default_len: int = 3) -> Tuple[float, ...]: - if value is None: - return tuple(0.0 for _ in range(default_len)) - if isinstance(value, (int, float, str)): - return (resolve_scalar(value),) + tuple(0.0 for _ in range(default_len - 1)) - if isinstance(value, (list, tuple)): - resolved = [resolve_scalar(v) for v in value] - if len(resolved) < default_len: - resolved.extend([0.0] * (default_len - len(resolved))) - return tuple(resolved[:default_len]) - return tuple(0.0 for _ in range(default_len)) - - -def parse_metric_scale(robot: Dict[str, Any]) -> float: - rendering_info = robot.get('renderingInfo', {}) or {} - metric = rendering_info.get('metric', 'mm') - return 0.001 if str(metric).strip().lower() == 'mm' else 1.0 - - -def normalize_axis(axis: Any) -> np.ndarray: - vec = np.asarray(axis, dtype=np.float64) - if vec.shape != (3,): - vec = vec.reshape(-1)[:3] - norm = np.linalg.norm(vec) - return vec / max(norm, 1e-9) - - -def euler_deg_to_matrix(euler_deg: Any) -> np.ndarray: - x_deg, y_deg, z_deg = resolve_vector(euler_deg, 3) - x = math.radians(x_deg) - y = math.radians(y_deg) - z = math.radians(z_deg) - - cx = math.cos(x) - sx = math.sin(x) - cy = math.cos(y) - sy = math.sin(y) - cz = math.cos(z) - sz = math.sin(z) - - Rx = np.array([ - [1.0, 0.0, 0.0], - [0.0, cx, -sx], - [0.0, sx, cx] - ], dtype=np.float64) - - Ry = np.array([ - [cy, 0.0, sy], - [0.0, 1.0, 0.0], - [-sy, 0.0, cy] - ], dtype=np.float64) - - Rz = np.array([ - [cz, -sz, 0.0], - [sz, cz, 0.0], - [0.0, 0.0, 1.0] - ], dtype=np.float64) - - return Rz @ Ry @ Rx - - -def transform_from_translation_rotation(translation: Any, rotation_deg: Any) -> np.ndarray: - T = np.eye(4, dtype=np.float64) - pos = np.asarray(resolve_vector(translation, 3), dtype=np.float64) - T[:3, 3] = pos - T[:3, :3] = euler_deg_to_matrix(rotation_deg) - return T - - -def axis_angle_matrix(axis: Any, angle_deg: float) -> np.ndarray: - axis_vec = normalize_axis(axis) - theta = math.radians(angle_deg) - kx, ky, kz = axis_vec - c = math.cos(theta) - s = math.sin(theta) - v = 1.0 - c - R = np.array([ - [kx * kx * v + c, kx * ky * v - kz * s, kx * kz * v + ky * s], - [ky * kx * v + kz * s, ky * ky * v + c, ky * kz * v - kx * s], - [kz * kx * v - ky * s, kz * ky * v + kx * s, kz * kz * v + c] - ], dtype=np.float64) - T = np.eye(4, dtype=np.float64) - T[:3, :3] = R - return T - - -# ------------------------------------------------------------------ -# Kinematics and marker extraction -# ------------------------------------------------------------------ - -def extract_markers(robot: Dict[str, Any], scale: float) -> Dict[int, Dict[str, Any]]: - markers = {} - links = robot.get('links', {}) or {} - marker_defaults = (robot.get('renderingInfo', {}) or {}).get('markerDefaults', {}) or {} - default_size_mm = float(marker_defaults.get('size', 25.0)) - - for link_name, link_info in links.items(): - for marker in link_info.get('markers', []) or []: - marker_id = int(marker.get('id', -1)) - if marker_id < 0: - continue - - pos = resolve_vector(marker.get('position', [0, 0, 0]), 3) - size_mm = float(marker.get('size', default_size_mm)) - markers[marker_id] = { - 'marker_id': marker_id, - 'link_name': link_name, - 'position_m': np.asarray([pos[0] * scale, pos[1] * scale, pos[2] * scale], dtype=np.float64), - 'normal': normalize_axis(resolve_vector(marker.get('normal', [0, 0, 1]), 3)), - 'spin_deg': float(marker.get('spin', 0.0)), - 'size_m': size_mm * scale, - } - - return markers - - -def marker_plane_axes(normal: np.ndarray, spin_deg: float) -> Tuple[np.ndarray, np.ndarray]: - n = normalize_axis(normal) - candidate = np.array((0.0, 0.0, 1.0), dtype=np.float64) - if abs(np.dot(n, candidate)) > 0.99: - candidate = np.array((1.0, 0.0, 0.0), dtype=np.float64) - - x_dir = np.cross(candidate, n) - x_dir /= max(np.linalg.norm(x_dir), 1e-9) - y_dir = np.cross(n, x_dir) - - if abs(spin_deg) > 1e-6: - theta = math.radians(spin_deg) - cos_t = math.cos(theta) - sin_t = math.sin(theta) - x_rot = x_dir * cos_t + np.cross(n, x_dir) * sin_t + n * np.dot(n, x_dir) * (1.0 - cos_t) - y_rot = y_dir * cos_t + np.cross(n, y_dir) * sin_t + n * np.dot(n, y_dir) * (1.0 - cos_t) - return x_rot, y_rot - - return x_dir, y_dir - - -def marker_object_corners(marker: Dict[str, Any]) -> np.ndarray: - half = marker['size_m'] * 0.5 - x_dir, y_dir = marker_plane_axes(marker['normal'], marker['spin_deg']) - corners = np.stack([ - -x_dir * half + y_dir * half, - x_dir * half + y_dir * half, - x_dir * half - y_dir * half, - -x_dir * half - y_dir * half - ], axis=0) - return marker['position_m'].reshape(1, 3) + corners - - -def build_link_chain(robot: Dict[str, Any]) -> List[str]: - links = robot.get('links', {}) or {} - ordered: List[str] = [] - remaining = set(links.keys()) - - while remaining: - progress = False - for name in list(remaining): - parent = links[name].get('parent') - if not parent or parent in ordered: - ordered.append(name) - remaining.remove(name) - progress = True - if not progress: - raise RuntimeError('Cycle detected in robot link tree or missing parent link') - return ordered - - -def compute_link_transforms(robot: Dict[str, Any], state: Dict[str, float], scale: float) -> Dict[str, np.ndarray]: - links = robot.get('links', {}) or {} - ordered_links = build_link_chain(robot) - transforms: Dict[str, np.ndarray] = {} - - for link_name in ordered_links: - link_info = links[link_name] or {} - parent_name = link_info.get('parent') - parent_transform = transforms[parent_name] if parent_name else np.eye(4, dtype=np.float64) - - mount_translation = np.asarray(resolve_vector(link_info.get('mountPosition', [0, 0, 0]), 3), dtype=np.float64) * scale - mount = transform_from_translation_rotation( - mount_translation, - link_info.get('mountRotation', [0, 0, 0]) - ) - - joint_info = link_info.get('jointToParent', {}) or {} - joint_origin = np.asarray(resolve_vector(joint_info.get('origin', [0, 0, 0]), 3), dtype=np.float64) * scale - joint = transform_from_translation_rotation( - joint_origin, - joint_info.get('rotation', [0, 0, 0]) - ) - - motion = np.eye(4, dtype=np.float64) - joint_type = str(joint_info.get('type', 'fixed')).strip().lower() - control_var = str(joint_info.get('variable', joint_info.get('control', ''))).strip().lower() - axis = resolve_vector(joint_info.get('axis', [1, 0, 0]), 3) - - if joint_type == 'linear': - motion[:3, 3] = normalize_axis(axis) * state.get(control_var, 0.0) * scale - elif joint_type == 'revolute': - motion = axis_angle_matrix(axis, state.get(control_var, 0.0)) - - transforms[link_name] = parent_transform @ mount @ joint @ motion - - return transforms - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = np.ones(4, dtype=np.float64) - local[:3] = marker['position_m'] - world = link_transform @ local - return world[:3] - - -# ------------------------------------------------------------------ -# Camera / observation helpers -# ------------------------------------------------------------------ - -def load_intrinsics(detection_json: Dict[str, Any]) -> Tuple[np.ndarray, np.ndarray]: - cam = detection_json['camera'] - K = np.asarray(cam['camera_matrix'], dtype=np.float64) - D = np.asarray(cam.get('distortion_coefficients', [0, 0, 0, 0, 0]), dtype=np.float64).reshape(-1, 1) - return K, D - - -def collect_views_and_observations( - detection_files: List[str], - robot_markers: Dict[int, Dict[str, Any]] -) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]: - views: List[Dict[str, Any]] = [] - observations: List[Dict[str, Any]] = [] - - for idx, det_path in enumerate(detection_files): - detection_json = load_json(det_path) - K, D = load_intrinsics(detection_json) - views.append({ - 'index': idx, - 'source_file': os.path.abspath(det_path), - 'camera_id': detection_json.get('camera', {}).get('camera_id', f'cam{idx+1}'), - 'image_file': detection_json.get('image', {}).get('image_file'), - 'K': K, - 'D': D - }) - - for det in detection_json.get('detections', []) or []: - marker_id = int(det.get('marker_id', -1)) - if marker_id < 0 or marker_id not in robot_markers: - continue - - image_points = det.get('image_points_px') - if isinstance(image_points, list) and len(image_points) == 4: - image_points = np.asarray(image_points, dtype=np.float64) - else: - center = resolve_vector(det.get('center_px', [0, 0]), 2) - image_points = np.asarray([center], dtype=np.float64) - - confidence = float(det.get('confidence', 1.0)) - marker = robot_markers[marker_id] - observations.append({ - 'view_index': idx, - 'marker_id': marker_id, - 'marker_link_corners': marker_object_corners(marker), - 'image_points_px': image_points, - 'confidence': max(0.01, min(1.0, confidence)) - }) - - if len(views) == 0: - raise RuntimeError('No valid detection views found') - - if len(observations) == 0: - raise RuntimeError('No marker observations matched robot.json markers') - - return views, observations - - -def compute_marker_world_corners(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = marker_object_corners(marker) - homogeneous = np.concatenate([local, np.ones((local.shape[0], 1), dtype=np.float64)], axis=1) - world = (link_transform @ homogeneous.T).T - return world[:, :3] - - -def initial_camera_guess( - view: Dict[str, Any], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - default_state: Dict[str, float], - scale: float, - robot: Dict[str, Any] -) -> Tuple[np.ndarray, np.ndarray]: - object_points = [] - image_points = [] - - link_transforms = compute_link_transforms(robot, default_state, scale) - - for obs in observations: - if obs['view_index'] != view['index']: - continue - marker = robot_markers[obs['marker_id']] - object_points.append(compute_marker_world_corners(marker, link_transforms)) - image_points.append(obs['image_points_px']) - - if len(object_points) == 0: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - object_points = np.vstack(object_points) - image_points = np.vstack(image_points) - - if object_points.shape[0] < 4: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - success, rvec, tvec = cv2.solvePnP( - object_points, - image_points, - view['K'], - view['D'], - flags=cv2.SOLVEPNP_ITERATIVE - ) - - if not success: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - return rvec, tvec - - -def project_points( - points_3d: np.ndarray, - rvec: np.ndarray, - tvec: np.ndarray, - K: np.ndarray, - D: np.ndarray -) -> np.ndarray: - projected, _ = cv2.projectPoints(points_3d, rvec, tvec, K, D) - return projected.reshape(-1, 2) - - -def compute_soft_constraint_residuals( - robot_state: Dict[str, float], - robot_markers: Dict[int, Dict[str, Any]], - link_transforms: Dict[str, np.ndarray], - robot: Dict[str, Any], - enabled_constraints: Dict[str, ConstraintResult] -) -> List[float]: - """ - Compute residuals from soft constraints (kinematic consistency, rigid body distances). - Returns a list of constraint residuals to append to the total residual vector. - """ - residuals = [] - weight_scale = 0.1 # Weight for soft constraints relative to reprojection errors - - # Constraint 1: Rigid body distances within each link - if enabled_constraints['RigidBodyDistances'].enabled: - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) < 2: - continue - - # Compute all pairwise distances in world coords - for i in range(len(link_markers)): - for j in range(i + 1, len(link_markers)): - m_i = link_markers[i] - m_j = link_markers[j] - - pos_i = compute_marker_world_position(m_i, link_transforms) - pos_j = compute_marker_world_position(m_j, link_transforms) - - dist_world = np.linalg.norm(pos_i - pos_j) - - # Reference distance in local coords - dist_local = np.linalg.norm(m_i['position_m'] - m_j['position_m']) - - # Residual: difference should be zero (rigid body) - error = dist_world - dist_local - residuals.append(error * weight_scale * 0.1) # Very soft weight - - # Constraint 2: Fixed X-distances between links (Arm1 <-> Ellbow) - if enabled_constraints['InterLinkXDistances'].enabled: - arm1_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm1'] - ellbow_markers = [m for m in robot_markers.values() if m['link_name'] == 'Ellbow'] - - if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: - # Get first marker from each link - m_arm1 = arm1_markers[0] - m_ellbow = ellbow_markers[0] - - pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) - pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) - - # X-distance in world should match reference (relative position) - # Since both rotate around X-axis at different points, we check consistency - x_diff_world = pos_ellbow[0] - pos_arm1[0] - x_diff_ref = m_ellbow['position_m'][0] - m_arm1['position_m'][0] - - error = x_diff_world - x_diff_ref - residuals.append(error * weight_scale) - - return residuals - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - """Compute the world position of a marker given current link transforms.""" - link_transform = link_transforms[marker['link_name']] - local_pos = np.concatenate([marker['position_m'], [1.0]]) - world_pos = (link_transform @ local_pos)[:3] - return world_pos - - -# ------------------------------------------------------------------ -# Optimization -# ------------------------------------------------------------------ - -def pack_parameters(robot_state: Dict[str, float], camera_params: List[Tuple[np.ndarray, np.ndarray]]) -> np.ndarray: - state_vec = np.asarray([robot_state[k] for k in STATE_KEYS], dtype=np.float64) - cams = [] - for rvec, tvec in camera_params: - cams.append(rvec.reshape(3)) - cams.append(tvec.reshape(3)) - return np.concatenate([state_vec] + cams) - - -def unpack_parameters(params: np.ndarray, n_views: int) -> Tuple[Dict[str, float], List[Tuple[np.ndarray, np.ndarray]]]: - robot_state = {STATE_KEYS[i]: float(params[i]) for i in range(len(STATE_KEYS))} - camera_params = [] - offset = len(STATE_KEYS) - for _ in range(n_views): - rvec = params[offset:offset + 3].reshape(3, 1) - tvec = params[offset + 3:offset + 6].reshape(3, 1) - camera_params.append((rvec, tvec)) - offset += 6 - return robot_state, camera_params - - -def residuals_for_parameters( - params: np.ndarray, - views: List[Dict[str, Any]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - robot: Dict[str, Any], - scale: float, - default_state: Dict[str, float], - enabled_constraints: Dict[str, ConstraintResult] -) -> np.ndarray: - robot_state, camera_params = unpack_parameters(params, len(views)) - link_transforms = compute_link_transforms(robot, robot_state, scale) - - residuals = [] - - # Reprojection residuals (primary observation) - for obs in observations: - marker = robot_markers[obs['marker_id']] - world_corners = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(world_corners, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - weight = math.sqrt(obs['confidence']) - residuals.extend((diffs * weight).reshape(-1)) - - # Weak priors on robot state - for key in STATE_KEYS: - diff = robot_state[key] - default_state.get(key, 0.0) - if key in ('x', 'y', 'z', 'e'): - w = 0.001 - else: - w = 0.01 - residuals.append(diff * w) - - # Soft constraints (kinematic consistency, rigid body constraints) - soft_constraint_residuals = compute_soft_constraint_residuals( - robot_state, robot_markers, link_transforms, robot, enabled_constraints - ) - residuals.extend(soft_constraint_residuals) - - return np.asarray(residuals, dtype=np.float64) - - - -def estimate_uncertainty(result: Any, n_params: int) -> np.ndarray: - if result.jac is None: - return np.full(n_params, float('nan'), dtype=np.float64) - J = result.jac - m, n = J.shape - JTJ = J.T @ J - try: - cov = np.linalg.pinv(JTJ) - except np.linalg.LinAlgError: - cov = np.linalg.pinv(JTJ + np.eye(n) * 1e-9) - residuals = result.fun - dof = max(1, m - n) - sigma2 = float(np.sum(residuals ** 2) / dof) - cov *= sigma2 - return np.sqrt(np.diag(cov)) - - -def print_constraint_sanity_check( - robot_state: Dict[str, float], - robot_markers: Dict[int, Dict[str, Any]], - link_transforms: Dict[str, np.ndarray], - robot: Dict[str, Any], - enabled_constraints: Dict[str, ConstraintResult] -) -> None: - """ - Print sanity checks for all constraints to verify the optimization result. - """ - print("\n" + "=" * 70) - print("CONSTRAINT SANITY CHECKS (after optimization)") - print("=" * 70) - - # Check 1: Rigid body distances - if enabled_constraints['RigidBodyDistances'].enabled: - print("\n1. RIGID BODY DISTANCES") - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) < 2: - continue - - max_error = 0.0 - for i in range(len(link_markers)): - for j in range(i + 1, len(link_markers)): - m_i = link_markers[i] - m_j = link_markers[j] - - pos_i = compute_marker_world_position(m_i, link_transforms) - pos_j = compute_marker_world_position(m_j, link_transforms) - - dist_world = np.linalg.norm(pos_i - pos_j) - dist_local = np.linalg.norm(m_i['position_m'] - m_j['position_m']) - error = abs(dist_world - dist_local) - max_error = max(max_error, error) - - status = "✓" if max_error < 1.0 else "⚠" if max_error < 5.0 else "✗" - print(f" {link_name:10s}: max_error = {max_error:.3f} mm {status}") - - # Check 2: Inter-link X distances - if enabled_constraints['InterLinkXDistances'].enabled: - print("\n2. INTER-LINK X-DISTANCES") - arm1_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm1'] - ellbow_markers = [m for m in robot_markers.values() if m['link_name'] == 'Ellbow'] - - if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: - m_arm1 = arm1_markers[0] - m_ellbow = ellbow_markers[0] - - pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) - pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) - - x_diff_world = pos_ellbow[0] - pos_arm1[0] - x_diff_ref = m_ellbow['position_m'][0] - m_arm1['position_m'][0] - error = abs(x_diff_world - x_diff_ref) - - status = "✓" if error < 1.0 else "⚠" if error < 5.0 else "✗" - print(f" Arm1 <-> Ellbow: error = {error:.3f} mm {status}") - - # Check 3: Arm2 sin(a) dependency - if enabled_constraints['Arm2SinADependency'].enabled: - print("\n3. ARM2 sin(a) DEPENDENCY (sanity check)") - arm2_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm2'] - if len(arm2_markers) >= 2: - # Check that markers with different Z values have different X spreads - a_rad = math.radians(robot_state['a']) - sin_a = math.sin(a_rad) - cos_a = math.cos(a_rad) - - z_variations = {} - for m in arm2_markers: - z_local = m['position_m'][2] - x_local = m['position_m'][0] - pos_world = compute_marker_world_position(m, link_transforms) - x_world = pos_world[0] - - # Expected: x_world = 90 + x_local * cos(a) - z_local * sin(a) - x_expected = 90 * (robot.get('renderingInfo', {}).get('metric', 'mm') == 'mm' and 0.09 or 0.09) + x_local * cos_a - z_local * sin_a - x_error = abs(x_world - x_expected) - - if z_local not in z_variations: - z_variations[z_local] = [] - z_variations[z_local].append(x_error) - - max_error = max(max(errors) for errors in z_variations.values()) if z_variations else 0.0 - status = "✓" if max_error < 5.0 else "⚠" if max_error < 10.0 else "⚠" - print(f" X-consistency with sin(a): max_error = {max_error:.3f} mm {status}") - print(f" (Note: this is a consistency check, not a hard constraint)") - - print("=" * 70) - - -def camera_position_world(rvec: np.ndarray, tvec: np.ndarray) -> np.ndarray: - R, _ = cv2.Rodrigues(rvec) - return (-R.T @ tvec).reshape(3) - - -def build_output( - robot_state: Dict[str, float], - state_uncertainty: np.ndarray, - views: List[Dict[str, Any]], - camera_params: List[Tuple[np.ndarray, np.ndarray]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - scale: float, - robot: Dict[str, Any], - robot_json_path: str -) -> Dict[str, Any]: - link_transforms = compute_link_transforms(robot, robot_state, scale) - - marker_summary: Dict[int, Dict[str, Any]] = {} - for marker_id, marker in robot_markers.items(): - marker_summary[marker_id] = { - 'marker_id': marker_id, - 'link_name': marker['link_name'], - 'position_world_m': compute_marker_world_position(marker, link_transforms).tolist(), - 'size_m': marker['size_m'], - 'observation_count': 0, - 'mean_confidence': None, - 'mean_reprojection_error_px': None, - 'observations': [] - } - - per_marker_errors: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - per_marker_confidences: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - - link_transforms = compute_link_transforms(robot, robot_state, scale) - for obs in observations: - marker_id = obs['marker_id'] - marker = robot_markers[marker_id] - object_points_m = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(object_points_m, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - errors = np.linalg.norm(diffs, axis=1) - repro_error = float(np.mean(errors)) - per_marker_errors[marker_id].extend(errors.tolist()) - per_marker_confidences[marker_id].append(obs['confidence']) - marker_summary[marker_id]['observation_count'] += 1 - marker_summary[marker_id]['observations'].append({ - 'view_index': obs['view_index'], - 'source_file': views[obs['view_index']]['source_file'], - 'image_file': views[obs['view_index']]['image_file'], - 'confidence': obs['confidence'], - 'mean_reprojection_error_px': repro_error, - 'corner_reprojection_errors_px': errors.tolist() - }) - - for marker_id, summary in marker_summary.items(): - if summary['observation_count'] > 0: - summary['mean_confidence'] = float(np.mean(per_marker_confidences[marker_id])) - summary['mean_reprojection_error_px'] = float(np.mean(per_marker_errors[marker_id])) - - camera_outputs = [] - for idx, view in enumerate(views): - rvec, tvec = camera_params[idx] - cam_pos = camera_position_world(rvec, tvec) - observed_count = sum(1 for obs in observations if obs['view_index'] == idx) - camera_outputs.append({ - 'view_index': idx, - 'source_file': view['source_file'], - 'camera_id': view['camera_id'], - 'camera_position_world_m': cam_pos.tolist(), - 'rvec': rvec.reshape(-1).tolist(), - 'tvec': tvec.reshape(-1).tolist(), - 'intrinsics': { - 'camera_matrix': view['K'].tolist(), - 'distortion_coefficients': view['D'].reshape(-1).tolist() - }, - 'observation_count': observed_count - }) - - robot_pose_output = { - 'state': {k: float(robot_state[k]) for k in STATE_KEYS}, - 'uncertainty': { - 'x_mm': float(state_uncertainty[0]), - 'y_mm': float(state_uncertainty[1]), - 'z_mm': float(state_uncertainty[2]), - 'a_deg': float(state_uncertainty[3]), - 'b_deg': float(state_uncertainty[4]), - 'c_deg': float(state_uncertainty[5]), - 'e_mm': float(state_uncertainty[6]) - }, - 'confidence': { - 'x': float(math.exp(-state_uncertainty[0] / 10.0)), - 'y': float(math.exp(-state_uncertainty[1] / 10.0)), - 'z': float(math.exp(-state_uncertainty[2] / 10.0)), - 'a': float(math.exp(-state_uncertainty[3] / 10.0)), - 'b': float(math.exp(-state_uncertainty[4] / 10.0)), - 'c': float(math.exp(-state_uncertainty[5] / 10.0)), - 'e': float(math.exp(-state_uncertainty[6] / max(1.0, state_uncertainty[6]))) - } - } - - return { - 'schema_version': '1.0', - 'created_utc': datetime.datetime.utcnow().isoformat() + 'Z', - 'source_robot_json': os.path.abspath(robot_json_path), - 'source_detections': [view['source_file'] for view in views], - 'robot_pose': robot_pose_output, - 'camera_poses': camera_outputs, - 'marker_positions': list(marker_summary.values()) - } - - -# ------------------------------------------------------------------ -# Main -# ------------------------------------------------------------------ - -def main() -> None: - parser = argparse.ArgumentParser(description='Multiview optimization of robot pose and camera extrinsics') - parser.add_argument('--robot', required=True, help='Path to robot.json') - parser.add_argument('--detections', required=True, nargs='+', help='List of detection JSON files') - parser.add_argument('--outDir', required=True, help='Output directory') - parser.add_argument('--write-summary', action='store_true', help='Write summary file') - parser.add_argument('--max-iter', type=int, default=500, help='Maximum optimizer iterations') - args = parser.parse_args() - - os.makedirs(args.outDir, exist_ok=True) - - robot_json_path = os.path.abspath(args.robot) - robot = load_json(robot_json_path) - scale = parse_metric_scale(robot) - - default_state = { - k: float(robot.get('defaultPosition', {}).get(k, 0.0) or 0.0) - for k in STATE_KEYS - } - - robot_markers = extract_markers(robot, scale) - - # Validate constraints - print("\n" + "=" * 70) - print("CONSTRAINT VALIDATION") - print("=" * 70) - enabled_constraints = validate_constraints(robot, robot_markers) - for constraint_name, result in enabled_constraints.items(): - print(result) - print("=" * 70) - - views, observations = collect_views_and_observations(args.detections, robot_markers) - - camera_guesses = [] - for view in views: - rvec, tvec = initial_camera_guess(view, observations, robot_markers, default_state, scale, robot) - camera_guesses.append((rvec, tvec)) - - x0 = pack_parameters(default_state, camera_guesses) - - progress = { - 'iter': 0, - 'last_cost': None, - 'last_print': time.time(), - 'prev_x': x0.copy() - } - - def progress_callback(xk: np.ndarray) -> None: - progress['iter'] += 1 - now = time.time() - if progress['iter'] == 1 or now - progress['last_print'] >= 1.0: - res = residuals_for_parameters(xk, views, observations, robot_markers, robot, scale, default_state, enabled_constraints) - cost = 0.5 * float(np.dot(res, res)) - delta_cost = None - convergence = '' - if progress['last_cost'] is not None: - delta_cost = cost - progress['last_cost'] - if abs(delta_cost) < 1e-3: - convergence = ' stable' - elif delta_cost < 0: - convergence = ' improving' - else: - convergence = ' worsening' - step_norm = float(np.linalg.norm(xk - progress['prev_x'])) - print( - f'[Multiview] iter={progress["iter"]:4d} cost={cost:.4f}' - + (f' delta={delta_cost:.4g}' if delta_cost is not None else '') - + f' step={step_norm:.4g}' - + convergence - ) - progress['last_cost'] = cost - progress['last_print'] = now - progress['prev_x'] = xk.copy() - - result = least_squares( - residuals_for_parameters, - x0, - args=(views, observations, robot_markers, robot, scale, default_state, enabled_constraints), - jac='2-point', - method='trf', - loss='soft_l1', - f_scale=1.0, - max_nfev=args.max_iter, - callback=progress_callback - ) - - robot_state, camera_params = unpack_parameters(result.x, len(views)) - uncertainties = estimate_uncertainty(result, len(result.x)) - - # Print constraint sanity checks - link_transforms = compute_link_transforms(robot, robot_state, scale) - print_constraint_sanity_check(robot_state, robot_markers, link_transforms, robot, enabled_constraints) - - output = build_output(robot_state, uncertainties[:len(STATE_KEYS)], views, camera_params, observations, robot_markers, scale, robot, robot_json_path) - - out_path = Path(args.outDir) / 'multiview_pose.json' - save_json(output, out_path) - - print(f'Saved: {out_path}') - if args.write_summary: - summary_path = Path(args.outDir) / 'multiview_pose_summary.json' - summary = { - 'final_cost': float(result.cost), - 'status': int(result.status), - 'message': result.message, - 'robot_state': output['robot_pose'], - 'camera_count': len(views), - 'marker_count': len(robot_markers) - } - save_json(summary, summary_path) - print(f'Saved: {summary_path}') - - -if __name__ == '__main__': - main() diff --git a/pipeline/2_estimate_camera_from_observations.py b/pipeline/2_estimate_camera_from_observations.py new file mode 100644 index 0000000..447c64e --- /dev/null +++ b/pipeline/2_estimate_camera_from_observations.py @@ -0,0 +1,827 @@ +#!/usr/bin/env python3 +""" +2_estimate_camera_from_observations.py + +Estimate a single camera pose from ArUco observations stored in +*_aruco_detection.json, using marker world positions from robot.json. + +This follows the same mathematical idea as readTwoImages.py: +1) use detected marker observations, +2) get an initial pose from a rigid transform, +3) refine with Levenberg-Marquardt on normalized reprojection residuals. + +Difference to readTwoImages.py: +- No image processing here. +- Input is the observation JSON created by 1_detect_aruco_observations.py. +- Output is xxx_camera_pose.json. +- Unknown marker reconstruction is intentionally omitted. + +Assumptions: +- robot.json contains a marker list for the board/world frame. +- At minimum, marker positions are present for the reference markers. +- The detection JSON contains camera intrinsics and marker corners. + +Typical usage: + python3 2_estimate_camera_from_observations.py \ + -i frame_0001_aruco_detection.json \ + -robot robot.json \ + -outDir results/ + +Output: + frame_0001_camera_pose.json + +Notes on uncertainty: +- The script computes an approximate 6x6 covariance for the pose parameters + [rvec_x, rvec_y, rvec_z, t_x, t_y, t_z]. +- It also propagates that covariance to camera center uncertainty in world + coordinates and to approximate roll/pitch/yaw uncertainty. +""" + +from __future__ import annotations + +import argparse +import json +import os +import sys +import time +from typing import Any, Dict, List, Optional, Tuple + +import cv2 +import numpy as np + + +# --------------------------------------------------------------------- +# Path / JSON helpers +# --------------------------------------------------------------------- + +def resolve_path(path: str) -> str: + path = os.path.expanduser(path) + if os.path.isabs(path): + return path + return os.path.abspath(path) + + +def load_json(path: str) -> Dict[str, Any]: + with open(resolve_path(path), "r", encoding="utf-8") as f: + return json.load(f) + + +def save_json(path: str, data: Dict[str, Any]) -> None: + with open(resolve_path(path), "w", encoding="utf-8") as f: + json.dump(data, f, indent=2) + + +# --------------------------------------------------------------------- +# Intrinsics +# --------------------------------------------------------------------- + +def load_intrinsics_from_detection(detection: Dict[str, Any]) -> Tuple[np.ndarray, np.ndarray]: + """ + Primary source: the embedded camera intrinsics in the detection JSON. + """ + camera = detection.get("camera", {}) + K = camera.get("camera_matrix", None) + D = camera.get("distortion_coefficients", None) + + if K is None: + raise KeyError("camera_matrix missing in detection JSON.") + if D is None: + D = [0, 0, 0, 0, 0] + + K = np.array(K, dtype=np.float32).reshape(3, 3) + D = np.array(D, dtype=np.float32).reshape(-1, 1) + return K, D + + +# --------------------------------------------------------------------- +# Robot JSON parsing +# --------------------------------------------------------------------- + +def _rotation_matrix_from_any(rotation: Any) -> np.ndarray: + """ + Best-effort parser for marker rotation. + + Supported inputs: + - 3x3 matrix as nested list + - flat 9 list + - dict with keys: + * rotation_matrix / matrix + * rvec / rodriques / rodrigues + * euler_deg / rpy_deg / roll_pitch_yaw_deg + * euler_rad / rpy_rad / roll_pitch_yaw_rad + * quaternion / quat (best-effort, expects [x,y,z,w] unless specified) + - None => identity + + The pose estimator below only needs marker positions, but we keep + this parser for completeness and future extension. + """ + if rotation is None: + return np.eye(3, dtype=np.float32) + + # Direct matrix + if isinstance(rotation, (list, tuple, np.ndarray)): + arr = np.array(rotation, dtype=np.float32) + if arr.shape == (3, 3): + return arr + if arr.size == 9: + return arr.reshape(3, 3).astype(np.float32) + if arr.size == 3: + # Treat as Rodrigues vector + R, _ = cv2.Rodrigues(arr.reshape(3, 1)) + return R.astype(np.float32) + return np.eye(3, dtype=np.float32) + + if isinstance(rotation, dict): + for key in ("rotation_matrix", "matrix"): + if key in rotation: + return _rotation_matrix_from_any(rotation[key]) + + for key in ("rvec", "rodrigues", "rodriques"): + if key in rotation: + v = np.array(rotation[key], dtype=np.float32).reshape(3, 1) + R, _ = cv2.Rodrigues(v) + return R.astype(np.float32) + + def euler_to_R(roll: float, pitch: float, yaw: float, degrees: bool = True) -> np.ndarray: + if degrees: + roll = np.deg2rad(roll) + pitch = np.deg2rad(pitch) + yaw = np.deg2rad(yaw) + cr, sr = np.cos(roll), np.sin(roll) + cp, sp = np.cos(pitch), np.sin(pitch) + cy, sy = np.cos(yaw), np.sin(yaw) + + Rx = np.array([[1, 0, 0], + [0, cr, -sr], + [0, sr, cr]], dtype=np.float32) + Ry = np.array([[cp, 0, sp], + [0, 1, 0], + [-sp, 0, cp]], dtype=np.float32) + Rz = np.array([[cy, -sy, 0], + [sy, cy, 0], + [0, 0, 1]], dtype=np.float32) + # ZYX convention + return (Rz @ Ry @ Rx).astype(np.float32) + + for key in ("euler_deg", "rpy_deg", "roll_pitch_yaw_deg"): + if key in rotation: + vals = np.array(rotation[key], dtype=np.float32).reshape(-1) + if vals.size == 3: + return euler_to_R(float(vals[0]), float(vals[1]), float(vals[2]), degrees=True) + + for key in ("euler_rad", "rpy_rad", "roll_pitch_yaw_rad"): + if key in rotation: + vals = np.array(rotation[key], dtype=np.float32).reshape(-1) + if vals.size == 3: + return euler_to_R(float(vals[0]), float(vals[1]), float(vals[2]), degrees=False) + + for key in ("quaternion", "quat"): + if key in rotation: + q = np.array(rotation[key], dtype=np.float32).reshape(-1) + if q.size == 4: + # Best-effort: try [x,y,z,w] + x, y, z, w = [float(v) for v in q] + R = np.array([ + [1 - 2*y*y - 2*z*z, 2*x*y - 2*z*w, 2*x*z + 2*y*w], + [2*x*y + 2*z*w, 1 - 2*x*x - 2*z*z, 2*y*z - 2*x*w], + [2*x*z - 2*y*w, 2*y*z + 2*x*w, 1 - 2*x*x - 2*y*y] + ], dtype=np.float32) + return R + + return np.eye(3, dtype=np.float32) + + +def get_marker_rotation(marker: Dict[str, Any]) -> np.ndarray: + """ + Flexible rotation extraction. Falls back to identity if absent. + """ + for key in ("rotation", "rotation_matrix", "matrix", "pose_rotation", "orientation"): + if key in marker: + return _rotation_matrix_from_any(marker[key]) + + # Also allow flat pose-style fields + if "rvec" in marker or "rodrigues" in marker: + return _rotation_matrix_from_any({"rvec": marker.get("rvec", marker.get("rodrigues"))}) + if "euler_deg" in marker: + return _rotation_matrix_from_any({"euler_deg": marker["euler_deg"]}) + if "rpy_deg" in marker: + return _rotation_matrix_from_any({"rpy_deg": marker["rpy_deg"]}) + if "quaternion" in marker: + return _rotation_matrix_from_any({"quaternion": marker["quaternion"]}) + + return np.eye(3, dtype=np.float32) + + +def load_marker_lookup(robot_json_path: str) -> Dict[int, Dict[str, Any]]: + """ + Supports the new format: + robot_data["links"]["Board"]["markers"] + + Fallback: + robot_data["Marker"] + """ + robot_json_path = resolve_path(robot_json_path) + with open(robot_json_path, "r", encoding="utf-8") as f: + robot_data = json.load(f) + + marker_lookup: Dict[int, Dict[str, Any]] = {} + + links = robot_data.get("links", {}) + board = links.get("Board") + + markers = None + if board and "markers" in board: + markers = board["markers"] + + if not markers: + markers = robot_data.get("Marker", []) + + for marker in markers: + marker_id = int(marker.get("id", -1)) + if marker_id < 0: + continue + + if "position" not in marker: + continue + + pos = marker.get("position") + if pos is None: + continue + + if len(pos) != 3: + continue + + rotation = get_marker_rotation(marker) + + marker_lookup[marker_id] = { + "position": np.array(pos, dtype=np.float32), + "rotation": rotation, + "on": marker.get("on", "unknown"), + } + + return marker_lookup + + +def load_robot_marker_size(robot_json_path: str) -> Optional[float]: + """ + Best-effort marker size reader from robot.json. + Returns meters if found, otherwise None. + """ + robot_json_path = resolve_path(robot_json_path) + with open(robot_json_path, "r", encoding="utf-8") as f: + robot_data = json.load(f) + + vision_config = robot_data.get("vision_config", {}) + size = vision_config.get("MarkerSize", None) + if size is None: + return None + try: + return float(size) + except Exception: + return None + + +# --------------------------------------------------------------------- +# Geometry / pose helpers +# --------------------------------------------------------------------- + +def marker_local_corners(marker_size_m: float) -> np.ndarray: + half = marker_size_m / 2.0 + # Same corner order as the readTwoImages.py example + return np.array([ + [-half, half, 0.0], + [ half, half, 0.0], + [ half, -half, 0.0], + [-half, -half, 0.0], + ], dtype=np.float32) + + +def rigid_transform_no_scale(A: np.ndarray, B: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: + """ + Find R, t such that B ≈ R A + t. + A, B: Nx3 + """ + assert A.shape == B.shape and A.shape[1] == 3, "A and B must be Nx3" + N = A.shape[0] + if N < 2: + raise ValueError("Need at least 2 points; 3+ recommended.") + + centroid_A = A.mean(axis=0) + centroid_B = B.mean(axis=0) + + AA = A - centroid_A + BB = B - centroid_B + + H = AA.T @ BB + U, S, Vt = np.linalg.svd(H) + R = Vt.T @ U.T + + if np.linalg.det(R) < 0: + Vt[-1, :] *= -1 + R = Vt.T @ U.T + + t = centroid_B - R @ centroid_A + return R.astype(np.float32), t.astype(np.float32) + + +def undistort_to_normalized(points_px: np.ndarray, K: np.ndarray, D: np.ndarray) -> np.ndarray: + pts = points_px.reshape(-1, 1, 2).astype(np.float32) + und = cv2.undistortPoints(pts, K, D, P=None) + return und.reshape(-1, 2).astype(np.float32) + + +def rvec_to_R(rvec: np.ndarray) -> np.ndarray: + R, _ = cv2.Rodrigues(rvec.reshape(3, 1)) + return R.astype(np.float32) + + +def R_to_euler_zyx(R: np.ndarray) -> Tuple[float, float, float]: + """ + Return roll, pitch, yaw in degrees using ZYX convention. + """ + yaw = float(np.degrees(np.arctan2(R[1, 0], R[0, 0]))) + sp = np.sqrt(R[2, 1] ** 2 + R[2, 2] ** 2) + pitch = float(np.degrees(np.arctan2(-R[2, 0], sp))) + roll = float(np.degrees(np.arctan2(R[2, 1], R[2, 2]))) + return roll, pitch, yaw + + +def theta_to_camera_pose(theta: np.ndarray) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: + """ + theta = [omega_x, omega_y, omega_z, t_x, t_y, t_z] + Returns: + R_wc, t_wc, camera_center_world + """ + omega = theta[0:3] + t_wc = theta[3:6].reshape(3, 1).astype(np.float32) + R_wc, _ = cv2.Rodrigues(omega.reshape(3, 1)) + R_wc = R_wc.astype(np.float32) + R_cw = R_wc.T + camera_center_world = (-R_cw @ t_wc).reshape(3) + return R_wc, t_wc.reshape(3), camera_center_world + + +def build_projection_matrix(K: np.ndarray, R: np.ndarray, t: np.ndarray) -> np.ndarray: + return K @ np.hstack([R, t.reshape(3, 1)]) + + +# --------------------------------------------------------------------- +# LM on normalized residuals (same style as readTwoImages.py) +# --------------------------------------------------------------------- + +def pack_params(omega: np.ndarray, t: np.ndarray) -> np.ndarray: + return np.hstack([omega.reshape(3), t.reshape(3)]).astype(np.float64) + + +def unpack_params(theta: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: + omega = theta[0:3] + t = theta[3:6] + return omega, t + + +def residuals_centers_normalized(theta: np.ndarray, + X_world: np.ndarray, + obs_norm: np.ndarray) -> np.ndarray: + """ + Residuals in normalized coordinates: + obs_norm - project(R X_world + t) + """ + omega, t = unpack_params(theta) + R_wc = cv2.Rodrigues(omega.reshape(3, 1))[0].astype(np.float64) + X_cam = (R_wc @ X_world.T + t.reshape(3, 1)).T + uv = X_cam[:, :2] / X_cam[:, 2:3] + r = (obs_norm - uv).reshape(-1) + return r + + +def numerical_jacobian(f, theta: np.ndarray, eps: float, *args) -> Tuple[np.ndarray, np.ndarray]: + r0 = f(theta, *args) + m = r0.size + n = theta.size + J = np.zeros((m, n), dtype=np.float64) + for k in range(n): + th = theta.copy() + th[k] += eps + rk = f(th, *args) + J[:, k] = (rk - r0) / eps + return J, r0 + + +def lm_solve(theta0: np.ndarray, + X_world: np.ndarray, + obs_norm: np.ndarray, + max_iter: int = 60, + eps_jac: float = 1e-6, + lambda_init: float = 1e-3) -> Tuple[np.ndarray, Dict[str, List[float]]]: + lam = lambda_init + theta = theta0.copy().astype(np.float64) + history = {"iters": [], "rms": [], "lambda": []} + + for it in range(max_iter): + J, r = numerical_jacobian(residuals_centers_normalized, theta, eps_jac, X_world, obs_norm) + rms = float(np.sqrt(np.mean(r * r))) if r.size else 0.0 + history["iters"].append(it) + history["rms"].append(rms) + history["lambda"].append(lam) + + JTJ = J.T @ J + g = J.T @ r + H = JTJ + lam * np.eye(JTJ.shape[0], dtype=np.float64) + + try: + delta = -np.linalg.solve(H, g) + except np.linalg.LinAlgError: + delta, *_ = np.linalg.lstsq(H, -g, rcond=None) + + theta_trial = theta + delta + r_trial = residuals_centers_normalized(theta_trial, X_world, obs_norm) + rms_trial = float(np.sqrt(np.mean(r_trial * r_trial))) if r_trial.size else rms + + if rms_trial < rms: + theta = theta_trial + lam *= 0.5 + else: + lam *= 2.0 + + if np.linalg.norm(delta) < 1e-10: + break + if abs(rms - rms_trial) < 1e-12: + break + + return theta, history + + +def pose_covariance(theta: np.ndarray, + X_world: np.ndarray, + obs_norm: np.ndarray, + eps_jac: float = 1e-6) -> Tuple[np.ndarray, float, np.ndarray]: + """ + Returns: + cov_theta_6x6, sigma2, residual_vector + """ + J, r = numerical_jacobian(residuals_centers_normalized, theta, eps_jac, X_world, obs_norm) + m = r.size + n = theta.size + dof = max(1, m - n) + sigma2 = float((r @ r) / dof) + + JTJ = J.T @ J + cov = sigma2 * np.linalg.pinv(JTJ) + return cov.astype(np.float64), sigma2, r + + +def propagate_covariance(theta: np.ndarray, + cov_theta: np.ndarray) -> Dict[str, Any]: + """ + Propagate pose covariance to camera center and Euler angle uncertainties. + """ + def camera_center_fn(th: np.ndarray) -> np.ndarray: + _, _, c = theta_to_camera_pose(th) + return c.astype(np.float64) + + def euler_fn(th: np.ndarray) -> np.ndarray: + R_wc, _, _ = theta_to_camera_pose(th) + return np.array(R_to_euler_zyx(R_wc), dtype=np.float64) # deg + + Jc, _ = numerical_jacobian(lambda th, *_: camera_center_fn(th), theta, 1e-6) + cov_center = Jc @ cov_theta @ Jc.T + + Je, _ = numerical_jacobian(lambda th, *_: euler_fn(th), theta, 1e-6) + cov_euler = Je @ cov_theta @ Je.T + + center_std_m = np.sqrt(np.maximum(0.0, np.diag(cov_center))) + euler_std_deg = np.sqrt(np.maximum(0.0, np.diag(cov_euler))) + + # Parameter std directly from covariance + param_std = np.sqrt(np.maximum(0.0, np.diag(cov_theta))) + rvec_std_deg = np.degrees(param_std[0:3]) + tvec_std_m = param_std[3:6] + + return { + "pose_covariance_6x6": cov_theta.tolist(), + "parameter_std": { + "rvec_std_deg": [float(x) for x in rvec_std_deg], + "tvec_std_m": [float(x) for x in tvec_std_m], + }, + "camera_center_std_m": [float(x) for x in center_std_m], + "camera_center_std_mm": [float(x * 1000.0) for x in center_std_m], + "orientation_std_deg": { + "roll": float(euler_std_deg[0]), + "pitch": float(euler_std_deg[1]), + "yaw": float(euler_std_deg[2]), + }, + } + + +# --------------------------------------------------------------------- +# Marker processing +# --------------------------------------------------------------------- + +def build_object_corners_from_world_position(position_m: np.ndarray, + marker_size_m: float) -> np.ndarray: + """ + Marker corners in world coordinates, assuming the marker frame is aligned + with the world frame and only translated to 'position_m'. + + This is the direct analogue of readTwoImages.py using marker center positions. + """ + h = marker_size_m / 2.0 + local = np.array([ + [-h, h, 0.0], + [ h, h, 0.0], + [ h, -h, 0.0], + [-h, -h, 0.0], + ], dtype=np.float32) + return local + position_m.reshape(1, 3) + + +def solve_single_marker_pose(corners_px: np.ndarray, + K: np.ndarray, + D: np.ndarray, + marker_size_m: float) -> Optional[Tuple[np.ndarray, np.ndarray]]: + obj = marker_local_corners(marker_size_m) + success, rvec, tvec = cv2.solvePnP( + obj, + corners_px.astype(np.float32), + K, + D, + flags=cv2.SOLVEPNP_IPPE_SQUARE + ) + if not success: + success, rvec, tvec = cv2.solvePnP( + obj, + corners_px.astype(np.float32), + K, + D, + flags=cv2.SOLVEPNP_ITERATIVE + ) + if not success: + return None + return rvec.reshape(3), tvec.reshape(3) + + +# --------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------- + +def main() -> None: + parser = argparse.ArgumentParser(description="Estimate camera pose from ArUco observation JSON") + parser.add_argument("-i", "--input", required=True, help="*_aruco_detection.json") + parser.add_argument("-robot", "--robot", required=True, help="robot.json with board markers") + parser.add_argument("-outDir", "--outDir", default=None, help="Optional output directory") + parser.add_argument("--minConfidence", type=float, default=0.0, + help="Skip detections below this confidence") + parser.add_argument("--minCommonMarkers", type=int, default=3, + help="Minimum number of world markers required") + parser.add_argument("--maxRmsPx", type=float, default=None, + help="Optional soft warning threshold for final reprojection RMS in pixels") + parser.add_argument("--epsJac", type=float, default=1e-6, help="Finite-difference epsilon") + args = parser.parse_args() + + detection_path = resolve_path(args.input) + robot_path = resolve_path(args.robot) + + detection = load_json(detection_path) + marker_lookup = load_marker_lookup(robot_path) + + K, D = load_intrinsics_from_detection(detection) + + robot_marker_size = load_robot_marker_size(robot_path) + det_marker_size = detection.get("vision_config", {}).get("MarkerSize", None) + if det_marker_size is not None: + marker_size_m = float(det_marker_size) + elif robot_marker_size is not None: + marker_size_m = float(robot_marker_size) + else: + marker_size_m = 0.025 + + detections = detection.get("detections", []) + if not isinstance(detections, list): + raise TypeError("detection['detections'] must be a list") + + used_ids: List[int] = [] + used_world_positions: List[np.ndarray] = [] + used_obs_centers_px: List[np.ndarray] = [] + used_obs_centers_norm: List[np.ndarray] = [] + used_marker_cam_centers: List[np.ndarray] = [] + used_marker_meta: List[Dict[str, Any]] = [] + + sanity_notes: List[str] = [] + + for det in detections: + if det.get("type", "aruco") != "aruco": + continue + + marker_id = int(det.get("marker_id", -1)) + if marker_id < 0: + continue + + if marker_id not in marker_lookup: + continue + + confidence = float(det.get("confidence", 1.0)) + if confidence < args.minConfidence: + continue + + corners = det.get("image_points_px", None) + if corners is None: + continue + + corners_px = np.array(corners, dtype=np.float32).reshape(4, 2) + center_from_corners = corners_px.mean(axis=0) + + center_px = np.array(det.get("center_px", center_from_corners), dtype=np.float32).reshape(2) + center_delta = float(np.linalg.norm(center_from_corners - center_px)) + if center_delta > 0.75: + sanity_notes.append( + f"marker {marker_id}: center_px differs from corner-mean by {center_delta:.2f}px" + ) + + pnp = solve_single_marker_pose(corners_px, K, D, marker_size_m) + if pnp is None: + continue + + rvec_m, tvec_m = pnp + world_pos = marker_lookup[marker_id]["position"].astype(np.float32) + + used_ids.append(marker_id) + used_world_positions.append(world_pos) + used_obs_centers_px.append(center_from_corners.astype(np.float32)) + used_obs_centers_norm.append(undistort_to_normalized(center_from_corners.reshape(1, 2), K, D)[0]) + used_marker_cam_centers.append(tvec_m.astype(np.float32)) + used_marker_meta.append({ + "marker_id": marker_id, + "confidence": confidence, + "center_px": [float(center_from_corners[0]), float(center_from_corners[1])], + "marker_size_m": marker_size_m, + }) + + # Unique / deduplicate by marker_id while preserving order + dedup: Dict[int, int] = {} + uniq_ids: List[int] = [] + uniq_world_positions: List[np.ndarray] = [] + uniq_obs_px: List[np.ndarray] = [] + uniq_obs_norm: List[np.ndarray] = [] + uniq_cam_centers: List[np.ndarray] = [] + uniq_meta: List[Dict[str, Any]] = [] + + for idx, mid in enumerate(used_ids): + if mid in dedup: + continue + dedup[mid] = idx + uniq_ids.append(mid) + uniq_world_positions.append(used_world_positions[idx]) + uniq_obs_px.append(used_obs_centers_px[idx]) + uniq_obs_norm.append(used_obs_centers_norm[idx]) + uniq_cam_centers.append(used_marker_cam_centers[idx]) + uniq_meta.append(used_marker_meta[idx]) + + if len(uniq_ids) < args.minCommonMarkers: + raise RuntimeError( + f"Need at least {args.minCommonMarkers} common markers; found {len(uniq_ids)}: {uniq_ids}" + ) + + X_world = np.stack(uniq_world_positions, axis=0).astype(np.float64) + obs_px = np.stack(uniq_obs_px, axis=0).astype(np.float64) + obs_norm = np.stack(uniq_obs_norm, axis=0).astype(np.float64) + marker_cam_centers = np.stack(uniq_cam_centers, axis=0).astype(np.float64) + + # Initial pose from rigid transform of per-marker camera-frame centers to world positions + # B ≈ R A + t -> world = R * camera + t + R_cw_init, t_cw_init = rigid_transform_no_scale(marker_cam_centers, X_world) + R_wc_init = R_cw_init.T + t_wc_init = (-R_wc_init @ t_cw_init).reshape(3) + + omega_init = cv2.Rodrigues(R_wc_init)[0].reshape(3) + theta0 = pack_params(omega_init, t_wc_init) + + theta_opt, hist = lm_solve( + theta0=theta0, + X_world=X_world, + obs_norm=obs_norm, + max_iter=60, + eps_jac=args.epsJac, + lambda_init=1e-3, + ) + + R_wc, t_wc, camera_center_world = theta_to_camera_pose(theta_opt) + + cov_theta, sigma2, residual_vec = pose_covariance( + theta_opt, X_world, obs_norm, eps_jac=args.epsJac + ) + propagated = propagate_covariance(theta_opt, cov_theta) + + # Exact pixel-space reprojection statistics + proj_pts, _ = cv2.projectPoints( + X_world.reshape(-1, 1, 3).astype(np.float32), + theta_opt[0:3].reshape(3, 1).astype(np.float32), + theta_opt[3:6].reshape(3, 1).astype(np.float32), + K, + D, + ) + proj_pts = proj_pts.reshape(-1, 2) + reproj_err_px = np.linalg.norm(proj_pts - obs_px, axis=1) + rms_px = float(np.sqrt(np.mean(reproj_err_px ** 2))) if reproj_err_px.size else 0.0 + median_px = float(np.median(reproj_err_px)) if reproj_err_px.size else 0.0 + max_px = float(np.max(reproj_err_px)) if reproj_err_px.size else 0.0 + + if args.maxRmsPx is not None and rms_px > args.maxRmsPx: + print(f"[WARN] Final reprojection RMS is {rms_px:.3f}px (threshold {args.maxRmsPx:.3f}px).") + + # Convert outputs + roll, pitch, yaw = R_to_euler_zyx(R_wc) + position_mm = (camera_center_world * 1000.0).astype(float).tolist() + + # Reproject each used marker center for QA + per_marker_results = [] + proj_pts_exact, _ = cv2.projectPoints( + X_world.reshape(-1, 1, 3).astype(np.float32), + theta_opt[0:3].reshape(3, 1).astype(np.float32), + theta_opt[3:6].reshape(3, 1).astype(np.float32), + K, + D, + ) + proj_pts_exact = proj_pts_exact.reshape(-1, 2) + + for idx, mid in enumerate(uniq_ids): + x = proj_pts_exact[idx] + err = float(np.linalg.norm(x - obs_px[idx])) + per_marker_results.append({ + "marker_id": int(mid), + "observed_center_px": [float(obs_px[idx, 0]), float(obs_px[idx, 1])], + "projected_center_px": [float(x[0]), float(x[1])], + "reprojection_error_px": err, + "confidence": float(uniq_meta[idx]["confidence"]), + }) + + # Output directory + in_base = os.path.splitext(os.path.basename(detection_path))[0] + out_name = in_base.replace("_aruco_detection", "_camera_pose") + ".json" + + if args.outDir is not None: + out_dir = resolve_path(args.outDir) + else: + out_dir = os.path.dirname(detection_path) or "." + + os.makedirs(out_dir, exist_ok=True) + out_json = os.path.join(out_dir, out_name) + + output = { + "schema_version": "1.0", + "created_utc": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()), + "source": { + "detection_json": detection_path, + "robot_json": robot_path, + }, + "camera": { + "camera_id": detection.get("camera", {}).get("camera_id", "unknown"), + "camera_matrix": K.tolist(), + "distortion_coefficients": D.reshape(-1).tolist(), + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": float(marker_size_m), + "num_used_markers": int(len(uniq_ids)), + "used_marker_ids": [int(x) for x in uniq_ids], + "history": hist, + "residual_rms_px": float(rms_px), + "residual_median_px": float(median_px), + "residual_max_px": float(max_px), + "sigma2_normalized": float(sigma2), + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": R_wc.tolist(), + "translation_m": [float(x) for x in t_wc.tolist()], + "rvec_rad": [float(x) for x in theta_opt[0:3].tolist()], + }, + "camera_in_world": { + "position_m": [float(x) for x in camera_center_world.tolist()], + "position_mm": [float(x) for x in position_mm], + "orientation_deg": { + "roll": float(roll), + "pitch": float(pitch), + "yaw": float(yaw), + }, + }, + "uncertainty": propagated, + }, + "observations": { + "markers": per_marker_results, + }, + "qa": { + "sanity_notes": sanity_notes, + }, + } + + save_json(out_json, output) + print(f"[INFO] Saved camera pose JSON: {out_json}") + + +if __name__ == "__main__": + try: + main() + except Exception as exc: + print(f"[ERROR] {exc}", file=sys.stderr) + sys.exit(1) diff --git a/pipeline/2_estimate_camera_pose_from_aruco_json.py b/pipeline/2_estimate_camera_pose_from_aruco_json.py new file mode 100644 index 0000000..475b5ea --- /dev/null +++ b/pipeline/2_estimate_camera_pose_from_aruco_json.py @@ -0,0 +1,685 @@ +#!/usr/bin/env python3 +""" +2_estimate_camera_pose_from_aruco_json.py + +Berechnet die Kameraposition im Maschinen-/Board-Koordinatensystem +aus: + 1. einer ArUco-Detections-JSON + 2. robots.json mit bekannten Marker-Positionen + +NEU: +- Marker-Orientierungen unterstützt +- Default: Board-Marker zeigen nach +Z +- Qualitätsbewertung erweitert +- Speichert ALLE erkannten Marker +- Speichert auch fehlgeschlagene Lösungen +- Bewertet Kamerageometrie +- Bewertet Markerabdeckung +- Bewertet Sichtwinkel +- Bewertet Markeranzahl +- Speichert vollständige Rohdaten + +Benötigt: + pip install opencv-python numpy +""" + +import argparse +import json +import math +from pathlib import Path + +import cv2 +import numpy as np + + +# ============================================================ +# Hilfsfunktionen +# ============================================================ + +def normalize(v): + n = np.linalg.norm(v) + + if n < 1e-9: + return v + + return v / n + + +def rotation_matrix_from_axes(x_axis, y_axis, z_axis): + + R = np.column_stack([ + normalize(x_axis), + normalize(y_axis), + normalize(z_axis) + ]) + + return R.astype(np.float32) + + +def rvec_tvec_to_camera_pose(rvec, tvec): + """ + OpenCV: + X_cam = R * X_world + t + + Kamera im Weltkoordinatensystem: + C = -R^T * t + """ + + R_cw, _ = cv2.Rodrigues(rvec) + + R_wc = R_cw.T + + cam_pos = -R_wc @ tvec + + return R_wc, cam_pos.reshape(3) + + +def rotation_matrix_to_euler_zyx(R): + + yaw = math.degrees(math.atan2(R[1, 0], R[0, 0])) + + sp = math.sqrt(R[2, 1] ** 2 + R[2, 2] ** 2) + + pitch = math.degrees(math.atan2(-R[2, 0], sp)) + + roll = math.degrees(math.atan2(R[2, 1], R[2, 2])) + + return roll, pitch, yaw + + +# ============================================================ +# Marker-Orientierung +# ============================================================ + +def get_marker_rotation(marker): + + # Explizite Rotation vorhanden? + if "rotation_matrix" in marker: + return np.array( + marker["rotation_matrix"], + dtype=np.float32 + ) + + # Default: + # Marker zeigt nach +Z + # + # x = rechts + # y = oben + # z = aus Board heraus (+Z) + + x_axis = np.array([1, 0, 0], dtype=np.float32) + y_axis = np.array([0, 1, 0], dtype=np.float32) + z_axis = np.array([0, 0, 1], dtype=np.float32) + + return rotation_matrix_from_axes( + x_axis, + y_axis, + z_axis + ) + + +# ============================================================ +# Marker Lookup +# ============================================================ + +def build_marker_lookup(robot_data): + + marker_lookup = {} + + + markers = [] + + # Neues Format: links -> Board -> markers + links = robot_data.get("links", {}) + + + board = links.get("Board") + + if board and "markers" in board: + markers = board["markers"] + + + # Fallback für altes Format + if not markers: + markers = robot_data.get("Marker", []) + + for marker in markers: + + + marker_id = int(marker.get("id", -1)) + + if marker_id < 0: + continue + + # Nur absolute Marker verwenden + if "position" not in marker: + continue + + pos = marker["position"] + + if pos is None: + continue + + if len(pos) != 3: + continue + + rotation = get_marker_rotation(marker) + + marker_lookup[marker_id] = { + "position": np.array( + pos, + dtype=np.float32 + ), + "rotation": rotation, + "on": marker.get("on", "unknown") + } + + return marker_lookup + + +# ============================================================ +# Marker-Eckpunkte +# ============================================================ + +def build_marker_object_points( + marker_center_world, + marker_rotation, + marker_size_m): + + half = marker_size_m / 2.0 + + # OpenCV Corner Reihenfolge + local = np.array([ + [-half, half, 0.0], + [ half, half, 0.0], + [ half, -half, 0.0], + [-half, -half, 0.0], + ], dtype=np.float32) + + rotated = (marker_rotation @ local.T).T + + return rotated + marker_center_world.reshape(1, 3) + + +# ============================================================ +# Qualitätsmetriken +# ============================================================ + +def compute_marker_spread(points_3d): + + if len(points_3d) < 2: + return 0.0 + + mins = np.min(points_3d, axis=0) + maxs = np.max(points_3d, axis=0) + + diag = np.linalg.norm(maxs - mins) + + return float(diag) + + +def compute_viewing_angles( + camera_position, + marker_lookup, + used_markers): + + results = [] + + for marker_id in used_markers: + + marker = marker_lookup[marker_id] + + pos = marker["position"] + + R = marker["rotation"] + + normal = R[:, 2] + + to_camera = normalize(camera_position - pos) + + dot = np.clip( + np.dot(normal, to_camera), + -1.0, + 1.0 + ) + + angle = math.degrees(math.acos(dot)) + + results.append(angle) + + if len(results) == 0: + return { + "mean": None, + "max": None + } + + return { + "mean": float(np.mean(results)), + "max": float(np.max(results)) + } + + +def compute_pose_quality( + rms, + max_err, + num_markers, + marker_spread, + viewing_angle_mean): + + score = 100.0 + + # Reprojection Error + score -= rms * 8.0 + + # Max Error + score -= max_err * 2.0 + + # Wenige Marker + if num_markers < 2: + score -= 50 + + elif num_markers < 4: + score -= 25 + + elif num_markers < 6: + score -= 10 + + # Schlechte räumliche Verteilung + if marker_spread < 0.10: + score -= 30 + + elif marker_spread < 0.25: + score -= 15 + + # Schlechter Blickwinkel + if viewing_angle_mean is not None: + + if viewing_angle_mean > 70: + score -= 25 + + elif viewing_angle_mean > 50: + score -= 10 + + score = max(0.0, min(100.0, score)) + + return float(score) + + +# ============================================================ +# Main +# ============================================================ + +def main(): + + parser = argparse.ArgumentParser() + + parser.add_argument( + "--detections", + default=None + ) + + parser.add_argument( + "--robots", + required=True + ) + + parser.add_argument( + "--min-confidence", + type=float, + default=0.5 + ) + + parser.add_argument( + "--max-reprojection-error", + type=float, + default=3.0 + ) + + parser.add_argument( + "--outDir", + default=None + ) + + + args = parser.parse_args() + + # ============================================================ + # JSON laden + # ============================================================ + + with open(args.detections, "r", encoding="utf-8") as f: + detection_data = json.load(f) + + with open(args.robots, "r", encoding="utf-8") as f: + robot_data = json.load(f) + + # ============================================================ + # Kamera + # ============================================================ + + K = np.array( + detection_data["camera"]["camera_matrix"], + dtype=np.float32 + ) + + D = np.array( + detection_data["camera"]["distortion_coefficients"], + dtype=np.float32 + ).reshape(-1, 1) + + # ============================================================ + # Marker laden + # ============================================================ + + known_markers = build_marker_lookup(robot_data) + + # ============================================================ + # Punktlisten + # ============================================================ + + object_points = [] + image_points = [] + + used_markers = [] + rejected_markers = [] + + detections = detection_data["detections"] + + for det in detections: + + marker_id = int(det["marker_id"]) + + confidence = float( + det.get("confidence", 1.0) + ) + + reason = None + + if confidence < args.min_confidence: + reason = "low_confidence" + + elif marker_id not in known_markers: + reason = "unknown_marker" + + if reason is not None: + + rejected_markers.append({ + "marker_id": marker_id, + "reason": reason, + "confidence": confidence + }) + + continue + + marker_info = known_markers[marker_id] + + marker_center_world = marker_info["position"] + + marker_rotation = marker_info["rotation"] + + marker_size = float( + det["marker_size_m"] + ) + + obj_pts = build_marker_object_points( + marker_center_world, + marker_rotation, + marker_size + ) + + img_pts = np.array( + det["image_points_px"], + dtype=np.float32 + ) + + object_points.append(obj_pts) + image_points.append(img_pts) + + used_markers.append(marker_id) + + # ============================================================ + # Ausgabe vorbereiten + # ============================================================ + + out = { + "success": False, + "camera_pose": None, + "quality": {}, + "used_markers": [], + "rejected_markers": rejected_markers, + "all_detected_markers": [ + int(d["marker_id"]) + for d in detections + ] + } + + # ============================================================ + # Zu wenige Marker + # ============================================================ + + if len(object_points) == 0: + + out["quality"] = { + "error": "no_known_markers", + "num_detected_markers": len(detections), + "num_used_markers": 0 + } + + + if args.outDir: + out_dir = Path(args.outDir) + out_dir.mkdir(parents=True, exist_ok=True) + + out_file = out_dir / ( + Path(args.detections).stem + ".camera_pose.json" + ) + else: + out_file = Path(args.detections).with_suffix( + ".camera_pose.json" + ) + + + with open(out_file, "w", encoding="utf-8") as f: + json.dump(out, f, indent=2) + + print("Keine bekannten Marker gefunden.") + print(out_file) + + return + + # ============================================================ + # solvePnP + # ============================================================ + + object_points = np.concatenate( + object_points, + axis=0 + ) + + image_points = np.concatenate( + image_points, + axis=0 + ) + + success, rvec, tvec = cv2.solvePnP( + object_points, + image_points, + K, + D, + flags=cv2.SOLVEPNP_ITERATIVE + ) + + if not success: + + out["quality"] = { + "error": "solvepnp_failed", + "num_used_markers": len(set(used_markers)) + } + + out_file = Path(args.detections).with_suffix( + ".camera_pose.json" + ) + + with open(out_file, "w", encoding="utf-8") as f: + json.dump(out, f, indent=2) + + print("solvePnP fehlgeschlagen") + return + + # ============================================================ + # Kamera Pose + # ============================================================ + + R_wc, cam_pos = rvec_tvec_to_camera_pose( + rvec, + tvec + ) + + roll, pitch, yaw = rotation_matrix_to_euler_zyx( + R_wc + ) + + # ============================================================ + # Reprojektion + # ============================================================ + + projected, _ = cv2.projectPoints( + object_points, + rvec, + tvec, + K, + D + ) + + projected = projected.reshape(-1, 2) + + reproj_error = np.linalg.norm( + projected - image_points, + axis=1 + ) + + rms = float( + np.sqrt(np.mean(reproj_error ** 2)) + ) + + max_err = float( + np.max(reproj_error) + ) + + # ============================================================ + # Qualität + # ============================================================ + + marker_positions = np.array([ + known_markers[mid]["position"] + for mid in set(used_markers) + ]) + + marker_spread = compute_marker_spread( + marker_positions + ) + + viewing = compute_viewing_angles( + cam_pos, + known_markers, + set(used_markers) + ) + + quality_score = compute_pose_quality( + rms, + max_err, + len(set(used_markers)), + marker_spread, + viewing["mean"] + ) + + # ============================================================ + # Ausgabe + # ============================================================ + + print() + print("==================================================") + print("KAMERA-POSE") + print("==================================================") + + print() + print("Position [m]") + print(f"X = {cam_pos[0]:.6f}") + print(f"Y = {cam_pos[1]:.6f}") + print(f"Z = {cam_pos[2]:.6f}") + + print() + print("Orientation [deg]") + print(f"Roll = {roll:.3f}") + print(f"Pitch = {pitch:.3f}") + print(f"Yaw = {yaw:.3f}") + + print() + print("Reprojection") + print(f"RMS = {rms:.3f}px") + print(f"MAX = {max_err:.3f}px") + + print() + print("Quality") + print(f"Score = {quality_score:.1f}/100") + print(f"Marker Spread = {marker_spread:.3f}m") + + if viewing["mean"] is not None: + print( + f"Mean Viewing Angle = " + f"{viewing['mean']:.1f}deg" + ) + + # ============================================================ + # JSON speichern + # ============================================================ + + out["success"] = True + + out["camera_pose"] = { + "position_m": { + "x": float(cam_pos[0]), + "y": float(cam_pos[1]), + "z": float(cam_pos[2]), + }, + "orientation_deg": { + "roll": float(roll), + "pitch": float(pitch), + "yaw": float(yaw), + }, + "rotation_matrix_world_from_camera": ( + R_wc.tolist() + ) + } + + out["quality"] = { + "pose_quality_score": quality_score, + "reprojection_rms_px": rms, + "reprojection_max_px": max_err, + "num_detected_markers": len(detections), + "num_used_markers": len(set(used_markers)), + "marker_spread_m": marker_spread, + "mean_viewing_angle_deg": viewing["mean"], + "max_viewing_angle_deg": viewing["max"], + "pose_stable": + max_err <= args.max_reprojection_error + } + + out["used_markers"] = sorted( + list(set(used_markers)) + ) + + out_file = Path(args.detections).with_suffix( + ".camera_pose.json" + ) + + with open(out_file, "w", encoding="utf-8") as f: + json.dump(out, f, indent=2) + + print() + print("Gespeichert:") + print(out_file) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/pipeline/multiview_pose.json b/pipeline/multiview_pose.json deleted file mode 100644 index 519d8e5..0000000 --- a/pipeline/multiview_pose.json +++ /dev/null @@ -1,2144 +0,0 @@ -{ - "schema_version": "1.0", - "created_utc": "2026-05-28T21:28:35.973154Z", - "source_robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json", - "source_detections": [ - "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json" - ], - "robot_pose": { - "state": { - "x": 100.21525656040845, - "y": 29.397626553503173, - "z": -36.04825291833897, - "a": -120.21337951359496, - "b": 22.00000000000008, - "c": 90.99999999999989, - "e": 10.000000000000258 - }, - "uncertainty": { - "x_mm": 17194.235819424397, - "y_mm": 6014.1408132596725, - "z_mm": 3621.298501957444, - "a_deg": 8796.009134059024, - "b_deg": 12562.017200522667, - "c_deg": 12562.017199380893, - "e_mm": 125620.17196327279 - }, - "confidence": { - "x": 0.0, - "y": 6.444409678452354e-262, - "z": 5.358019964976179e-158, - "a": 0.0, - "b": 0.0, - "c": 0.0, - "e": 0.36787944117144233 - } - }, - "camera_poses": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "camera_id": "cam1", - "camera_position_world_m": [ - -16.343352953589292, - -63.12937932142545, - -42.02161528801491 - ], - "rvec": [ - 118.44192782487391, - -119.13238841589752, - 44.062625605263676 - ], - "tvec": [ - 0.4631129054169859, - 3.1298682546353254, - -77.51276876640009 - ], - "intrinsics": { - "camera_matrix": [ - [ - 1777.77783203125, - 0.0, - 640.0 - ], - [ - 0.0, - 1500.0, - 360.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ], - "distortion_coefficients": [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "observation_count": 17 - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "camera_id": "cam1", - "camera_position_world_m": [ - -57.84264421184561, - 32.9115287367793, - 4.0804577977879966 - ], - "rvec": [ - -0.8564265551247701, - 6.744826532647081, - 4.65580193037499 - ], - "tvec": [ - -2.6186145648975523, - 2.5499603647238676, - -66.57500213254504 - ], - "intrinsics": { - "camera_matrix": [ - [ - 1777.77783203125, - 0.0, - 640.0 - ], - [ - 0.0, - 1500.0, - 360.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ], - "distortion_coefficients": [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "observation_count": 10 - }, - { - "view_index": 2, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", - "camera_id": "cam1", - "camera_position_world_m": [ - 0.3512702688674852, - -1.2406150586644955, - 0.23747342372270985 - ], - "rvec": [ - -4.448618579992061, - -0.5683334688730436, - 0.6217033179458588 - ], - "tvec": [ - 0.020309498830570788, - 0.02559958355628428, - 1.3106648458431038 - ], - "intrinsics": { - "camera_matrix": [ - [ - 1777.77783203125, - 0.0, - 640.0 - ], - [ - 0.0, - 1500.0, - 360.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ], - "distortion_coefficients": [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "observation_count": 7 - } - ], - "marker_positions": [ - { - "marker_id": 210, - "link_name": "Board", - "position_world_m": [ - 0.02, - -0.02, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 3, - "mean_confidence": 0.6882418402751833, - "mean_detector_confidence": 0.6997700579082148, - "mean_reprojection_error_px": 441.0426420373767, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.5673043275049208, - "confidence_weighted": 0.556048533067895, - "quality": { - "detector_confidence": 0.5673043275049208, - "weighted_confidence": 0.556048533067895, - "q": { - "size": 0.8108224868774414, - "aspect": 0.9096486158109359, - "border": 0.2833333333333333, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.9999983069718208, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9981082248687744, - "aspect": 0.9990964861581093, - "border": 0.9928333333333333, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9999999830697182, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9801591599229813, - "raw": { - "mean_edge_px": 40.54112434387207, - "edge_ratio": 1.1986511772098227, - "distance_to_border_px": 34.0, - "distance_to_center_norm": 0.7614269256591797, - "laplacian_var": 3797.5312506581813 - } - }, - "mean_reprojection_error_px": 585.2466131635871, - "corner_reprojection_errors_px": [ - 610.9384647476247, - 566.4528099051602, - 559.5701708238369, - 604.0250071777266 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.7813266383036261, - "confidence_weighted": 0.7686240953581938, - "quality": { - "detector_confidence": 0.7813266383036261, - "weighted_confidence": 0.7686240953581938, - "q": { - "size": 0.7824347686767578, - "aspect": 0.8792155830729744, - "border": 1.0, - "center": 0.0, - "sharpness": 0.9904164099455028, - "homography": 0.7145588675251666, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9978243476867675, - "aspect": 0.9987921558307298, - "border": 1.0, - "center": 0.99, - "sharpness": 0.999904164099455, - "homography": 0.9971455886752516, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9837423398579991, - "raw": { - "mean_edge_px": 39.12173843383789, - "edge_ratio": 1.274754950327127, - "distance_to_border_px": 252.0, - "distance_to_center_norm": 0.5032430291175842, - "laplacian_var": 2476.0410248637572 - } - }, - "mean_reprojection_error_px": 432.8261187281506, - "corner_reprojection_errors_px": [ - 451.23541594327764, - 408.7849241393045, - 413.4238931097967, - 457.8602417202238 - ] - }, - { - "view_index": 2, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", - "confidence_detector": 0.7506792079160973, - "confidence_weighted": 0.740052892399461, - "quality": { - "detector_confidence": 0.7506792079160973, - "weighted_confidence": 0.740052892399461, - "q": { - "size": 0.8434026336669922, - "aspect": 0.8575862494073492, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.8786678750976363, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9984340263366699, - "aspect": 0.9985758624940735, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9987866787509764, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9858443987730322, - "raw": { - "mean_edge_px": 42.17013168334961, - "edge_ratio": 1.3321269451115116, - "distance_to_border_px": 298.0, - "distance_to_center_norm": 0.3557531535625458, - "laplacian_var": 2842.0926549741707 - } - }, - "mean_reprojection_error_px": 305.0551942203927, - "corner_reprojection_errors_px": [ - 336.8958377277025, - 282.2427865676158, - 272.7772202436447, - 328.3049323426078 - ] - } - ] - }, - { - "marker_id": 211, - "link_name": "Board", - "position_world_m": [ - 0.25, - -0.01, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 1, - "mean_confidence": 0.6305246964757232, - "mean_detector_confidence": 0.6412317666518965, - "mean_reprojection_error_px": 211.60483046120936, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.6412317666518965, - "confidence_weighted": 0.6305246964757232, - "quality": { - "detector_confidence": 0.6412317666518965, - "weighted_confidence": 0.6305246964757232, - "q": { - "size": 0.6744685745239258, - "aspect": 0.9460729944417767, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.7016198391981602, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9967446857452392, - "aspect": 0.9994607299444178, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9970161983919816, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9833023397576218, - "raw": { - "mean_edge_px": 33.72342872619629, - "edge_ratio": 1.1140017860673477, - "distance_to_border_px": 276.0, - "distance_to_center_norm": 0.26670128107070923, - "laplacian_var": 3165.7184033540047 - } - }, - "mean_reprojection_error_px": 211.60483046120936, - "corner_reprojection_errors_px": [ - 234.98916143435187, - 199.5386782266223, - 188.70294650504465, - 223.18853567881862 - ] - } - ] - }, - { - "marker_id": 215, - "link_name": "Board", - "position_world_m": [ - 0.25, - -0.09, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 2, - "mean_confidence": 0.7997306526656554, - "mean_detector_confidence": 0.8108527003549935, - "mean_reprojection_error_px": 157.11052614310307, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.7952557920267838, - "confidence_weighted": 0.7849458403437536, - "quality": { - "detector_confidence": 0.7952557920267838, - "weighted_confidence": 0.7849458403437536, - "q": { - "size": 0.7146316909790039, - "aspect": 0.9859016728248396, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 1.0, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.99714631690979, - "aspect": 0.9998590167282484, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 1.0, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9870356786000208, - "raw": { - "mean_edge_px": 35.731584548950195, - "edge_ratio": 1.0285998645985972, - "distance_to_border_px": 211.0, - "distance_to_center_norm": 0.213719442486763, - "laplacian_var": 3704.0260869185627 - } - }, - "mean_reprojection_error_px": 200.42541542932048, - "corner_reprojection_errors_px": [ - 213.57305595230443, - 179.84901855319694, - 188.742976102597, - 219.5366111091836 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.826449608683203, - "confidence_weighted": 0.8145154649875572, - "quality": { - "detector_confidence": 0.826449608683203, - "weighted_confidence": 0.8145154649875572, - "q": { - "size": 0.8409605407714844, - "aspect": 0.9049793706370471, - "border": 1.0, - "center": 0.0, - "sharpness": 0.8049029197222222, - "homography": 1.0, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9984096054077148, - "aspect": 0.9990497937063705, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9980490291972222, - "homography": 1.0, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9855597442720546, - "raw": { - "mean_edge_px": 42.04802703857422, - "edge_ratio": 1.2099951279465397, - "distance_to_border_px": 290.0, - "distance_to_center_norm": 0.0916082039475441, - "laplacian_var": 2012.2572993055553 - } - }, - "mean_reprojection_error_px": 113.79563685688566, - "corner_reprojection_errors_px": [ - 100.764594616081, - 90.3700880410387, - 128.18921061659032, - 135.8586541538326 - ] - } - ] - }, - { - "marker_id": 214, - "link_name": "Board", - "position_world_m": [ - 0.35000000000000003, - -0.01, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 1, - "mean_confidence": 0.5924337979452556, - "mean_detector_confidence": 0.6041252446922665, - "mean_reprojection_error_px": 175.5030184777268, - "observations": [ - { - "view_index": 2, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", - "confidence_detector": 0.6041252446922665, - "confidence_weighted": 0.5924337979452556, - "quality": { - "detector_confidence": 0.6041252446922665, - "weighted_confidence": 0.5924337979452556, - "q": { - "size": 0.9836519622802734, - "aspect": 0.7532145593882991, - "border": 1.0, - "center": 0.0, - "sharpness": 0.5256355772646303, - "homography": 0.7899472530560614, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9998365196228027, - "aspect": 0.997532145593883, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9952563557726463, - "homography": 0.9978994725305605, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.980647313036941, - "raw": { - "mean_edge_px": 49.18259811401367, - "edge_ratio": 1.655285901037602, - "distance_to_border_px": 137.0, - "distance_to_center_norm": 0.6772311925888062, - "laplacian_var": 1314.0889431615756 - } - }, - "mean_reprojection_error_px": 175.5030184777268, - "corner_reprojection_errors_px": [ - 174.74636916466218, - 153.27311517519206, - 183.05906730414804, - 190.93352226690504 - ] - } - ] - }, - { - "marker_id": 208, - "link_name": "Board", - "position_world_m": [ - 0.35000000000000003, - -0.09, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 1, - "mean_confidence": 0.6179064007574118, - "mean_detector_confidence": 0.6280424706698967, - "mean_reprojection_error_px": 98.18080189388743, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.6280424706698967, - "confidence_weighted": 0.6179064007574118, - "quality": { - "detector_confidence": 0.6280424706698967, - "weighted_confidence": 0.6179064007574118, - "q": { - "size": 0.6625362014770508, - "aspect": 0.9537163525948422, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.7625645902124035, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9966253620147705, - "aspect": 0.9995371635259485, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.997625645902124, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9838608527514494, - "raw": { - "mean_edge_px": 33.12681007385254, - "edge_ratio": 1.0970595655180506, - "distance_to_border_px": 303.0, - "distance_to_center_norm": 0.05652238056063652, - "laplacian_var": 2848.9886204705635 - } - }, - "mean_reprojection_error_px": 98.18080189388743, - "corner_reprojection_errors_px": [ - 92.6502159223099, - 77.77959676707061, - 106.52467862737805, - 115.76871625879116 - ] - } - ] - }, - { - "marker_id": 206, - "link_name": "Board", - "position_world_m": [ - 0.65, - -0.01, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 1, - "mean_confidence": 0.33185586633646474, - "mean_detector_confidence": 0.33820423087105295, - "mean_reprojection_error_px": 278.58790262226194, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.33820423087105295, - "confidence_weighted": 0.33185586633646474, - "quality": { - "detector_confidence": 0.33820423087105295, - "weighted_confidence": 0.33185586633646474, - "q": { - "size": 0.5361141967773437, - "aspect": 0.8936906729306451, - "border": 0.9833333333333333, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.6985669093200941, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9953611419677735, - "aspect": 0.9989369067293065, - "border": 0.9998333333333334, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.996985669093201, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9812291983508372, - "raw": { - "mean_edge_px": 26.805709838867188, - "edge_ratio": 1.2379107901411548, - "distance_to_border_px": 118.0, - "distance_to_center_norm": 0.41312646865844727, - "laplacian_var": 4112.338450277431 - } - }, - "mean_reprojection_error_px": 278.58790262226194, - "corner_reprojection_errors_px": [ - 260.5220487854409, - 284.9566681230145, - 296.68536419274807, - 272.18752938784417 - ] - } - ] - }, - { - "marker_id": 205, - "link_name": "Board", - "position_world_m": [ - 0.75, - -0.09, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 1, - "mean_confidence": 0.2820948444008322, - "mean_detector_confidence": 0.28724459014346065, - "mean_reprojection_error_px": 428.543316908284, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.28724459014346065, - "confidence_weighted": 0.2820948444008322, - "quality": { - "detector_confidence": 0.28724459014346065, - "weighted_confidence": 0.2820948444008322, - "q": { - "size": 0.5248580741882324, - "aspect": 0.839187418386558, - "border": 0.8333333333333334, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.9999815099800249, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9952485807418823, - "aspect": 0.9983918741838655, - "border": 0.9983333333333333, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9999998150998003, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9820719139042569, - "raw": { - "mean_edge_px": 26.24290370941162, - "edge_ratio": 1.383257847031654, - "distance_to_border_px": 100.0, - "distance_to_center_norm": 0.5996246933937073, - "laplacian_var": 5067.414824476962 - } - }, - "mean_reprojection_error_px": 428.543316908284, - "corner_reprojection_errors_px": [ - 408.1250357795538, - 430.13216881859233, - 448.84097211823865, - 427.0750909167511 - ] - } - ] - }, - { - "marker_id": 207, - "link_name": "Board", - "position_world_m": [ - 0.75, - -0.01, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 1, - "mean_confidence": 0.2656859333164099, - "mean_detector_confidence": 0.27228561618555186, - "mean_reprojection_error_px": 376.9955122102373, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.27228561618555186, - "confidence_weighted": 0.2656859333164099, - "quality": { - "detector_confidence": 0.27228561618555186, - "weighted_confidence": 0.2656859333164099, - "q": { - "size": 0.5014523983001709, - "aspect": 0.8554115971298921, - "border": 0.5, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.6975670005943979, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9950145239830017, - "aspect": 0.998554115971299, - "border": 0.995, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.996975670005944, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9757619114751748, - "raw": { - "mean_edge_px": 25.072619915008545, - "edge_ratio": 1.3380557461583085, - "distance_to_border_px": 60.0, - "distance_to_center_norm": 0.5434604287147522, - "laplacian_var": 4016.6321593416924 - } - }, - "mean_reprojection_error_px": 376.9955122102373, - "corner_reprojection_errors_px": [ - 360.06398388824374, - 381.6816681569444, - 394.27105560686095, - 371.9653411889002 - ] - } - ] - }, - { - "marker_id": 217, - "link_name": "Board", - "position_world_m": [ - 0.65, - -0.09, - 0.0003 - ], - "size_m": 0.025, - "observation_count": 1, - "mean_confidence": 0.3494362969135403, - "mean_detector_confidence": 0.35596573288593486, - "mean_reprojection_error_px": 331.82951948750804, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.35596573288593486, - "confidence_weighted": 0.3494362969135403, - "quality": { - "detector_confidence": 0.35596573288593486, - "weighted_confidence": 0.3494362969135403, - "q": { - "size": 0.5561128711700439, - "aspect": 0.8721453879265322, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.726899391813532, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9955611287117004, - "aspect": 0.9987214538792654, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9972689939181353, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9816571221070685, - "raw": { - "mean_edge_px": 27.805643558502197, - "edge_ratio": 1.2931956388084183, - "distance_to_border_px": 161.0, - "distance_to_center_norm": 0.4665455222129822, - "laplacian_var": 3793.153007417641 - } - }, - "mean_reprojection_error_px": 331.82951948750804, - "corner_reprojection_errors_px": [ - 309.97533094447215, - 333.9867434221059, - 353.66344926865025, - 329.6925543148037 - ] - } - ] - }, - { - "marker_id": 198, - "link_name": "Arm1", - "position_world_m": [ - 0.10021525656040844, - -0.12221709509972764, - 0.10903202128450216 - ], - "size_m": 0.025, - "observation_count": 2, - "mean_confidence": 0.1628904920977715, - "mean_detector_confidence": 0.16652042240877096, - "mean_reprojection_error_px": 245.0843876652231, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.20150745250271476, - "confidence_weighted": 0.19749969171522036, - "quality": { - "detector_confidence": 0.20150745250271476, - "weighted_confidence": 0.19749969171522036, - "q": { - "size": 0.6339855194091797, - "aspect": 0.7539930512070505, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.6098583763162305, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9963398551940917, - "aspect": 0.9975399305120705, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9960985837631623, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9801111038935872, - "raw": { - "mean_edge_px": 31.699275970458984, - "edge_ratio": 1.652544339497884, - "distance_to_border_px": 237.0, - "distance_to_center_norm": 0.3810231387615204, - "laplacian_var": 3972.096222043203 - } - }, - "mean_reprojection_error_px": 248.07751803913456, - "corner_reprojection_errors_px": [ - 273.96976726259226, - 245.4724112741704, - 222.59090992086755, - 250.2769836989081 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.13153339231482716, - "confidence_weighted": 0.12828129248032266, - "quality": { - "detector_confidence": 0.13153339231482716, - "weighted_confidence": 0.12828129248032266, - "q": { - "size": 0.6576880264282227, - "aspect": 0.42738020051250675, - "border": 0.5916666666666667, - "center": 0.0, - "sharpness": 0.9362022578647182, - "homography": 0.8917140926962271, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9965768802642823, - "aspect": 0.994273802005125, - "border": 0.9959166666666667, - "center": 0.99, - "sharpness": 0.9993620225786471, - "homography": 0.9989171409269623, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9752754811742362, - "raw": { - "mean_edge_px": 32.88440132141113, - "edge_ratio": 3.6796739708616246, - "distance_to_border_px": 71.0, - "distance_to_center_norm": 0.3842795193195343, - "laplacian_var": 2340.5056446617955 - } - }, - "mean_reprojection_error_px": 242.0912572913116, - "corner_reprojection_errors_px": [ - 258.3749702118821, - 237.59562364753367, - 224.8980425891153, - 247.4963927167153 - ] - } - ] - }, - { - "marker_id": 229, - "link_name": "Arm1", - "position_world_m": [ - 0.10021525656040844, - -0.2006281682211539, - 0.15321011101172263 - ], - "size_m": 0.025, - "observation_count": 2, - "mean_confidence": 0.22245621469865084, - "mean_detector_confidence": 0.2274747191640703, - "mean_reprojection_error_px": 173.6079280482102, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.26810902547334975, - "confidence_weighted": 0.2630164795315655, - "quality": { - "detector_confidence": 0.26810902547334975, - "weighted_confidence": 0.2630164795315655, - "q": { - "size": 0.6824631023406983, - "aspect": 0.7938768481947832, - "border": 1.0, - "center": 0.0, - "sharpness": 0.9086003975826067, - "homography": 0.7035912150387432, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.996824631023407, - "aspect": 0.9979387684819478, - "border": 1.0, - "center": 0.99, - "sharpness": 0.999086003975826, - "homography": 0.9970359121503874, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9810056900069167, - "raw": { - "mean_edge_px": 34.12315511703491, - "edge_ratio": 1.5192824359947652, - "distance_to_border_px": 235.0, - "distance_to_center_norm": 0.26675668358802795, - "laplacian_var": 2271.5009939565166 - } - }, - "mean_reprojection_error_px": 154.45285855459778, - "corner_reprojection_errors_px": [ - 178.89833200454908, - 155.66332803657198, - 130.23647076368366, - 153.01330341358639 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.18684041285479083, - "confidence_weighted": 0.18189594986573623, - "quality": { - "detector_confidence": 0.18684041285479083, - "weighted_confidence": 0.18189594986573623, - "q": { - "size": 0.7395829486846924, - "aspect": 0.44796521997625727, - "border": 1.0, - "center": 0.0, - "sharpness": 0.5568649165432099, - "homography": 0.5823463065693475, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9973958294868469, - "aspect": 0.9944796521997625, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9955686491654321, - "homography": 0.9958234630656935, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9735364372540894, - "raw": { - "mean_edge_px": 36.97914743423462, - "edge_ratio": 3.4646323214690695, - "distance_to_border_px": 130.0, - "distance_to_center_norm": 0.30442705750465393, - "laplacian_var": 1392.1622913580247 - } - }, - "mean_reprojection_error_px": 192.76299754182264, - "corner_reprojection_errors_px": [ - 214.02378857320852, - 184.04050020559077, - 168.9825131053272, - 204.00518828316393 - ] - } - ] - }, - { - "marker_id": 242, - "link_name": "Arm1", - "position_world_m": [ - 0.10021525656040844, - -0.23498890467565872, - 0.09222372080616886 - ], - "size_m": 0.025, - "observation_count": 0, - "mean_confidence": null, - "mean_detector_confidence": null, - "mean_reprojection_error_px": null, - "observations": [] - }, - { - "marker_id": 243, - "link_name": "Arm1", - "position_world_m": [ - 0.10021525656040844, - -0.2483017315511832, - 0.13989728413619817 - ], - "size_m": 0.025, - "observation_count": 3, - "mean_confidence": 0.903504284314228, - "mean_detector_confidence": 0.9174550709990235, - "mean_reprojection_error_px": 81.5029264885797, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.8899728634608616, - "confidence_weighted": 0.8780472636948905, - "quality": { - "detector_confidence": 0.8899728634608616, - "weighted_confidence": 0.8780472636948905, - "q": { - "size": 0.8810945701599121, - "aspect": 0.9417837479752699, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.8333271723300208, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9988109457015991, - "aspect": 0.9994178374797527, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9983332717233002, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9866000411297984, - "raw": { - "mean_edge_px": 44.054728507995605, - "edge_ratio": 1.1236297656439467, - "distance_to_border_px": 275.0, - "distance_to_center_norm": 0.14032743871212006, - "laplacian_var": 2678.6956247003295 - } - }, - "mean_reprojection_error_px": 76.87929689884885, - "corner_reprojection_errors_px": [ - 99.14225948732798, - 70.2117506861392, - 48.833911722956465, - 89.3292656989718 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.9132502955127223, - "confidence_weighted": 0.8990944567220429, - "quality": { - "detector_confidence": 0.9132502955127223, - "weighted_confidence": 0.8990944567220429, - "q": { - "size": 1.0, - "aspect": 0.9546584653922503, - "border": 1.0, - "center": 0.0, - "sharpness": 0.5809177986450728, - "homography": 0.9082012101971718, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9995465846539225, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9958091779864507, - "homography": 0.9990820121019717, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9844994971693583, - "raw": { - "mean_edge_px": 55.26974582672119, - "edge_ratio": 1.0949900645130086, - "distance_to_border_px": 219.0, - "distance_to_center_norm": 0.16541028022766113, - "laplacian_var": 1452.2944966126818 - } - }, - "mean_reprojection_error_px": 123.84143010803572, - "corner_reprojection_errors_px": [ - 159.2946943920584, - 112.54406878360543, - 84.16105909185964, - 139.36589816461947 - ] - }, - { - "view_index": 2, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", - "confidence_detector": 0.9491420540234864, - "confidence_weighted": 0.9333711325257503, - "quality": { - "detector_confidence": 0.9491420540234864, - "weighted_confidence": 0.9333711325257503, - "q": { - "size": 1.0, - "aspect": 0.9739075220959238, - "border": 1.0, - "center": 0.0, - "sharpness": 0.43477113518953137, - "homography": 0.9224349218355518, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9997390752209593, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9943477113518953, - "homography": 0.9992243492183555, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9833840240974658, - "raw": { - "mean_edge_px": 75.11714553833008, - "edge_ratio": 1.0535830709016873, - "distance_to_border_px": 185.0, - "distance_to_center_norm": 0.1876671463251114, - "laplacian_var": 1086.9278379738284 - } - }, - "mean_reprojection_error_px": 43.788052458854565, - "corner_reprojection_errors_px": [ - 66.92563132518778, - 41.81087505439111, - 17.311321747071958, - 49.104381708767434 - ] - } - ] - }, - { - "marker_id": 244, - "link_name": "Ellbow", - "position_world_m": [ - 0.22521525656040844, - 0.0, - 0.0 - ], - "size_m": 0.025, - "observation_count": 0, - "mean_confidence": null, - "mean_detector_confidence": null, - "mean_reprojection_error_px": null, - "observations": [] - }, - { - "marker_id": 245, - "link_name": "Ellbow", - "position_world_m": [ - 0.19021525656040844, - 0.004053519626182114, - -0.03476447869075785 - ], - "size_m": 0.025, - "observation_count": 0, - "mean_confidence": null, - "mean_detector_confidence": null, - "mean_reprojection_error_px": null, - "observations": [] - }, - { - "marker_id": 246, - "link_name": "Ellbow", - "position_world_m": [ - 0.19021525656040844, - -0.004053519626182114, - 0.03476447869075785 - ], - "size_m": 0.025, - "observation_count": 3, - "mean_confidence": 0.6682660968032644, - "mean_detector_confidence": 0.6792447690577089, - "mean_reprojection_error_px": 161.1324352664503, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.8015179238063419, - "confidence_weighted": 0.7895911927962278, - "quality": { - "detector_confidence": 0.8015179238063419, - "weighted_confidence": 0.7895911927962278, - "q": { - "size": 0.7650188636779786, - "aspect": 0.9580747137765034, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.7832604752816245, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9976501886367798, - "aspect": 0.999580747137765, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9978326047528162, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9851198199617608, - "raw": { - "mean_edge_px": 38.250943183898926, - "edge_ratio": 1.0875198679615226, - "distance_to_border_px": 150.0, - "distance_to_center_norm": 0.25916191935539246, - "laplacian_var": 3236.7051337367984 - } - }, - "mean_reprojection_error_px": 134.6218442755581, - "corner_reprojection_errors_px": [ - 135.7150033827045, - 153.20493069778522, - 136.97402164430275, - 112.59342137743992 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.7581700566520715, - "confidence_weighted": 0.7467269698455701, - "quality": { - "detector_confidence": 0.7581700566520715, - "weighted_confidence": 0.7467269698455701, - "q": { - "size": 1.0, - "aspect": 0.8624536105407097, - "border": 1.0, - "center": 0.0, - "sharpness": 0.7134050632712029, - "homography": 0.9089132203508788, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9986245361054071, - "border": 1.0, - "center": 0.99, - "sharpness": 0.997134050632712, - "homography": 0.9990891322035088, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9849069655203322, - "raw": { - "mean_edge_px": 50.77022838592529, - "edge_ratio": 1.3189653049815784, - "distance_to_border_px": 149.0, - "distance_to_center_norm": 0.34769952297210693, - "laplacian_var": 1783.5126581780073 - } - }, - "mean_reprojection_error_px": 166.1189645701224, - "corner_reprojection_errors_px": [ - 167.75756135019049, - 198.24116321049402, - 168.6490336545454, - 129.8281000652596 - ] - }, - { - "view_index": 2, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", - "confidence_detector": 0.4780463267147134, - "confidence_weighted": 0.46848012776799536, - "quality": { - "detector_confidence": 0.4780463267147134, - "weighted_confidence": 0.46848012776799536, - "q": { - "size": 1.0, - "aspect": 0.6468624400661076, - "border": 1.0, - "center": 0.0, - "sharpness": 0.6283678308439046, - "homography": 0.7101453224803067, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9964686244006611, - "border": 1.0, - "center": 0.99, - "sharpness": 0.996283678308439, - "homography": 0.997101453224803, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9799889709174003, - "raw": { - "mean_edge_px": 59.82627487182617, - "edge_ratio": 2.0918474719224776, - "distance_to_border_px": 163.0, - "distance_to_center_norm": 0.531389057636261, - "laplacian_var": 1570.9195771097613 - } - }, - "mean_reprojection_error_px": 182.65649695367037, - "corner_reprojection_errors_px": [ - 186.41931794153945, - 204.89340651658281, - 185.29874269593594, - 154.01452066062325 - ] - } - ] - }, - { - "marker_id": 247, - "link_name": "Ellbow", - "position_world_m": [ - 0.15271525656040844, - -0.004053519626182114, - 0.03476447869075785 - ], - "size_m": 0.025, - "observation_count": 3, - "mean_confidence": 0.7010103986241017, - "mean_detector_confidence": 0.7117000257529918, - "mean_reprojection_error_px": 146.47131004262607, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.8796777163094818, - "confidence_weighted": 0.8670496997853304, - "quality": { - "detector_confidence": 0.8796777163094818, - "weighted_confidence": 0.8670496997853304, - "q": { - "size": 0.7921941375732422, - "aspect": 0.9657885238796377, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.8015391946807702, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9979219413757324, - "aspect": 0.9996578852387964, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9980153919468077, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9856447238687257, - "raw": { - "mean_edge_px": 39.60970687866211, - "edge_ratio": 1.0708467232203849, - "distance_to_border_px": 184.0, - "distance_to_center_norm": 0.22855591773986816, - "laplacian_var": 4202.582433286217 - } - }, - "mean_reprojection_error_px": 112.65188559107314, - "corner_reprojection_errors_px": [ - 128.71700121736973, - 130.18085487709857, - 100.60148705412828, - 91.10819921569595 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.7448005120854795, - "confidence_weighted": 0.7340842516844052, - "quality": { - "detector_confidence": 0.7448005120854795, - "weighted_confidence": 0.7340842516844052, - "q": { - "size": 1.0, - "aspect": 0.8537371543928008, - "border": 1.0, - "center": 0.0, - "sharpness": 0.8698383110697441, - "homography": 0.8325296434913341, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.998537371543928, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9986983831106975, - "homography": 0.9983252964349133, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9856119051649572, - "raw": { - "mean_edge_px": 51.05013561248779, - "edge_ratio": 1.3426413969560103, - "distance_to_border_px": 145.0, - "distance_to_center_norm": 0.28477779030799866, - "laplacian_var": 2174.5957776743603 - } - }, - "mean_reprojection_error_px": 136.19499595934474, - "corner_reprojection_errors_px": [ - 156.16137047168513, - 158.6202327519144, - 117.10218236400607, - 112.89619824977336 - ] - }, - { - "view_index": 2, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", - "confidence_detector": 0.5106218488640142, - "confidence_weighted": 0.5018972444025696, - "quality": { - "detector_confidence": 0.5106218488640142, - "weighted_confidence": 0.5018972444025696, - "q": { - "size": 1.0, - "aspect": 0.6760419217397143, - "border": 1.0, - "center": 0.0, - "sharpness": 0.9265392364192184, - "homography": 0.6801291688207284, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9967604192173971, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9992653923641922, - "homography": 0.9968012916882073, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9829137658702729, - "raw": { - "mean_edge_px": 58.36018657684326, - "edge_ratio": 1.958396418454695, - "distance_to_border_px": 143.0, - "distance_to_center_norm": 0.41272374987602234, - "laplacian_var": 2316.348091048046 - } - }, - "mean_reprojection_error_px": 190.5670485774603, - "corner_reprojection_errors_px": [ - 210.72653639156906, - 204.3452514096146, - 172.84658735917168, - 174.349819149486 - ] - } - ] - }, - { - "marker_id": 124, - "link_name": "Arm2", - "position_world_m": [ - 0.06637262457056678, - -0.11021173982435686, - -0.0218443050905359 - ], - "size_m": 0.025, - "observation_count": 2, - "mean_confidence": 0.4015628677453015, - "mean_detector_confidence": 0.4106676690676095, - "mean_reprojection_error_px": 259.7297501072294, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.34091855704160245, - "confidence_weighted": 0.33488305339370045, - "quality": { - "detector_confidence": 0.34091855704160245, - "weighted_confidence": 0.33488305339370045, - "q": { - "size": 0.7142756080627441, - "aspect": 0.7379840018220383, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.7675736815140904, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9971427560806274, - "aspect": 0.9973798400182203, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9976757368151409, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9822963475491728, - "raw": { - "mean_edge_px": 35.71378040313721, - "edge_ratio": 1.7100858488288635, - "distance_to_border_px": 332.0, - "distance_to_center_norm": 0.14613474905490875, - "laplacian_var": 3569.5639450778804 - } - }, - "mean_reprojection_error_px": 134.91037554166337, - "corner_reprojection_errors_px": [ - 120.9873933400657, - 103.67198851474541, - 149.06804198829764, - 165.91407832354471 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.4804167810936165, - "confidence_weighted": 0.46824268209690245, - "quality": { - "detector_confidence": 0.4804167810936165, - "weighted_confidence": 0.46824268209690245, - "q": { - "size": 1.0, - "aspect": 0.9604332717578841, - "border": 0.21666666666666667, - "center": 0.0, - "sharpness": 0.5040158791602892, - "homography": 0.7617971982706998, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9996043327175789, - "border": 0.9921666666666666, - "center": 0.99, - "sharpness": 0.9950401587916029, - "homography": 0.997617971982707, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9746592969358792, - "raw": { - "mean_edge_px": 61.16414737701416, - "edge_ratio": 1.0823934976132112, - "distance_to_border_px": 26.0, - "distance_to_center_norm": 0.5047972202301025, - "laplacian_var": 1260.039697900723 - } - }, - "mean_reprojection_error_px": 384.5491246727954, - "corner_reprojection_errors_px": [ - 334.3673362766447, - 376.12029027919453, - 432.6602329793538, - 395.04863915598855 - ] - } - ] - }, - { - "marker_id": 122, - "link_name": "Arm2", - "position_world_m": [ - 0.11782801799927344, - -0.11474921044648306, - 0.017070715755537844 - ], - "size_m": 0.025, - "observation_count": 3, - "mean_confidence": 0.5578116149791655, - "mean_detector_confidence": 0.5690911450460799, - "mean_reprojection_error_px": 185.0724839723273, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.18665602922528673, - "confidence_weighted": 0.18263714689166236, - "quality": { - "detector_confidence": 0.18665602922528673, - "weighted_confidence": 0.18263714689166236, - "q": { - "size": 0.7027967643737792, - "aspect": 0.654945658590568, - "border": 1.0, - "center": 0.0, - "sharpness": 0.9331720780648362, - "homography": 0.539630944261658, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9970279676437378, - "aspect": 0.9965494565859057, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9993317207806484, - "homography": 0.9953963094426166, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9784690462434849, - "raw": { - "mean_edge_px": 35.139838218688965, - "edge_ratio": 2.0536884606639982, - "distance_to_border_px": 242.0, - "distance_to_center_norm": 0.27940502762794495, - "laplacian_var": 2332.9301951620905 - } - }, - "mean_reprojection_error_px": 194.5564447603344, - "corner_reprojection_errors_px": [ - 164.85878003772754, - 191.48901171235315, - 222.56759495263603, - 199.31039233862094 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.9456847621099602, - "confidence_weighted": 0.9281720009504786, - "quality": { - "detector_confidence": 0.9456847621099602, - "weighted_confidence": 0.9281720009504786, - "q": { - "size": 1.0, - "aspect": 0.9720842559145406, - "border": 1.0, - "center": 0.0, - "sharpness": 0.4361118058809464, - "homography": 0.7295816020733066, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9997208425591454, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9943611180588094, - "homography": 0.997295816020733, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9814813964852218, - "raw": { - "mean_edge_px": 53.96408939361572, - "edge_ratio": 1.0574348240198506, - "distance_to_border_px": 283.0, - "distance_to_center_norm": 0.3038843870162964, - "laplacian_var": 1090.279514702366 - } - }, - "mean_reprojection_error_px": 181.55342368543512, - "corner_reprojection_errors_px": [ - 138.79861947036503, - 193.60467544781787, - 222.68010835264752, - 171.13029147090998 - ] - }, - { - "view_index": 2, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", - "confidence_detector": 0.5749326438029929, - "confidence_weighted": 0.5626256970953559, - "quality": { - "detector_confidence": 0.5749326438029929, - "weighted_confidence": 0.5626256970953559, - "q": { - "size": 1.0, - "aspect": 0.7301044220084257, - "border": 1.0, - "center": 0.0, - "sharpness": 0.34034870646107274, - "homography": 0.7735552097414035, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9973010442200843, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9934034870646107, - "homography": 0.997735552097414, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9785941069092363, - "raw": { - "mean_edge_px": 75.16977119445801, - "edge_ratio": 1.7393341824971433, - "distance_to_border_px": 251.0, - "distance_to_center_norm": 0.45140743255615234, - "laplacian_var": 850.8717661526819 - } - }, - "mean_reprojection_error_px": 179.10758347121242, - "corner_reprojection_errors_px": [ - 132.65923607725063, - 207.86142341101734, - 235.5981225376692, - 140.31155185891245 - ] - } - ] - }, - { - "marker_id": 218, - "link_name": "Arm2", - "position_world_m": [ - 0.08260249512154345, - -0.10774345317436712, - -0.043013241363103374 - ], - "size_m": 0.025, - "observation_count": 0, - "mean_confidence": null, - "mean_detector_confidence": null, - "mean_reprojection_error_px": null, - "observations": [] - }, - { - "marker_id": 101, - "link_name": "Arm2", - "position_world_m": [ - 0.06637262457056678, - -0.17974069720587255, - -0.029951344342900126 - ], - "size_m": 0.025, - "observation_count": 1, - "mean_confidence": 0.3264687769670023, - "mean_detector_confidence": 0.3325004465415643, - "mean_reprojection_error_px": 266.6725297371658, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.3325004465415643, - "confidence_weighted": 0.3264687769670023, - "quality": { - "detector_confidence": 0.3325004465415643, - "weighted_confidence": 0.3264687769670023, - "q": { - "size": 0.7345538902282714, - "aspect": 0.6782259971718826, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.7627185514162481, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9973455389022827, - "aspect": 0.9967822599717188, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9976271855141625, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9818596647394037, - "raw": { - "mean_edge_px": 36.727694511413574, - "edge_ratio": 1.9488695631540953, - "distance_to_border_px": 265.0, - "distance_to_center_norm": 0.31515657901763916, - "laplacian_var": 3563.870814189421 - } - }, - "mean_reprojection_error_px": 266.6725297371658, - "corner_reprojection_errors_px": [ - 250.67737404692798, - 234.4550017828906, - 283.7216101380938, - 297.83613298075073 - ] - } - ] - }, - { - "marker_id": 102, - "link_name": "Arm2", - "position_world_m": [ - 0.09128210146267585, - -0.18469476841972596, - 0.012536596762424725 - ], - "size_m": 0.025, - "observation_count": 3, - "mean_confidence": 0.8354983021138915, - "mean_detector_confidence": 0.8473641170835915, - "mean_reprojection_error_px": 230.53888976377948, - "observations": [ - { - "view_index": 0, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "confidence_detector": 0.9494437061622057, - "confidence_weighted": 0.9376120619964978, - "quality": { - "detector_confidence": 0.9494437061622057, - "weighted_confidence": 0.9376120619964978, - "q": { - "size": 0.9537287521362304, - "aspect": 0.9740662971297988, - "border": 1.0, - "center": 0.0, - "sharpness": 1.0, - "homography": 0.8234129943538817, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 0.9995372875213623, - "aspect": 0.9997406629712979, - "border": 1.0, - "center": 0.99, - "sharpness": 1.0, - "homography": 0.9982341299435388, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9875383405156971, - "raw": { - "mean_edge_px": 47.68643760681152, - "edge_ratio": 1.0532483321651058, - "distance_to_border_px": 309.0, - "distance_to_center_norm": 0.3549750745296478, - "laplacian_var": 3935.778766550373 - } - }, - "mean_reprojection_error_px": 276.6085282390233, - "corner_reprojection_errors_px": [ - 240.26917031381674, - 267.8790547795138, - 311.1033048450262, - 287.1825830177366 - ] - }, - { - "view_index": 1, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", - "confidence_detector": 0.8913851020933449, - "confidence_weighted": 0.880139786945703, - "quality": { - "detector_confidence": 0.8913851020933449, - "weighted_confidence": 0.880139786945703, - "q": { - "size": 1.0, - "aspect": 0.9425738852513735, - "border": 1.0, - "center": 0.0, - "sharpness": 0.7931141622847128, - "homography": 0.9999959590215692, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.9994257388525137, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9979311416228471, - "homography": 0.9999999595902157, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9873844479549488, - "raw": { - "mean_edge_px": 62.59456253051758, - "edge_ratio": 1.1218495773056807, - "distance_to_border_px": 134.0, - "distance_to_center_norm": 0.3347931206226349, - "laplacian_var": 1982.7854057117818 - } - }, - "mean_reprojection_error_px": 265.88170983930263, - "corner_reprojection_errors_px": [ - 229.04927984617981, - 247.40709917850447, - 300.4580491614664, - 286.61241117106 - ] - }, - { - "view_index": 2, - "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", - "confidence_detector": 0.7012635429952238, - "confidence_weighted": 0.6887430573994738, - "quality": { - "detector_confidence": 0.7012635429952238, - "weighted_confidence": 0.6887430573994738, - "q": { - "size": 1.0, - "aspect": 0.8244031865405023, - "border": 1.0, - "center": 0.0, - "sharpness": 0.6987050522983833, - "homography": 0.6814939272403986, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "factor": { - "size": 1.0, - "aspect": 0.998244031865405, - "border": 1.0, - "center": 0.99, - "sharpness": 0.9969870505229839, - "homography": 0.9968149392724039, - "normal_visibility": 1.0, - "spin": 1.0 - }, - "weight_multiplier": 0.9821458198977909, - "raw": { - "mean_edge_px": 84.7633228302002, - "edge_ratio": 1.4259974156489281, - "distance_to_border_px": 140.0, - "distance_to_center_norm": 0.3269830048084259, - "laplacian_var": 1746.7626307459584 - } - }, - "mean_reprojection_error_px": 149.12643121301247, - "corner_reprojection_errors_px": [ - 100.71621265239685, - 145.42820590819824, - 193.79388723836442, - 156.5674190530904 - ] - } - ] - }, - { - "marker_id": 219, - "link_name": "Arm2", - "position_world_m": [ - 0.08260249512154345, - -0.21402343088611253, - -0.0554054299345744 - ], - "size_m": 0.025, - "observation_count": 0, - "mean_confidence": null, - "mean_detector_confidence": null, - "mean_reprojection_error_px": null, - "observations": [] - } - ], - "statistics": { - "observation_count": 34, - "camera_count": 3, - "marker_count": 23, - "observed_marker_count": 18, - "mean_detector_confidence": 0.5871913728875101, - "mean_weighted_confidence": 0.5774319023193206, - "mean_reprojection_error_px": 236.06726174073253, - "quality_means": { - "size": 0.8143773112577551, - "aspect": 0.834768084426124, - "border": 0.9237745098039215, - "homography": 0.7934741744632792 - }, - "quality_config": { - "size_ref_px": 50.0, - "border_ref_px": 120.0, - "center_ref_norm": 0.01, - "sharpness_ref": 2500.0, - "homography_ref": 0.18, - "size_factor": 0.01, - "aspect_factor": 0.01, - "border_factor": 0.01, - "center_factor": 0.01, - "sharpness_factor": 0.01, - "homography_factor": 0.01 - } - }, - "solver": { - "final_cost": 26976.87543820547, - "status": 0, - "message": "The maximum number of function evaluations is exceeded." - } -} \ No newline at end of file diff --git a/pipeline/multiview_pose_summary.json b/pipeline/multiview_pose_summary.json deleted file mode 100644 index 2970ee6..0000000 --- a/pipeline/multiview_pose_summary.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "schema_version": "1.0", - "created_utc": "2026-05-28T21:28:35.973154Z", - "source_robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json", - "source_detections": [ - "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", - "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json" - ], - "solver": { - "final_cost": 26976.87543820547, - "status": 0, - "message": "The maximum number of function evaluations is exceeded." - }, - "robot_pose": { - "state": { - "x": 100.21525656040845, - "y": 29.397626553503173, - "z": -36.04825291833897, - "a": -120.21337951359496, - "b": 22.00000000000008, - "c": 90.99999999999989, - "e": 10.000000000000258 - }, - "uncertainty": { - "x_mm": 17194.235819424397, - "y_mm": 6014.1408132596725, - "z_mm": 3621.298501957444, - "a_deg": 8796.009134059024, - "b_deg": 12562.017200522667, - "c_deg": 12562.017199380893, - "e_mm": 125620.17196327279 - }, - "confidence": { - "x": 0.0, - "y": 6.444409678452354e-262, - "z": 5.358019964976179e-158, - "a": 0.0, - "b": 0.0, - "c": 0.0, - "e": 0.36787944117144233 - } - }, - "statistics": { - "observation_count": 34, - "camera_count": 3, - "marker_count": 23, - "observed_marker_count": 18, - "mean_detector_confidence": 0.5871913728875101, - "mean_weighted_confidence": 0.5774319023193206, - "mean_reprojection_error_px": 236.06726174073253, - "quality_means": { - "size": 0.8143773112577551, - "aspect": 0.834768084426124, - "border": 0.9237745098039215, - "homography": 0.7934741744632792 - }, - "quality_config": { - "size_ref_px": 50.0, - "border_ref_px": 120.0, - "center_ref_norm": 0.01, - "sharpness_ref": 2500.0, - "homography_ref": 0.18, - "size_factor": 0.01, - "aspect_factor": 0.01, - "border_factor": 0.01, - "center_factor": 0.01, - "sharpness_factor": 0.01, - "homography_factor": 0.01 - } - } -} \ No newline at end of file diff --git a/pipeline/readTwoImages.py b/pipeline/readTwoImages.py new file mode 100644 index 0000000..d6e10d2 --- /dev/null +++ b/pipeline/readTwoImages.py @@ -0,0 +1,921 @@ +#!/usr/bin/env python3 +""" +readCamPositionTwo.py + +Two-camera ArUco detection with joint optimization of both camera extrinsics +against known machine-frame reference markers, plus triangulation of unknown +marker positions. Outputs camera pose and marker poses in machine coordinates, +with CSV and JSON similar to the single-camera script. + +Dependencies: numpy, opencv-python (cv2) +Optional but NOT required: SciPy (we implement a simple Levenberg–Marquardt). + +Usage example: + python3 readTwoImages.py -i snapshot_video0_1764531874081.jpg -i snapshot_video1_1764531874081.jpg -npz callibration_cam0.npz -npz callibration_cam1.npz -settings settings.json + python3 readTwoImages.py -i snapshot_video0_1764524369655.jpg -i snapshot_video1_1764524369655.jpg -npz callibration_cam0.npz -npz callibration_cam1.npz -settings settings.json + + python3 readTwoImages.py -i snapshot_video0_1765009029764.jpg -i snapshot_video1_1765009029764.jpg -npz callibration_cam0.npz -npz callibration_cam1.npz -settings settings.json + +NEW: + python3 readTwoImages.py -i img0.jpg -i img1.jpg -npz cam0.npz -npz cam1.npz -settings settings.json -outDir results/ + +Settings JSON is expected to contain: +{ + "coordinateSystem": { + "KnownMarkers": { + "50": [0.0, 0.0, 0.0], + "71": [0.140, 0.0, 0.0], + "101": [0.0, -0.080, 0.0] + } + } +} +""" +import argparse +import os +import sys +import json +import time +from typing import Dict, Tuple, List +import numpy as np +import cv2 + +# ---------------- Configuration defaults ---------------- +AXIS_LENGTH_M = 0.05 + +# ---------------- Utilities ---------------- +def load_intrinsics_npz(npz_path: str) -> Tuple[np.ndarray, np.ndarray]: + print("NPZ reading of file:", npz_path) + if os.path.exists(npz_path): + data = np.load(npz_path) + for k in ('camera_matrix', 'mtx', 'K'): + if k in data: + camera_matrix = data[k].astype(np.float32) + break + else: + raise KeyError("Camera matrix not found in NPZ.") + for k in ('dist_coeffs', 'dist', 'D'): + if k in data: + dist = data[k].astype(np.float32).reshape(-1,1) + break + else: + dist = np.zeros((5,1), dtype=np.float32) + print("NPZ loaded:", npz_path) + return camera_matrix, dist + # Fallback default intrinsics + camera_matrix = np.array([[1400, 0, 640], + [0, 1400, 360], + [0, 0, 1]], dtype=np.float32) + dist_coeffs = np.zeros((5,1), dtype=np.float32) + print("[WARN] Using default approximate intrinsics.") + return camera_matrix, dist_coeffs + + +def get_aruco_detector(dict_name: str): + mapping = { + 'DICT_4X4_250': cv2.aruco.DICT_4X4_250, + 'DICT_5X5_100': cv2.aruco.DICT_5X5_100, + 'DICT_6X6_250': cv2.aruco.DICT_6X6_250, + 'DICT_ARUCO_ORIGINAL': cv2.aruco.DICT_ARUCO_ORIGINAL, + } + if dict_name not in mapping: + dict_id = cv2.aruco.DICT_4X4_250 + else: + dict_id = mapping[dict_name] + dictionary = cv2.aruco.getPredefinedDictionary(dict_id) + try: + params = cv2.aruco.DetectorParameters() + except Exception: + params = cv2.aruco.DetectorParameters_create() + try: + detector = cv2.aruco.ArucoDetector(dictionary, params) + return detector, None + except Exception: + return None, (dictionary, params) + + +def detect_markers(image: np.ndarray, detector_tuple): + detector, fallback = detector_tuple + if detector is not None: + corners, ids, rejected = detector.detectMarkers(image) + else: + dictionary, params = fallback + corners, ids, rejected = cv2.aruco.detectMarkers(image, dictionary, parameters=params) + return corners, ids, rejected + + +def corners_to_image_points(corners: np.ndarray) -> np.ndarray: + return corners.reshape(4,2).astype(np.float32) + + +def marker_center_from_corners(corners: np.ndarray) -> np.ndarray: + pts = corners.reshape(4,2) + return pts.mean(axis=0).astype(np.float32) + + +def rvec_to_R(rvec: np.ndarray) -> np.ndarray: + R, _ = cv2.Rodrigues(rvec) + return R + + +def rigid_transform_no_scale(A: np.ndarray, B: np.ndarray) -> Tuple[np.ndarray, np.ndarray]: + """Find R,t s.t. B ≈ R A + t. A,B: Nx3.""" + assert A.shape == B.shape and A.shape[1] == 3, "A and B must be Nx3" + N = A.shape[0] + if N < 2: + raise ValueError("Need at least 2 points; 3+ recommended.") + centroid_A = A.mean(axis=0) + centroid_B = B.mean(axis=0) + AA = A - centroid_A + BB = B - centroid_B + H = AA.T @ BB + U, S, Vt = np.linalg.svd(H) + R = Vt.T @ U.T + if np.linalg.det(R) < 0: + Vt[-1, :] *= -1 + R = Vt.T @ U.T + t = centroid_B - R @ centroid_A + return R.astype(np.float32), t.astype(np.float32) + + +def undistort_to_normalized(points_px: np.ndarray, K: np.ndarray, D: np.ndarray) -> np.ndarray: + """points_px: Nx2 pixel. Returns Nx2 normalized coords (x,y) where projection is x=Xp/Z, y=Yp/Z. + cv2.undistortPoints with P=None yields normalized coordinates. + """ + pts = points_px.reshape(-1,1,2).astype(np.float32) + und = cv2.undistortPoints(pts, K, D, P=None) # returns Nx1x2 + return und.reshape(-1,2) + + +# ---------------- Joint optimization (LM, numerical Jacobian) ---------------- + +def pack_params(omega1, t1, omega2, t2) -> np.ndarray: + return np.hstack([omega1, t1, omega2, t2]).astype(np.float64) + + +def unpack_params(theta: np.ndarray): + omega1 = theta[0:3] + t1 = theta[3:6] + omega2 = theta[6:9] + t2 = theta[9:12] + return omega1, t1, omega2, t2 + + +def residuals_centers_normalized(theta: np.ndarray, + X_mach: np.ndarray, + obs1_norm: np.ndarray, + obs2_norm: np.ndarray) -> np.ndarray: + """ + Compute residuals in normalized coordinates (no intrinsics, no distortion). + For camera j: X_cam = R_j X_mach + t_j; proj: (x/z, y/z). + Returns stacked residuals [r1; r2] shape (4N,), where N = number of references. + """ + omega1, t1, omega2, t2 = unpack_params(theta) + R1 = cv2.Rodrigues(omega1)[0] + R2 = cv2.Rodrigues(omega2)[0] + # Camera 1 projections + X_cam1 = (R1 @ X_mach.T + t1.reshape(3,1)).T # Nx3 + uv1 = X_cam1[:, :2] / X_cam1[:, 2:3] + r1 = (obs1_norm - uv1).reshape(-1) + # Camera 2 projections + X_cam2 = (R2 @ X_mach.T + t2.reshape(3,1)).T + uv2 = X_cam2[:, :2] / X_cam2[:, 2:3] + r2 = (obs2_norm - uv2).reshape(-1) + return np.hstack([r1, r2]) + + +def numerical_jacobian(f, theta: np.ndarray, eps: float, *args) -> np.ndarray: + """Finite-difference Jacobian: forward differences.""" + r0 = f(theta, *args) + m = r0.size + n = theta.size + J = np.zeros((m, n), dtype=np.float64) + for k in range(n): + th = theta.copy() + th[k] += eps + rk = f(th, *args) + J[:, k] = (rk - r0) / eps + return J, r0 + + +def lm_solve(theta0: np.ndarray, + X_mach: np.ndarray, + obs1_norm: np.ndarray, + obs2_norm: np.ndarray, + max_iter: int = 50, + eps_jac: float = 1e-6, + lambda_init: float = 1e-3) -> Tuple[np.ndarray, Dict]: + """Simple Levenberg–Marquardt on center normalized residuals.""" + lam = lambda_init + theta = theta0.copy() + history = {"iters": [], "rms": []} + for it in range(max_iter): + J, r = numerical_jacobian(residuals_centers_normalized, theta, eps_jac, + X_mach, obs1_norm, obs2_norm) + rms = float(np.sqrt(np.mean(r*r))) if r.size else 0.0 + history["iters"].append(it) + history["rms"].append(rms) + # Normal equations with damping + JTJ = J.T @ J + g = J.T @ r + H = JTJ + lam * np.eye(JTJ.shape[0]) + try: + delta = -np.linalg.solve(H, g) + except np.linalg.LinAlgError: + # Fallback to least squares + delta, *_ = np.linalg.lstsq(H, -g, rcond=None) + theta_trial = theta + delta + r_trial = residuals_centers_normalized(theta_trial, X_mach, obs1_norm, obs2_norm) + rms_trial = float(np.sqrt(np.mean(r_trial*r_trial))) + if rms_trial < rms: # improve + theta = theta_trial + lam *= 0.5 + else: + lam *= 2.0 + # Convergence criteria + if np.linalg.norm(delta) < 1e-9 or abs(rms - rms_trial) < 1e-9: + break + return theta, history + + +# ---------------- Triangulation ---------------- + +def build_projection_matrix(K: np.ndarray, R: np.ndarray, t: np.ndarray) -> np.ndarray: + return K @ np.hstack([R, t.reshape(3,1)]) + + +def triangulate_center(P1: np.ndarray, P2: np.ndarray, u1: np.ndarray, u2: np.ndarray) -> np.ndarray: + # u1,u2: (2,) pixel coordinates + x1 = u1.reshape(2,1) + x2 = u2.reshape(2,1) + X_h = cv2.triangulatePoints(P1, P2, x1, x2) + X = (X_h[:3] / X_h[3]).reshape(3) + return X.astype(np.float32) + + +# ---------------- Main ---------------- +def main(): + print("Started") + + parser = argparse.ArgumentParser(description="Two-camera ArUco joint optimization and triangulation") + + parser.add_argument('-i', '--images', action='append', required=True, + help="Two image paths: first camera then second camera") + + parser.add_argument('-npz', '--npz', action='append', required=True, + help="Two NPZ intrinsics paths: cam1 then cam2") + + parser.add_argument('-markerSizeMM', '--markerSizeMM', type=float, default=25.0, + help="Marker side length in millimeters") + + parser.add_argument('--dict', default='DICT_4X4_250', + help="ArUco dictionary name") + + parser.add_argument('-settings', type=str, default=None, + help="Json settings file containing machine KnownMarkers") + + # ============================================================ + # NEW OPTIONAL PARAMETER (100% backward compatible) + # ============================================================ + parser.add_argument('-outDir', '--outDir', + type=str, + default=None, + help="Optional output directory") + + args = parser.parse_args() + + if len(args.images) != 2 or len(args.npz) != 2: + print("[ERROR] Provide exactly two images and two intrinsics NPZ files.") + sys.exit(1) + + img1 = cv2.imread(args.images[0]) + img2 = cv2.imread(args.images[1]) + + draw1 = img1.copy() + draw2 = img2.copy() + + h, w = draw1.shape[:2] + + drawPNG1 = np.zeros((h, w, 3), dtype=np.uint8) + drawPNG2 = np.zeros((h, w, 3), dtype=np.uint8) + + if img1 is None or img2 is None: + print("[ERROR] Cannot read one of the images.") + sys.exit(1) + + K1, D1 = load_intrinsics_npz(args.npz[0]) + K2, D2 = load_intrinsics_npz(args.npz[1]) + + # Marker 3D local geometry (square corners) + half = (args.markerSizeMM / 1000.0) / 2.0 + + obj_points = np.array([ + [-half, half, 0.0], + [ half, half, 0.0], + [ half, -half, 0.0], + [-half, -half, 0.0], + ], dtype=np.float32) + + # Read settings for machine known markers + known_markers: Dict[int, np.ndarray] = {} + + if args.settings is not None and os.path.exists(args.settings): + + with open(args.settings, 'r') as f: + settings = json.load(f) + + for marker_id, coords in settings['coordinateSystem']['KnownMarkers'].items(): + known_markers[int(marker_id)] = np.array(coords, dtype=np.float32) + + print("[INFO] Loaded KnownMarkers from settings.") + + else: + + known_markers = { + 50: np.array([0.0, 0.0, 0.0], dtype=np.float32), + 71: np.array([0.140, 0.0, 0.0], dtype=np.float32), + 101: np.array([0.0, -0.080, 0.0], dtype=np.float32), + } + + print("[WARN] Using default KnownMarkers; provide -settings for your machine.") + + # Detect markers in both images + detector_tuple = get_aruco_detector(args.dict) + + corners1, ids1, _ = detect_markers(img1, detector_tuple) + corners2, ids2, _ = detect_markers(img2, detector_tuple) + + if ids1 is None or ids2 is None: + print("[ERROR] No markers detected in one or both images.") + sys.exit(1) + + ids1 = ids1.flatten().tolist() + ids2 = ids2.flatten().tolist() + + # Neu: merken, welche Kamera welchen Marker gesehen hat + seen_by = {} + + for mid in ids1: + seen_by[mid] = seen_by.get(mid, 0) | 1 + + for mid in ids2: + seen_by[mid] = seen_by.get(mid, 0) | 2 + + # Build dicts + def build_marker_dict(img, corners_list, ids, K, D, draw=False): + + centers = {} + corners_dict = {} + poses = {} + + for i, mid in enumerate(ids): + + C = corners_list[i] + + corners_dict[int(mid)] = C + centers[int(mid)] = marker_center_from_corners(C) + + # Pose from single marker + img_pts = corners_to_image_points(C) + + success, rvec, tvec = cv2.solvePnP( + obj_points, + img_pts, + K, + D, + flags=cv2.SOLVEPNP_IPPE_SQUARE + ) + + if not success: + success, rvec, tvec = cv2.solvePnP( + obj_points, + img_pts, + K, + D + ) + + if success: + + poses[int(mid)] = ( + rvec.reshape(3,1), + tvec.reshape(3,1) + ) + + if draw: + cv2.drawFrameAxes(draw1, K, D, rvec, tvec, 0.02) + cv2.drawFrameAxes(drawPNG1, K, D, rvec, tvec, 0.02) + + return centers, corners_dict, poses + + centers1, corners_dict1, poses1 = build_marker_dict( + img1, corners1, ids1, K1, D1, draw=True + ) + + centers2, corners_dict2, poses2 = build_marker_dict( + img2, corners2, ids2, K2, D2 + ) + + # Common reference markers + common_refs = [ + mid for mid in known_markers.keys() + if (mid in centers1 and mid in centers2) + ] + + if len(common_refs) < 3: + print(f"[ERROR] Need ≥3 common reference markers in both cameras; found {len(common_refs)}: {common_refs}") + sys.exit(1) + + # Initial extrinsics + def init_extrinsics_from_rigid(poses_cam, refs): + + A = [] + B = [] + + for mid in refs: + if mid in poses_cam: + _, tvec = poses_cam[mid] + A.append(tvec.flatten()) + B.append(known_markers[mid]) + + if len(A) < 2: + raise RuntimeError("Insufficient reference poses for rigid transform init.") + + A = np.stack(A, axis=0) + B = np.stack(B, axis=0) + + R_cm, t_cm = rigid_transform_no_scale(A, B) + + R_mc = R_cm.T + t_mc = - R_mc @ t_cm + + return R_mc.astype(np.float32), t_mc.astype(np.float32) + + R1_init, t1_init = init_extrinsics_from_rigid(poses1, common_refs) + R2_init, t2_init = init_extrinsics_from_rigid(poses2, common_refs) + + # Observations + X_mach_refs = np.stack([ + known_markers[mid] for mid in common_refs + ], axis=0).astype(np.float32) + + obs1_px = np.stack([ + centers1[mid] for mid in common_refs + ], axis=0).astype(np.float32) + + obs2_px = np.stack([ + centers2[mid] for mid in common_refs + ], axis=0).astype(np.float32) + + obs1_norm = undistort_to_normalized(obs1_px, K1, D1) + obs2_norm = undistort_to_normalized(obs2_px, K2, D2) + + omega1_init = cv2.Rodrigues(R1_init)[0].reshape(3) + omega2_init = cv2.Rodrigues(R2_init)[0].reshape(3) + + theta0 = pack_params( + omega1_init, + t1_init.reshape(3), + omega2_init, + t2_init.reshape(3) + ) + + theta_opt, hist = lm_solve( + theta0, + X_mach_refs, + obs1_norm, + obs2_norm, + max_iter=60, + eps_jac=1e-6, + lambda_init=1e-3 + ) + + omega1, t1, omega2, t2 = unpack_params(theta_opt) + + R1_opt = cv2.Rodrigues(omega1)[0] + R2_opt = cv2.Rodrigues(omega2)[0] + + # Camera pose in machine coordinates + R1_cm = R1_opt.T + t1_cm = - R1_cm @ t1 + + R2_cm = R2_opt.T + t2_cm = - R2_cm @ t2 + + # Projection matrices + P1 = build_projection_matrix(K1, R1_opt, t1) + P2 = build_projection_matrix(K2, R2_opt, t2) + + # Collect markers + all_ids = set(ids1) | set(ids2) + + rows = [("id", "x_mm", "y_mm", "z_mm", "roll_deg", "pitch_deg", "yaw_deg", "seen_by")] + + marker_list = [] + + def R_to_euler_zyx(R: np.ndarray): + + yaw = float(np.degrees(np.arctan2(R[1,0], R[0,0]))) + + sp = np.sqrt(R[2,1]**2 + R[2,2]**2) + + pitch = float(np.degrees(np.arctan2(-R[2,0], sp))) + + roll = float(np.degrees(np.arctan2(R[2,1], R[2,2]))) + + return roll, pitch, yaw + + cam1_roll, cam1_pitch, cam1_yaw = R_to_euler_zyx(R1_cm) + cam2_roll, cam2_pitch, cam2_yaw = R_to_euler_zyx(R2_cm) + + c1_mm = (t1_cm * 1000.0).tolist() + + rows.append(( + "camera 0", + f"{c1_mm[0]:.2f}", + f"{c1_mm[1]:.2f}", + f"{c1_mm[2]:.2f}", + f"{cam1_roll:.3f}", + f"{cam1_pitch:.3f}", + f"{cam1_yaw:.3f}" + )) + + c2_mm = (t2_cm * 1000.0).tolist() + + rows.append(( + "camera 1", + f"{c2_mm[0]:.2f}", + f"{c2_mm[1]:.2f}", + f"{c2_mm[2]:.2f}", + f"{cam2_roll:.3f}", + f"{cam2_pitch:.3f}", + f"{cam2_yaw:.3f}" + )) + + # Triangulate and output markers + def orientation_in_machine(mid: int): + + if mid in poses1: + Rm_cam = rvec_to_R(poses1[mid][0]) + Rm_machine = R1_cm @ Rm_cam + + elif mid in poses2: + Rm_cam = rvec_to_R(poses2[mid][0]) + Rm_machine = R2_cm @ Rm_cam + + else: + Rm_machine = np.eye(3, dtype=np.float32) + + return R_to_euler_zyx(Rm_machine) + + for mid in sorted(all_ids): + + if mid in centers1 and mid in centers2: + + X_mach = triangulate_center( + P1, + P2, + centers1[mid], + centers2[mid] + ) + + elif mid in poses1: + + X_mach = ( + R1_cm @ poses1[mid][1].flatten() + t1_cm + ) + + elif mid in poses2: + + X_mach = ( + R2_cm @ poses2[mid][1].flatten() + t2_cm + ) + + else: + continue + + roll, pitch, yaw = orientation_in_machine(mid) + + x_mm, y_mm, z_mm = (X_mach * 1000.0).tolist() + + rows.append(( + mid, + f"{x_mm:.2f}", + f"{y_mm:.2f}", + f"{z_mm:.2f}", + f"{roll:.3f}", + f"{pitch:.3f}", + f"{yaw:.3f}", + seen_by.get(mid, 0) + )) + + marker_list.append({ + "id": int(mid), + "position_mm": [float(x_mm), float(y_mm), float(z_mm)], + "orientation_deg": { + "roll": float(roll), + "pitch": float(pitch), + "yaw": float(yaw) + } + }) + + # ============================================================ + # OUTPUT DIRECTORY HANDLING + # ============================================================ + + base1 = os.path.splitext(os.path.basename(args.images[0]))[0] + base2 = os.path.splitext(os.path.basename(args.images[1]))[0] + + if args.outDir is not None: + + out_dir = args.outDir + os.makedirs(out_dir, exist_ok=True) + + else: + + out_dir = os.path.dirname(args.images[0]) + + if out_dir == "": + out_dir = "." + + # Save CSV & JSON + out_csv = os.path.join(out_dir, f"{base1}_two_cam.csv") + out_json = os.path.join(out_dir, f"{base1}_two_cam.json") + + try: + import csv + + with open(out_csv, 'w', newline='') as f: + writer = csv.writer(f) + writer.writerows(rows) + + print(f"[INFO] Saved CSV poses to '{out_csv}'.") + + except Exception as e: + print(f"[WARN] Could not save CSV: {e}") + + json_data = { + "metadata": { + "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), + "reference_markers": common_refs, + "dict": args.dict, + "marker_size_mm": args.markerSizeMM, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [float(x) for x in (t1_cm * 1000.0)], + "orientation_deg": { + "roll": cam1_roll, + "pitch": cam1_pitch, + "yaw": cam1_yaw + }, + }, + { + "id": "camera2", + "position_mm": [float(x) for x in (t2_cm * 1000.0)], + "orientation_deg": { + "roll": cam2_roll, + "pitch": cam2_pitch, + "yaw": cam2_yaw + }, + } + ], + "markers": marker_list + } + + try: + + with open(out_json, 'w', encoding='utf-8') as f: + json.dump(json_data, f, indent=4) + + print(f"[INFO] Saved JSON poses to '{out_json}'.") + + except Exception as e: + print(f"[WARN] Could not save JSON: {e}") + + # Annotate images with machine axes using camera1 extrinsics + try: + + R_machine_to_cam1 = R1_opt + t_machine_to_cam1 = t1 + + machine_axes = np.float32([ + [0.0, 0.0, 0.0], + [0.200, 0.0, 0.0], + [0.0, -0.100, 0.0], + [0.0, 0.0, 0.100], + ]) + + rvec_global, _ = cv2.Rodrigues(R_machine_to_cam1) + + imgpts, _ = cv2.projectPoints( + machine_axes, + rvec_global, + t_machine_to_cam1, + K1, + D1 + ) + + origin = tuple(np.round(imgpts[0].ravel()).astype(int)) + x_end = tuple(np.round(imgpts[1].ravel()).astype(int)) + y_end = tuple(np.round(imgpts[2].ravel()).astype(int)) + z_end = tuple(np.round(imgpts[3].ravel()).astype(int)) + + cv2.aruco.drawDetectedMarkers(draw1, corners1) + cv2.aruco.drawDetectedMarkers(drawPNG1, corners1) + + try: + for i, mid in enumerate(ids1): + + try: + pts = corners1[i].reshape((4, 2)) + center = tuple(np.round(pts.mean(axis=0)).astype(int)) + except Exception: + continue + + text = str(int(mid)) + + pos = ( + int(center[0]) + 15, + int(center[1]) - 15 + ) + + cv2.putText( + draw1, + text, + pos, + cv2.FONT_HERSHEY_SIMPLEX, + 1.0, + (255,0,0), + 3, + lineType=cv2.LINE_AA + ) + + cv2.putText( + drawPNG1, + text, + pos, + cv2.FONT_HERSHEY_SIMPLEX, + 1.0, + (255,0,0,255), + 3, + lineType=cv2.LINE_AA + ) + + except Exception: + pass + + cv2.line(draw1, origin, x_end, (0,0,255), 3) + cv2.line(draw1, origin, y_end, (0,255,0), 3) + cv2.line(draw1, origin, z_end, (255,0,0), 3) + + cv2.line(drawPNG1, origin, x_end, (0,0,255,255), 3) + cv2.line(drawPNG1, origin, y_end, (0,255,0,255), 3) + cv2.line(drawPNG1, origin, z_end, (255,0,0,255), 3) + + cv2.putText(draw1, "X (200 mm)", x_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 2) + cv2.putText(draw1, "Y (-100 mm)", y_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2) + cv2.putText(draw1, "+Z (100 mm)", z_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0), 2) + + cv2.putText(drawPNG1, "X (200 mm)", x_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255,255), 2) + cv2.putText(drawPNG1, "Y (-100 mm)", y_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0,255), 2) + cv2.putText(drawPNG1, "+Z (100 mm)", z_end, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0,255), 2) + + out_img1 = os.path.join(out_dir, f"{base1}_two_cam_annotated.jpg") + + cv2.imwrite(out_img1, draw1) + + print(f"[INFO] Annotated image saved as '{out_img1}'.") + + gray = cv2.cvtColor(drawPNG1, cv2.COLOR_BGR2GRAY) + + _, alpha = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY) + + drawPNG_1 = cv2.merge([ + drawPNG1[:, :, 0], + drawPNG1[:, :, 1], + drawPNG1[:, :, 2], + alpha + ]) + + out_png1 = os.path.join(out_dir, f"{base1}_two_cam_overlay.png") + + cv2.imwrite(out_png1, drawPNG_1) + + except Exception as e: + print(f"[WARN] Failed to draw machine axes: {e}") + + # Camera 2 overlay + try: + + machine_axes2 = np.float32([ + [0.0, 0.0, 0.0], + [0.200, 0.0, 0.0], + [0.0, -0.100, 0.0], + [0.0, 0.0, 0.100], + ]) + + rvec_global2, _ = cv2.Rodrigues(R2_opt) + + imgpts2, _ = cv2.projectPoints( + machine_axes2, + rvec_global2, + t2, + K2, + D2 + ) + + origin2 = tuple(np.round(imgpts2[0].ravel()).astype(int)) + x_end2 = tuple(np.round(imgpts2[1].ravel()).astype(int)) + y_end2 = tuple(np.round(imgpts2[2].ravel()).astype(int)) + z_end2 = tuple(np.round(imgpts2[3].ravel()).astype(int)) + + cv2.aruco.drawDetectedMarkers(draw2, corners2) + cv2.aruco.drawDetectedMarkers(drawPNG2, corners2) + + try: + for i, mid in enumerate(ids2): + + try: + pts = corners2[i].reshape((4, 2)) + center = tuple(np.round(pts.mean(axis=0)).astype(int)) + except Exception: + continue + + text = str(int(mid)) + + pos = ( + int(center[0]) + 13, + int(center[1]) + 3 + ) + + cv2.putText( + draw2, + text, + pos, + cv2.FONT_HERSHEY_SIMPLEX, + 1.0, + (255,0,0), + 3, + lineType=cv2.LINE_AA + ) + + cv2.putText( + drawPNG2, + text, + pos, + cv2.FONT_HERSHEY_SIMPLEX, + 1.0, + (255,0,0,255), + 3, + lineType=cv2.LINE_AA + ) + + except Exception: + pass + + cv2.line(draw2, origin2, x_end2, (0,0,255), 3) + cv2.line(draw2, origin2, y_end2, (0,255,0), 3) + cv2.line(draw2, origin2, z_end2, (255,0,0), 3) + + cv2.line(drawPNG2, origin2, x_end2, (0,0,255,255), 3) + cv2.line(drawPNG2, origin2, y_end2, (0,255,0,255), 3) + cv2.line(drawPNG2, origin2, z_end2, (255,0,0,255), 3) + + cv2.putText(draw2, "X (200 mm)", x_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255), 2) + cv2.putText(draw2, "Y (-100 mm)", y_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2) + cv2.putText(draw2, "+Z (100 mm)", z_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0), 2) + + cv2.putText(drawPNG2, "X (200 mm)", x_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,0,255,255), 2) + cv2.putText(drawPNG2, "Y (-100 mm)", y_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0,255), 2) + cv2.putText(drawPNG2, "+Z (100 mm)", z_end2, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0,255), 2) + + out_img2 = os.path.join(out_dir, f"{base2}_two_cam_annotated.jpg") + + cv2.imwrite(out_img2, draw2) + + print(f"[INFO] Annotated image saved as '{out_img2}'.") + + gray2 = cv2.cvtColor(drawPNG2, cv2.COLOR_BGR2GRAY) + + _, alpha2 = cv2.threshold(gray2, 0, 255, cv2.THRESH_BINARY) + + drawPNG_2 = cv2.merge([ + drawPNG2[:, :, 0], + drawPNG2[:, :, 1], + drawPNG2[:, :, 2], + alpha2 + ]) + + out_png2 = os.path.join(out_dir, f"{base2}_two_cam_overlay.png") + + cv2.imwrite(out_png2, drawPNG_2) + + print(f"[INFO] Overlay PNG saved as '{out_png2}'.") + + except Exception as e: + print(f"[WARN] Failed to draw machine axes for camera2: {e}") + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/pipeline/render_2d.png b/pipeline/render_2d.png new file mode 100644 index 0000000..9744dec Binary files /dev/null and b/pipeline/render_2d.png differ diff --git a/pipeline/render_3a.png b/pipeline/render_3a.png new file mode 100644 index 0000000..822b8c8 Binary files /dev/null and b/pipeline/render_3a.png differ diff --git a/pipeline/render_3a_aruco_detection.json b/pipeline/render_3a_aruco_detection.json new file mode 100644 index 0000000..3d4660a --- /dev/null +++ b/pipeline/render_3a_aruco_detection.json @@ -0,0 +1,20116 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-29T05:34:15Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3a.png", + "image_sha256": "ea12672f414fee3cd0aa08f9436c0d89285b49cfde7b5951e821f5548118f462", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 10, + "num_rejected_candidates": 781 + }, + "detections": [ + { + "observation_id": "8c42df77-c894-4ea1-8d70-bc7242ec953b", + "type": "aruco", + "marker_id": 124, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 818.0, + 561.0 + ], + [ + 796.0, + 509.0 + ], + [ + 836.0, + 506.0 + ], + [ + 858.0, + 560.0 + ] + ], + "center_px": [ + 827.0, + 534.0 + ], + "quality": { + "area_px": 2164.0, + "perimeter_px": 194.89673614501953, + "sharpness": { + "laplacian_var": 2315.6281400846624 + }, + "contrast": { + "p05": 30.0, + "p95": 176.0, + "dynamic_range": 146.0, + "mean_gray": 91.60564349621473, + "std_gray": 66.54129028621855 + }, + "geometry": { + "distance_to_center_norm": 0.3478553593158722, + "distance_to_border_px": 159.0 + }, + "edge_ratio": 1.4572827283651233, + "edge_lengths_px": [ + 56.46237564086914, + 40.112342834472656, + 58.30952072143555, + 40.01249694824219 + ] + }, + "confidence": 0.6862086405991146 + }, + { + "observation_id": "549a7c31-573c-47d5-906d-2abdaf0e2163", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 467.0, + 579.0 + ], + [ + 509.0, + 563.0 + ], + [ + 512.0, + 609.0 + ], + [ + 471.0, + 625.0 + ] + ], + "center_px": [ + 489.75, + 594.0 + ], + "quality": { + "area_px": 1965.0, + "perimeter_px": 181.22707748413086, + "sharpness": { + "laplacian_var": 1961.2610813091912 + }, + "contrast": { + "p05": 24.0, + "p95": 187.0, + "dynamic_range": 163.0, + "mean_gray": 79.11764705882354, + "std_gray": 72.0414120005347 + }, + "geometry": { + "distance_to_center_norm": 0.3787058889865875, + "distance_to_border_px": 95.0 + }, + "edge_ratio": 1.0491286750860145, + "edge_lengths_px": [ + 44.94440841674805, + 46.097721099853516, + 44.0113639831543, + 46.173583984375 + ] + }, + "confidence": 0.953171926139578 + }, + { + "observation_id": "c4fc6e32-92a6-499d-b09d-9d1d88ced7c0", + "type": "aruco", + "marker_id": 122, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 667.0, + 567.0 + ], + [ + 647.0, + 520.0 + ], + [ + 678.0, + 518.0 + ], + [ + 698.0, + 566.0 + ] + ], + "center_px": [ + 672.5, + 542.75 + ], + "quality": { + "area_px": 1502.5, + "perimeter_px": 165.1589469909668, + "sharpness": { + "laplacian_var": 1910.8717480611394 + }, + "contrast": { + "p05": 33.0, + "p95": 173.0, + "dynamic_range": 140.0, + "mean_gray": 74.66567754698319, + "std_gray": 58.78779588162887 + }, + "geometry": { + "distance_to_center_norm": 0.25278058648109436, + "distance_to_border_px": 153.0 + }, + "edge_ratio": 1.6765472946887294, + "edge_lengths_px": [ + 51.078372955322266, + 31.064449310302734, + 52.0, + 31.016124725341797 + ] + }, + "confidence": 0.5964639370258038 + }, + { + "observation_id": "4462ae69-6f30-4281-9ace-bc8cac13cb07", + "type": "aruco", + "marker_id": 102, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 808.0, + 586.0 + ], + [ + 768.0, + 570.0 + ], + [ + 805.0, + 569.0 + ], + [ + 845.0, + 586.0 + ] + ], + "center_px": [ + 806.5, + 577.75 + ], + "quality": { + "area_px": 630.5, + "perimeter_px": 160.55745697021484, + "sharpness": { + "laplacian_var": 2755.0610059080664 + }, + "contrast": { + "p05": 47.0, + "p95": 155.0, + "dynamic_range": 108.0, + "mean_gray": 100.49380165289256, + "std_gray": 43.72450807280275 + }, + "geometry": { + "distance_to_center_norm": 0.3732956051826477, + "distance_to_border_px": 134.0 + }, + "edge_ratio": 1.1746656056996938, + "edge_lengths_px": [ + 43.08131790161133, + 37.013511657714844, + 43.46262741088867, + 37.0 + ] + }, + "confidence": 0.3578323322772018 + }, + { + "observation_id": "233fe57c-1886-4fce-914e-d6656f706474", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 409.0, + 506.0 + ], + [ + 449.0, + 492.0 + ], + [ + 478.0, + 505.0 + ], + [ + 437.0, + 519.0 + ] + ], + "center_px": [ + 443.25, + 505.5 + ], + "quality": { + "area_px": 925.5, + "perimeter_px": 148.35479736328125, + "sharpness": { + "laplacian_var": 2947.1509397720174 + }, + "contrast": { + "p05": 14.0, + "p95": 174.0, + "dynamic_range": 160.0, + "mean_gray": 61.38484398216939, + "std_gray": 65.54307732894694 + }, + "geometry": { + "distance_to_center_norm": 0.3332490622997284, + "distance_to_border_px": 201.0 + }, + "edge_ratio": 1.4034136380804192, + "edge_lengths_px": [ + 42.379241943359375, + 31.78049659729004, + 43.32435989379883, + 30.870698928833008 + ] + }, + "confidence": 0.4396423002158715 + }, + { + "observation_id": "cfdcf058-d469-4ba1-92bf-b86c9ae9c486", + "type": "aruco", + "marker_id": 210, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 135.0, + 673.0 + ], + [ + 178.0, + 658.0 + ], + [ + 198.0, + 676.0 + ], + [ + 154.0, + 692.0 + ] + ], + "center_px": [ + 166.25, + 674.75 + ], + "quality": { + "area_px": 1107.0, + "perimeter_px": 146.1372947692871, + "sharpness": { + "laplacian_var": 3519.270678650749 + }, + "contrast": { + "p05": 20.0, + "p95": 182.0, + "dynamic_range": 162.0, + "mean_gray": 83.0107238605898, + "std_gray": 67.90704806736937 + }, + "geometry": { + "distance_to_center_norm": 0.7745806574821472, + "distance_to_border_px": 28.0 + }, + "edge_ratio": 1.7424152177556382, + "edge_lengths_px": [ + 45.54119110107422, + 26.90724754333496, + 46.81879806518555, + 26.870058059692383 + ] + }, + "confidence": 0.23718801109435655 + }, + { + "observation_id": "7908f25a-83ca-43b4-a7e9-17a6b3dd00d6", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 316.0, + 457.0 + ], + [ + 358.0, + 446.0 + ], + [ + 380.0, + 457.0 + ], + [ + 339.0, + 469.0 + ] + ], + "center_px": [ + 348.25, + 457.25 + ], + "quality": { + "area_px": 736.0, + "perimeter_px": 136.67560005187988, + "sharpness": { + "laplacian_var": 5002.317631114374 + }, + "contrast": { + "p05": 15.0, + "p95": 173.0, + "dynamic_range": 158.0, + "mean_gray": 83.1501976284585, + "std_gray": 66.25404134112945 + }, + "geometry": { + "distance_to_center_norm": 0.418807715177536, + "distance_to_border_px": 251.0 + }, + "edge_ratio": 1.7651352613025346, + "edge_lengths_px": [ + 43.416587829589844, + 24.59674835205078, + 42.72002029418945, + 25.942243576049805 + ] + }, + "confidence": 0.27797680859006363 + }, + { + "observation_id": "70f6536d-4ec4-4681-bf8b-855004a93f19", + "type": "aruco", + "marker_id": 205, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1103.0, + 377.0 + ], + [ + 1125.0, + 370.0 + ], + [ + 1150.0, + 379.0 + ], + [ + 1130.0, + 387.0 + ] + ], + "center_px": [ + 1127.0, + 378.25 + ], + "quality": { + "area_px": 394.5, + "perimeter_px": 99.99047088623047, + "sharpness": { + "laplacian_var": 5758.022160664819 + }, + "contrast": { + "p05": 14.0, + "p95": 160.84999999999997, + "dynamic_range": 146.84999999999997, + "mean_gray": 72.40460526315789, + "std_gray": 57.347372764600806 + }, + "geometry": { + "distance_to_center_norm": 0.6636800169944763, + "distance_to_border_px": 130.0 + }, + "edge_ratio": 1.3366517882086073, + "edge_lengths_px": [ + 23.0867919921875, + 26.570659637451172, + 21.540658950805664, + 28.792360305786133 + ] + }, + "confidence": 0.19676029488014599 + }, + { + "observation_id": "46c80ca9-5820-4672-8b09-34c7d7d2051f", + "type": "aruco", + "marker_id": 206, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 930.0, + 378.0 + ], + [ + 953.0, + 371.0 + ], + [ + 977.0, + 380.0 + ], + [ + 953.0, + 387.0 + ] + ], + "center_px": [ + 953.25, + 379.0 + ], + "quality": { + "area_px": 376.0, + "perimeter_px": 99.37181854248047, + "sharpness": { + "laplacian_var": 4500.247946109835 + }, + "contrast": { + "p05": 12.0, + "p95": 162.75, + "dynamic_range": 150.75, + "mean_gray": 69.8006993006993, + "std_gray": 57.089784515397106 + }, + "geometry": { + "distance_to_center_norm": 0.4273793697357178, + "distance_to_border_px": 303.0 + }, + "edge_ratio": 1.066151156811034, + "edge_lengths_px": [ + 24.041629791259766, + 25.63201141357422, + 25.0, + 24.698177337646484 + ] + }, + "confidence": 0.23511362818048806 + }, + { + "observation_id": "66327b90-f891-4c45-9a90-e469527a527d", + "type": "aruco", + "marker_id": 207, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1018.0, + 347.0 + ], + [ + 1038.0, + 340.0 + ], + [ + 1062.0, + 349.0 + ], + [ + 1040.0, + 355.0 + ] + ], + "center_px": [ + 1039.5, + 347.75 + ], + "quality": { + "area_px": 328.0, + "perimeter_px": 93.0345401763916, + "sharpness": { + "laplacian_var": 4149.013344439817 + }, + "contrast": { + "p05": 14.0, + "p95": 158.79999999999998, + "dynamic_range": 144.79999999999998, + "mean_gray": 68.73061224489796, + "std_gray": 56.85772506551027 + }, + "geometry": { + "distance_to_center_norm": 0.5443095564842224, + "distance_to_border_px": 218.0 + }, + "edge_ratio": 1.2096493584208923, + "edge_lengths_px": [ + 21.189620971679688, + 25.63201141357422, + 22.803508758544922, + 23.409399032592773 + ] + }, + "confidence": 0.18076863774153512 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 356.0, + 246.0 + ], + [ + 300.0, + 318.0 + ], + [ + 271.0, + 317.0 + ], + [ + 331.0, + 245.0 + ] + ], + "center_px": [ + 314.5, + 281.5 + ], + "area_px": 2002.0 + }, + { + "image_points_px": [ + [ + 623.0, + 172.0 + ], + [ + 599.0, + 235.0 + ], + [ + 575.0, + 235.0 + ], + [ + 601.0, + 171.0 + ] + ], + "center_px": [ + 599.5, + 203.25 + ], + "area_px": 1473.0 + }, + { + "image_points_px": [ + [ + 382.0, + 180.0 + ], + [ + 342.0, + 227.0 + ], + [ + 318.0, + 227.0 + ], + [ + 360.0, + 179.0 + ] + ], + "center_px": [ + 350.5, + 203.25 + ], + "area_px": 1113.0 + }, + { + "image_points_px": [ + [ + 835.0, + 424.0 + ], + [ + 797.0, + 448.0 + ], + [ + 761.0, + 452.0 + ], + [ + 797.0, + 429.0 + ] + ], + "center_px": [ + 797.5, + 438.25 + ], + "area_px": 703.0 + }, + { + "image_points_px": [ + [ + 386.0, + 145.0 + ], + [ + 348.0, + 187.0 + ], + [ + 327.0, + 186.0 + ], + [ + 366.0, + 145.0 + ] + ], + "center_px": [ + 356.75, + 165.75 + ], + "area_px": 870.0 + }, + { + "image_points_px": [ + [ + 299.0, + 369.0 + ], + [ + 355.0, + 365.0 + ], + [ + 367.0, + 371.0 + ], + [ + 310.0, + 375.0 + ] + ], + "center_px": [ + 332.75, + 370.0 + ], + "area_px": 385.0 + }, + { + "image_points_px": [ + [ + 533.0, + 326.0 + ], + [ + 584.0, + 323.0 + ], + [ + 597.0, + 328.0 + ], + [ + 544.0, + 331.0 + ] + ], + "center_px": [ + 564.5, + 327.0 + ], + "area_px": 296.0 + }, + { + "image_points_px": [ + [ + 836.0, + 313.0 + ], + [ + 885.0, + 310.0 + ], + [ + 900.0, + 315.0 + ], + [ + 851.0, + 318.0 + ] + ], + "center_px": [ + 868.0, + 314.0 + ], + "area_px": 290.0 + }, + { + "image_points_px": [ + [ + 900.0, + 293.0 + ], + [ + 947.0, + 290.0 + ], + [ + 962.0, + 295.0 + ], + [ + 916.0, + 298.0 + ] + ], + "center_px": [ + 931.25, + 294.0 + ], + "area_px": 279.0 + }, + { + "image_points_px": [ + [ + 15.0, + 308.0 + ], + [ + 68.0, + 305.0 + ], + [ + 76.0, + 310.0 + ], + [ + 22.0, + 313.0 + ] + ], + "center_px": [ + 45.25, + 309.0 + ], + "area_px": 290.0 + }, + { + "image_points_px": [ + [ + 484.0, + 290.0 + ], + [ + 533.0, + 287.0 + ], + [ + 545.0, + 292.0 + ], + [ + 496.0, + 295.0 + ] + ], + "center_px": [ + 514.5, + 291.0 + ], + "area_px": 281.0 + }, + { + "image_points_px": [ + [ + 342.0, + 701.0 + ], + [ + 309.0, + 714.0 + ], + [ + 291.0, + 698.0 + ], + [ + 323.0, + 685.0 + ] + ], + "center_px": [ + 316.25, + 699.5 + ], + "area_px": 760.5 + }, + { + "image_points_px": [ + [ + 24.0, + 275.0 + ], + [ + 76.0, + 273.0 + ], + [ + 82.0, + 277.0 + ], + [ + 31.0, + 279.0 + ] + ], + "center_px": [ + 53.25, + 276.0 + ], + "area_px": 219.0 + }, + { + "image_points_px": [ + [ + 381.0, + 256.0 + ], + [ + 429.0, + 254.0 + ], + [ + 439.0, + 258.0 + ], + [ + 390.0, + 260.0 + ] + ], + "center_px": [ + 409.75, + 257.0 + ], + "area_px": 213.0 + }, + { + "image_points_px": [ + [ + 865.0, + 252.0 + ], + [ + 912.0, + 250.0 + ], + [ + 923.0, + 254.0 + ], + [ + 878.0, + 256.0 + ] + ], + "center_px": [ + 894.5, + 253.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 539.0, + 242.0 + ], + [ + 585.0, + 240.0 + ], + [ + 596.0, + 244.0 + ], + [ + 550.0, + 246.0 + ] + ], + "center_px": [ + 567.5, + 243.0 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 746.0, + 248.0 + ], + [ + 790.0, + 246.0 + ], + [ + 803.0, + 250.0 + ], + [ + 757.0, + 252.0 + ] + ], + "center_px": [ + 774.0, + 249.0 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 776.0, + 240.0 + ], + [ + 819.0, + 238.0 + ], + [ + 833.0, + 242.0 + ], + [ + 790.0, + 244.0 + ] + ], + "center_px": [ + 804.5, + 241.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 945.0, + 690.0 + ], + [ + 970.0, + 679.0 + ], + [ + 996.0, + 693.0 + ], + [ + 971.0, + 704.0 + ] + ], + "center_px": [ + 970.5, + 691.5 + ], + "area_px": 636.0 + }, + { + "image_points_px": [ + [ + 578.0, + 699.0 + ], + [ + 548.0, + 711.0 + ], + [ + 528.0, + 696.0 + ], + [ + 557.0, + 685.0 + ] + ], + "center_px": [ + 552.75, + 697.75 + ], + "area_px": 663.5 + }, + { + "image_points_px": [ + [ + 53.0, + 700.0 + ], + [ + 18.0, + 712.0 + ], + [ + 5.0, + 697.0 + ], + [ + 39.0, + 685.0 + ] + ], + "center_px": [ + 28.75, + 698.5 + ], + "area_px": 679.5 + }, + { + "image_points_px": [ + [ + 893.0, + 687.0 + ], + [ + 917.0, + 676.0 + ], + [ + 943.0, + 690.0 + ], + [ + 919.0, + 702.0 + ] + ], + "center_px": [ + 918.0, + 688.75 + ], + "area_px": 647.0 + }, + { + "image_points_px": [ + [ + 998.0, + 693.0 + ], + [ + 1021.0, + 681.0 + ], + [ + 1048.0, + 696.0 + ], + [ + 1024.0, + 707.0 + ] + ], + "center_px": [ + 1022.75, + 694.25 + ], + "area_px": 645.5 + }, + { + "image_points_px": [ + [ + 1051.0, + 695.0 + ], + [ + 1073.0, + 684.0 + ], + [ + 1101.0, + 698.0 + ], + [ + 1078.0, + 710.0 + ] + ], + "center_px": [ + 1075.75, + 696.75 + ], + "area_px": 642.5 + }, + { + "image_points_px": [ + [ + 629.0, + 702.0 + ], + [ + 601.0, + 714.0 + ], + [ + 580.0, + 699.0 + ], + [ + 607.0, + 687.0 + ] + ], + "center_px": [ + 604.25, + 700.5 + ], + "area_px": 670.5 + }, + { + "image_points_px": [ + [ + 841.0, + 685.0 + ], + [ + 867.0, + 674.0 + ], + [ + 891.0, + 687.0 + ], + [ + 866.0, + 699.0 + ] + ], + "center_px": [ + 866.25, + 686.25 + ], + "area_px": 626.0 + }, + { + "image_points_px": [ + [ + 1096.0, + 670.0 + ], + [ + 1118.0, + 660.0 + ], + [ + 1146.0, + 673.0 + ], + [ + 1125.0, + 685.0 + ] + ], + "center_px": [ + 1121.25, + 672.0 + ], + "area_px": 614.5 + }, + { + "image_points_px": [ + [ + 1200.0, + 676.0 + ], + [ + 1221.0, + 665.0 + ], + [ + 1250.0, + 679.0 + ], + [ + 1230.0, + 690.0 + ] + ], + "center_px": [ + 1225.25, + 677.5 + ], + "area_px": 611.5 + }, + { + "image_points_px": [ + [ + 1148.0, + 673.0 + ], + [ + 1168.0, + 662.0 + ], + [ + 1198.0, + 676.0 + ], + [ + 1177.0, + 687.0 + ] + ], + "center_px": [ + 1172.75, + 674.5 + ], + "area_px": 611.5 + }, + { + "image_points_px": [ + [ + 1044.0, + 668.0 + ], + [ + 1067.0, + 657.0 + ], + [ + 1094.0, + 671.0 + ], + [ + 1072.0, + 682.0 + ] + ], + "center_px": [ + 1069.25, + 669.5 + ], + "area_px": 617.5 + }, + { + "image_points_px": [ + [ + 309.0, + 235.0 + ], + [ + 355.0, + 233.0 + ], + [ + 364.0, + 237.0 + ], + [ + 318.0, + 239.0 + ] + ], + "center_px": [ + 336.5, + 236.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 482.0, + 240.0 + ], + [ + 526.0, + 238.0 + ], + [ + 537.0, + 242.0 + ], + [ + 491.0, + 244.0 + ] + ], + "center_px": [ + 509.0, + 241.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 864.0, + 225.0 + ], + [ + 905.0, + 223.0 + ], + [ + 919.0, + 227.0 + ], + [ + 877.0, + 229.0 + ] + ], + "center_px": [ + 891.25, + 226.0 + ], + "area_px": 193.0 + }, + { + "image_points_px": [ + [ + 635.0, + 674.0 + ], + [ + 606.0, + 685.0 + ], + [ + 586.0, + 671.0 + ], + [ + 613.0, + 660.0 + ] + ], + "center_px": [ + 610.0, + 672.5 + ], + "area_px": 623.0 + }, + { + "image_points_px": [ + [ + 687.0, + 677.0 + ], + [ + 715.0, + 666.0 + ], + [ + 736.0, + 679.0 + ], + [ + 710.0, + 691.0 + ] + ], + "center_px": [ + 712.0, + 678.25 + ], + "area_px": 617.5 + }, + { + "image_points_px": [ + [ + 739.0, + 679.0 + ], + [ + 764.0, + 668.0 + ], + [ + 788.0, + 682.0 + ], + [ + 761.0, + 693.0 + ] + ], + "center_px": [ + 763.0, + 680.5 + ], + "area_px": 617.0 + }, + { + "image_points_px": [ + [ + 790.0, + 682.0 + ], + [ + 816.0, + 671.0 + ], + [ + 839.0, + 685.0 + ], + [ + 813.0, + 696.0 + ] + ], + "center_px": [ + 814.5, + 683.5 + ], + "area_px": 617.0 + }, + { + "image_points_px": [ + [ + 891.0, + 660.0 + ], + [ + 916.0, + 650.0 + ], + [ + 940.0, + 663.0 + ], + [ + 916.0, + 674.0 + ] + ], + "center_px": [ + 915.75, + 661.75 + ], + "area_px": 588.0 + }, + { + "image_points_px": [ + [ + 942.0, + 663.0 + ], + [ + 965.0, + 652.0 + ], + [ + 991.0, + 666.0 + ], + [ + 967.0, + 676.0 + ] + ], + "center_px": [ + 966.25, + 664.25 + ], + "area_px": 585.0 + }, + { + "image_points_px": [ + [ + 1190.0, + 649.0 + ], + [ + 1210.0, + 639.0 + ], + [ + 1239.0, + 652.0 + ], + [ + 1220.0, + 663.0 + ] + ], + "center_px": [ + 1214.75, + 650.75 + ], + "area_px": 573.0 + }, + { + "image_points_px": [ + [ + 685.0, + 677.0 + ], + [ + 658.0, + 688.0 + ], + [ + 637.0, + 674.0 + ], + [ + 663.0, + 663.0 + ] + ], + "center_px": [ + 660.75, + 675.5 + ], + "area_px": 607.5 + }, + { + "image_points_px": [ + [ + 1139.0, + 647.0 + ], + [ + 1161.0, + 637.0 + ], + [ + 1188.0, + 650.0 + ], + [ + 1167.0, + 660.0 + ] + ], + "center_px": [ + 1163.75, + 648.5 + ], + "area_px": 554.5 + }, + { + "image_points_px": [ + [ + 73.0, + 672.0 + ], + [ + 39.0, + 683.0 + ], + [ + 26.0, + 670.0 + ], + [ + 60.0, + 659.0 + ] + ], + "center_px": [ + 49.5, + 671.0 + ], + "area_px": 585.0 + }, + { + "image_points_px": [ + [ + 689.0, + 650.0 + ], + [ + 663.0, + 661.0 + ], + [ + 641.0, + 648.0 + ], + [ + 668.0, + 637.0 + ] + ], + "center_px": [ + 665.25, + 649.0 + ], + "area_px": 581.0 + }, + { + "image_points_px": [ + [ + 464.0, + 222.0 + ], + [ + 507.0, + 220.0 + ], + [ + 517.0, + 224.0 + ], + [ + 474.0, + 226.0 + ] + ], + "center_px": [ + 490.5, + 223.0 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 1159.0, + 701.0 + ], + [ + 1179.0, + 690.0 + ], + [ + 1206.0, + 704.0 + ], + [ + 1187.0, + 716.0 + ] + ], + "center_px": [ + 1182.75, + 702.75 + ], + "area_px": 599.0 + }, + { + "image_points_px": [ + [ + 1105.0, + 698.0 + ], + [ + 1126.0, + 687.0 + ], + [ + 1152.0, + 701.0 + ], + [ + 1133.0, + 713.0 + ] + ], + "center_px": [ + 1129.0, + 699.75 + ], + "area_px": 600.5 + }, + { + "image_points_px": [ + [ + 841.0, + 658.0 + ], + [ + 865.0, + 647.0 + ], + [ + 889.0, + 660.0 + ], + [ + 864.0, + 671.0 + ] + ], + "center_px": [ + 864.75, + 659.0 + ], + "area_px": 577.0 + }, + { + "image_points_px": [ + [ + 994.0, + 665.0 + ], + [ + 1017.0, + 655.0 + ], + [ + 1042.0, + 668.0 + ], + [ + 1019.0, + 679.0 + ] + ], + "center_px": [ + 1018.0, + 666.75 + ], + "area_px": 573.0 + }, + { + "image_points_px": [ + [ + 102.0, + 702.0 + ], + [ + 69.0, + 714.0 + ], + [ + 56.0, + 701.0 + ], + [ + 89.0, + 689.0 + ] + ], + "center_px": [ + 79.0, + 701.5 + ], + "area_px": 585.0 + }, + { + "image_points_px": [ + [ + 989.0, + 639.0 + ], + [ + 1011.0, + 629.0 + ], + [ + 1037.0, + 642.0 + ], + [ + 1013.0, + 652.0 + ] + ], + "center_px": [ + 1012.5, + 640.5 + ], + "area_px": 549.0 + }, + { + "image_points_px": [ + [ + 1039.0, + 642.0 + ], + [ + 1061.0, + 632.0 + ], + [ + 1087.0, + 645.0 + ], + [ + 1065.0, + 655.0 + ] + ], + "center_px": [ + 1063.0, + 643.5 + ], + "area_px": 546.0 + }, + { + "image_points_px": [ + [ + 1089.0, + 644.0 + ], + [ + 1110.0, + 634.0 + ], + [ + 1137.0, + 647.0 + ], + [ + 1115.0, + 657.0 + ] + ], + "center_px": [ + 1112.75, + 645.5 + ], + "area_px": 544.5 + }, + { + "image_points_px": [ + [ + 691.0, + 650.0 + ], + [ + 717.0, + 640.0 + ], + [ + 738.0, + 653.0 + ], + [ + 712.0, + 663.0 + ] + ], + "center_px": [ + 714.5, + 651.5 + ], + "area_px": 548.0 + }, + { + "image_points_px": [ + [ + 939.0, + 637.0 + ], + [ + 962.0, + 627.0 + ], + [ + 986.0, + 640.0 + ], + [ + 964.0, + 650.0 + ] + ], + "center_px": [ + 962.75, + 638.5 + ], + "area_px": 537.5 + }, + { + "image_points_px": [ + [ + 890.0, + 634.0 + ], + [ + 914.0, + 625.0 + ], + [ + 937.0, + 637.0 + ], + [ + 913.0, + 647.0 + ] + ], + "center_px": [ + 913.5, + 635.75 + ], + "area_px": 518.5 + }, + { + "image_points_px": [ + [ + 791.0, + 630.0 + ], + [ + 816.0, + 620.0 + ], + [ + 838.0, + 632.0 + ], + [ + 813.0, + 642.0 + ] + ], + "center_px": [ + 814.5, + 631.0 + ], + "area_px": 520.0 + }, + { + "image_points_px": [ + [ + 1181.0, + 624.0 + ], + [ + 1203.0, + 615.0 + ], + [ + 1228.0, + 627.0 + ], + [ + 1209.0, + 637.0 + ] + ], + "center_px": [ + 1205.25, + 625.75 + ], + "area_px": 508.0 + }, + { + "image_points_px": [ + [ + 1083.0, + 619.0 + ], + [ + 1104.0, + 610.0 + ], + [ + 1130.0, + 622.0 + ], + [ + 1109.0, + 632.0 + ] + ], + "center_px": [ + 1106.5, + 620.75 + ], + "area_px": 509.5 + }, + { + "image_points_px": [ + [ + 1132.0, + 622.0 + ], + [ + 1152.0, + 612.0 + ], + [ + 1179.0, + 624.0 + ], + [ + 1158.0, + 634.0 + ] + ], + "center_px": [ + 1155.25, + 623.0 + ], + "area_px": 511.0 + }, + { + "image_points_px": [ + [ + 985.0, + 615.0 + ], + [ + 1006.0, + 605.0 + ], + [ + 1032.0, + 617.0 + ], + [ + 1010.0, + 627.0 + ] + ], + "center_px": [ + 1008.25, + 616.0 + ], + "area_px": 513.0 + }, + { + "image_points_px": [ + [ + 789.0, + 630.0 + ], + [ + 765.0, + 640.0 + ], + [ + 743.0, + 627.0 + ], + [ + 767.0, + 617.0 + ] + ], + "center_px": [ + 766.0, + 628.5 + ], + "area_px": 532.0 + }, + { + "image_points_px": [ + [ + 841.0, + 632.0 + ], + [ + 864.0, + 622.0 + ], + [ + 887.0, + 635.0 + ], + [ + 864.0, + 645.0 + ] + ], + "center_px": [ + 864.0, + 633.5 + ], + "area_px": 529.0 + }, + { + "image_points_px": [ + [ + 1172.0, + 600.0 + ], + [ + 1192.0, + 591.0 + ], + [ + 1219.0, + 603.0 + ], + [ + 1198.0, + 612.0 + ] + ], + "center_px": [ + 1195.25, + 601.5 + ], + "area_px": 484.5 + }, + { + "image_points_px": [ + [ + 740.0, + 628.0 + ], + [ + 715.0, + 637.0 + ], + [ + 694.0, + 625.0 + ], + [ + 719.0, + 615.0 + ] + ], + "center_px": [ + 717.0, + 626.25 + ], + "area_px": 512.0 + }, + { + "image_points_px": [ + [ + 937.0, + 612.0 + ], + [ + 959.0, + 603.0 + ], + [ + 983.0, + 615.0 + ], + [ + 961.0, + 625.0 + ] + ], + "center_px": [ + 960.0, + 613.75 + ], + "area_px": 503.0 + }, + { + "image_points_px": [ + [ + 840.0, + 608.0 + ], + [ + 862.0, + 598.0 + ], + [ + 886.0, + 610.0 + ], + [ + 863.0, + 620.0 + ] + ], + "center_px": [ + 862.75, + 609.0 + ], + "area_px": 505.0 + }, + { + "image_points_px": [ + [ + 888.0, + 610.0 + ], + [ + 911.0, + 601.0 + ], + [ + 934.0, + 613.0 + ], + [ + 911.0, + 622.0 + ] + ], + "center_px": [ + 911.0, + 611.5 + ], + "area_px": 483.0 + }, + { + "image_points_px": [ + [ + 1034.0, + 617.0 + ], + [ + 1056.0, + 608.0 + ], + [ + 1080.0, + 620.0 + ], + [ + 1058.0, + 629.0 + ] + ], + "center_px": [ + 1057.0, + 618.5 + ], + "area_px": 480.0 + }, + { + "image_points_px": [ + [ + 1076.0, + 596.0 + ], + [ + 1098.0, + 587.0 + ], + [ + 1122.0, + 598.0 + ], + [ + 1103.0, + 608.0 + ] + ], + "center_px": [ + 1099.75, + 597.25 + ], + "area_px": 478.0 + }, + { + "image_points_px": [ + [ + 1221.0, + 602.0 + ], + [ + 1239.0, + 593.0 + ], + [ + 1267.0, + 605.0 + ], + [ + 1247.0, + 614.0 + ] + ], + "center_px": [ + 1243.5, + 603.5 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 1124.0, + 598.0 + ], + [ + 1145.0, + 589.0 + ], + [ + 1170.0, + 601.0 + ], + [ + 1151.0, + 610.0 + ] + ], + "center_px": [ + 1147.5, + 599.5 + ], + "area_px": 474.0 + }, + { + "image_points_px": [ + [ + 743.0, + 653.0 + ], + [ + 765.0, + 642.0 + ], + [ + 787.0, + 655.0 + ], + [ + 763.0, + 666.0 + ] + ], + "center_px": [ + 764.5, + 654.0 + ], + "area_px": 530.0 + }, + { + "image_points_px": [ + [ + 793.0, + 605.0 + ], + [ + 816.0, + 596.0 + ], + [ + 838.0, + 608.0 + ], + [ + 815.0, + 618.0 + ] + ], + "center_px": [ + 815.5, + 606.75 + ], + "area_px": 496.5 + }, + { + "image_points_px": [ + [ + 745.0, + 603.0 + ], + [ + 769.0, + 594.0 + ], + [ + 790.0, + 606.0 + ], + [ + 766.0, + 615.0 + ] + ], + "center_px": [ + 767.5, + 604.5 + ], + "area_px": 477.0 + }, + { + "image_points_px": [ + [ + 793.0, + 655.0 + ], + [ + 816.0, + 645.0 + ], + [ + 837.0, + 658.0 + ], + [ + 813.0, + 668.0 + ] + ], + "center_px": [ + 814.75, + 656.5 + ], + "area_px": 510.5 + }, + { + "image_points_px": [ + [ + 884.0, + 430.0 + ], + [ + 844.0, + 456.0 + ], + [ + 845.0, + 449.0 + ], + [ + 874.0, + 430.0 + ] + ], + "center_px": [ + 861.75, + 441.25 + ], + "area_px": 222.0 + }, + { + "image_points_px": [ + [ + 934.0, + 589.0 + ], + [ + 955.0, + 580.0 + ], + [ + 979.0, + 591.0 + ], + [ + 957.0, + 601.0 + ] + ], + "center_px": [ + 956.25, + 590.25 + ], + "area_px": 470.5 + }, + { + "image_points_px": [ + [ + 1029.0, + 594.0 + ], + [ + 1049.0, + 584.0 + ], + [ + 1074.0, + 596.0 + ], + [ + 1052.0, + 605.0 + ] + ], + "center_px": [ + 1051.0, + 594.75 + ], + "area_px": 469.5 + }, + { + "image_points_px": [ + [ + 1070.0, + 573.0 + ], + [ + 1091.0, + 565.0 + ], + [ + 1115.0, + 575.0 + ], + [ + 1096.0, + 585.0 + ] + ], + "center_px": [ + 1093.0, + 574.5 + ], + "area_px": 445.0 + }, + { + "image_points_px": [ + [ + 1202.0, + 558.0 + ], + [ + 1220.0, + 549.0 + ], + [ + 1247.0, + 560.0 + ], + [ + 1229.0, + 569.0 + ] + ], + "center_px": [ + 1224.5, + 559.0 + ], + "area_px": 441.0 + }, + { + "image_points_px": [ + [ + 1212.0, + 579.0 + ], + [ + 1230.0, + 571.0 + ], + [ + 1257.0, + 582.0 + ], + [ + 1238.0, + 591.0 + ] + ], + "center_px": [ + 1234.25, + 580.75 + ], + "area_px": 438.0 + }, + { + "image_points_px": [ + [ + 1165.0, + 577.0 + ], + [ + 1184.0, + 569.0 + ], + [ + 1210.0, + 580.0 + ], + [ + 1190.0, + 589.0 + ] + ], + "center_px": [ + 1187.25, + 578.75 + ], + "area_px": 441.0 + }, + { + "image_points_px": [ + [ + 1156.0, + 556.0 + ], + [ + 1174.0, + 547.0 + ], + [ + 1200.0, + 558.0 + ], + [ + 1182.0, + 567.0 + ] + ], + "center_px": [ + 1178.0, + 557.0 + ], + "area_px": 432.0 + }, + { + "image_points_px": [ + [ + 1118.0, + 575.0 + ], + [ + 1138.0, + 567.0 + ], + [ + 1162.0, + 578.0 + ], + [ + 1143.0, + 587.0 + ] + ], + "center_px": [ + 1140.25, + 576.75 + ], + "area_px": 432.5 + }, + { + "image_points_px": [ + [ + 1111.0, + 553.0 + ], + [ + 1130.0, + 546.0 + ], + [ + 1154.0, + 556.0 + ], + [ + 1136.0, + 565.0 + ] + ], + "center_px": [ + 1132.75, + 555.0 + ], + "area_px": 399.5 + }, + { + "image_points_px": [ + [ + 1194.0, + 537.0 + ], + [ + 1211.0, + 529.0 + ], + [ + 1237.0, + 539.0 + ], + [ + 1218.0, + 547.0 + ] + ], + "center_px": [ + 1215.0, + 538.0 + ], + "area_px": 380.0 + }, + { + "image_points_px": [ + [ + 1065.0, + 552.0 + ], + [ + 1086.0, + 544.0 + ], + [ + 1108.0, + 554.0 + ], + [ + 1088.0, + 562.0 + ] + ], + "center_px": [ + 1086.75, + 553.0 + ], + "area_px": 385.0 + }, + { + "image_points_px": [ + [ + 1149.0, + 535.0 + ], + [ + 1167.0, + 527.0 + ], + [ + 1192.0, + 537.0 + ], + [ + 1172.0, + 545.0 + ] + ], + "center_px": [ + 1170.0, + 536.0 + ], + "area_px": 382.0 + }, + { + "image_points_px": [ + [ + 1104.0, + 533.0 + ], + [ + 1122.0, + 524.0 + ], + [ + 1146.0, + 535.0 + ], + [ + 1127.0, + 543.0 + ] + ], + "center_px": [ + 1124.75, + 533.75 + ], + "area_px": 394.0 + }, + { + "image_points_px": [ + [ + 981.0, + 381.0 + ], + [ + 987.0, + 381.0 + ], + [ + 1014.0, + 403.0 + ], + [ + 1016.0, + 409.0 + ] + ], + "center_px": [ + 999.5, + 393.5 + ], + "area_px": 143.0 + }, + { + "image_points_px": [ + [ + 526.0, + 696.0 + ], + [ + 498.0, + 708.0 + ], + [ + 486.0, + 701.0 + ], + [ + 515.0, + 688.0 + ] + ], + "center_px": [ + 506.25, + 698.25 + ], + "area_px": 357.5 + }, + { + "image_points_px": [ + [ + 1186.0, + 517.0 + ], + [ + 1203.0, + 510.0 + ], + [ + 1227.0, + 519.0 + ], + [ + 1210.0, + 527.0 + ] + ], + "center_px": [ + 1206.5, + 518.25 + ], + "area_px": 341.5 + }, + { + "image_points_px": [ + [ + 1142.0, + 515.0 + ], + [ + 1160.0, + 508.0 + ], + [ + 1183.0, + 517.0 + ], + [ + 1165.0, + 525.0 + ] + ], + "center_px": [ + 1162.5, + 516.25 + ], + "area_px": 343.5 + }, + { + "image_points_px": [ + [ + 1029.0, + 574.0 + ], + [ + 1043.0, + 562.0 + ], + [ + 1068.0, + 573.0 + ], + [ + 1050.0, + 582.0 + ] + ], + "center_px": [ + 1047.5, + 572.75 + ], + "area_px": 393.5 + }, + { + "image_points_px": [ + [ + 1178.0, + 498.0 + ], + [ + 1194.0, + 491.0 + ], + [ + 1219.0, + 500.0 + ], + [ + 1200.0, + 507.0 + ] + ], + "center_px": [ + 1197.75, + 499.0 + ], + "area_px": 322.0 + }, + { + "image_points_px": [ + [ + 639.0, + 647.0 + ], + [ + 615.0, + 658.0 + ], + [ + 599.0, + 652.0 + ], + [ + 627.0, + 640.0 + ] + ], + "center_px": [ + 620.0, + 649.25 + ], + "area_px": 330.0 + }, + { + "image_points_px": [ + [ + 929.0, + 589.0 + ], + [ + 909.0, + 598.0 + ], + [ + 889.0, + 587.0 + ], + [ + 917.0, + 582.0 + ] + ], + "center_px": [ + 911.0, + 589.0 + ], + "area_px": 328.0 + }, + { + "image_points_px": [ + [ + 584.0, + 671.0 + ], + [ + 557.0, + 683.0 + ], + [ + 545.0, + 675.0 + ], + [ + 571.0, + 664.0 + ] + ], + "center_px": [ + 564.25, + 673.25 + ], + "area_px": 342.5 + }, + { + "image_points_px": [ + [ + 543.0, + 627.0 + ], + [ + 528.0, + 637.0 + ], + [ + 503.0, + 642.0 + ], + [ + 527.0, + 629.0 + ] + ], + "center_px": [ + 525.25, + 633.75 + ], + "area_px": 167.5 + }, + { + "image_points_px": [ + [ + 1212.0, + 482.0 + ], + [ + 1229.0, + 475.0 + ], + [ + 1252.0, + 484.0 + ], + [ + 1237.0, + 491.0 + ] + ], + "center_px": [ + 1232.5, + 483.0 + ], + "area_px": 312.0 + }, + { + "image_points_px": [ + [ + 1170.0, + 480.0 + ], + [ + 1187.0, + 473.0 + ], + [ + 1210.0, + 482.0 + ], + [ + 1194.0, + 489.0 + ] + ], + "center_px": [ + 1190.25, + 481.0 + ], + "area_px": 313.0 + }, + { + "image_points_px": [ + [ + 1204.0, + 464.0 + ], + [ + 1222.0, + 458.0 + ], + [ + 1244.0, + 466.0 + ], + [ + 1228.0, + 473.0 + ] + ], + "center_px": [ + 1224.5, + 465.25 + ], + "area_px": 294.0 + }, + { + "image_points_px": [ + [ + 623.0, + 591.0 + ], + [ + 590.0, + 604.0 + ], + [ + 583.0, + 600.0 + ], + [ + 606.0, + 591.0 + ] + ], + "center_px": [ + 600.5, + 596.5 + ], + "area_px": 188.0 + }, + { + "image_points_px": [ + [ + 1163.0, + 463.0 + ], + [ + 1179.0, + 456.0 + ], + [ + 1202.0, + 464.0 + ], + [ + 1185.0, + 471.0 + ] + ], + "center_px": [ + 1182.25, + 463.5 + ], + "area_px": 289.5 + }, + { + "image_points_px": [ + [ + 903.0, + 212.0 + ], + [ + 863.0, + 209.0 + ], + [ + 888.0, + 205.0 + ], + [ + 900.0, + 207.0 + ] + ], + "center_px": [ + 888.5, + 208.25 + ], + "area_px": 144.5 + }, + { + "image_points_px": [ + [ + 1237.0, + 449.0 + ], + [ + 1253.0, + 443.0 + ], + [ + 1276.0, + 451.0 + ], + [ + 1260.0, + 457.0 + ] + ], + "center_px": [ + 1256.5, + 450.0 + ], + "area_px": 266.0 + }, + { + "image_points_px": [ + [ + 1197.0, + 447.0 + ], + [ + 1212.0, + 441.0 + ], + [ + 1235.0, + 449.0 + ], + [ + 1220.0, + 456.0 + ] + ], + "center_px": [ + 1216.0, + 448.25 + ], + "area_px": 277.0 + }, + { + "image_points_px": [ + [ + 692.0, + 625.0 + ], + [ + 668.0, + 635.0 + ], + [ + 655.0, + 629.0 + ], + [ + 679.0, + 618.0 + ] + ], + "center_px": [ + 673.5, + 626.75 + ], + "area_px": 292.5 + }, + { + "image_points_px": [ + [ + 1232.0, + 519.0 + ], + [ + 1248.0, + 512.0 + ], + [ + 1269.0, + 522.0 + ], + [ + 1255.0, + 529.0 + ] + ], + "center_px": [ + 1251.0, + 520.5 + ], + "area_px": 304.0 + }, + { + "image_points_px": [ + [ + 1116.0, + 444.0 + ], + [ + 1132.0, + 438.0 + ], + [ + 1154.0, + 446.0 + ], + [ + 1136.0, + 452.0 + ] + ], + "center_px": [ + 1134.5, + 445.0 + ], + "area_px": 262.0 + }, + { + "image_points_px": [ + [ + 1189.0, + 431.0 + ], + [ + 1204.0, + 425.0 + ], + [ + 1227.0, + 433.0 + ], + [ + 1210.0, + 439.0 + ] + ], + "center_px": [ + 1207.5, + 432.0 + ], + "area_px": 260.0 + }, + { + "image_points_px": [ + [ + 1156.0, + 446.0 + ], + [ + 1173.0, + 440.0 + ], + [ + 1194.0, + 448.0 + ], + [ + 1178.0, + 454.0 + ] + ], + "center_px": [ + 1175.25, + 447.0 + ], + "area_px": 261.0 + }, + { + "image_points_px": [ + [ + 1223.0, + 500.0 + ], + [ + 1238.0, + 493.0 + ], + [ + 1260.0, + 502.0 + ], + [ + 1244.0, + 509.0 + ] + ], + "center_px": [ + 1241.25, + 501.0 + ], + "area_px": 290.0 + }, + { + "image_points_px": [ + [ + 1124.0, + 460.0 + ], + [ + 1138.0, + 454.0 + ], + [ + 1161.0, + 463.0 + ], + [ + 1142.0, + 469.0 + ] + ], + "center_px": [ + 1141.25, + 461.5 + ], + "area_px": 271.5 + }, + { + "image_points_px": [ + [ + 743.0, + 603.0 + ], + [ + 719.0, + 613.0 + ], + [ + 707.0, + 607.0 + ], + [ + 731.0, + 596.0 + ] + ], + "center_px": [ + 725.0, + 604.75 + ], + "area_px": 282.0 + }, + { + "image_points_px": [ + [ + 483.0, + 435.0 + ], + [ + 461.0, + 442.0 + ], + [ + 446.0, + 434.0 + ], + [ + 469.0, + 428.0 + ] + ], + "center_px": [ + 464.75, + 434.75 + ], + "area_px": 263.0 + }, + { + "image_points_px": [ + [ + 1149.0, + 430.0 + ], + [ + 1166.0, + 424.0 + ], + [ + 1186.0, + 432.0 + ], + [ + 1172.0, + 438.0 + ] + ], + "center_px": [ + 1168.25, + 431.0 + ], + "area_px": 253.0 + }, + { + "image_points_px": [ + [ + 1229.0, + 433.0 + ], + [ + 1244.0, + 427.0 + ], + [ + 1266.0, + 435.0 + ], + [ + 1252.0, + 441.0 + ] + ], + "center_px": [ + 1247.75, + 434.0 + ], + "area_px": 251.0 + }, + { + "image_points_px": [ + [ + 1221.0, + 417.0 + ], + [ + 1237.0, + 412.0 + ], + [ + 1258.0, + 419.0 + ], + [ + 1243.0, + 425.0 + ] + ], + "center_px": [ + 1239.75, + 418.25 + ], + "area_px": 234.5 + }, + { + "image_points_px": [ + [ + 521.0, + 437.0 + ], + [ + 499.0, + 443.0 + ], + [ + 485.0, + 435.0 + ], + [ + 506.0, + 429.0 + ] + ], + "center_px": [ + 502.75, + 436.0 + ], + "area_px": 259.0 + }, + { + "image_points_px": [ + [ + 565.0, + 423.0 + ], + [ + 544.0, + 429.0 + ], + [ + 529.0, + 421.0 + ], + [ + 550.0, + 415.0 + ] + ], + "center_px": [ + 547.0, + 422.0 + ], + "area_px": 258.0 + }, + { + "image_points_px": [ + [ + 254.0, + 426.0 + ], + [ + 230.0, + 432.0 + ], + [ + 218.0, + 425.0 + ], + [ + 243.0, + 419.0 + ] + ], + "center_px": [ + 236.25, + 425.5 + ], + "area_px": 240.5 + }, + { + "image_points_px": [ + [ + 406.0, + 432.0 + ], + [ + 382.0, + 438.0 + ], + [ + 370.0, + 431.0 + ], + [ + 393.0, + 425.0 + ] + ], + "center_px": [ + 387.75, + 431.5 + ], + "area_px": 239.5 + }, + { + "image_points_px": [ + [ + 538.0, + 468.0 + ], + [ + 513.0, + 477.0 + ], + [ + 501.0, + 477.0 + ], + [ + 526.0, + 468.0 + ] + ], + "center_px": [ + 519.5, + 472.5 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 452.0, + 418.0 + ], + [ + 429.0, + 424.0 + ], + [ + 416.0, + 417.0 + ], + [ + 438.0, + 411.0 + ] + ], + "center_px": [ + 433.75, + 417.5 + ], + "area_px": 238.5 + }, + { + "image_points_px": [ + [ + 527.0, + 421.0 + ], + [ + 506.0, + 427.0 + ], + [ + 491.0, + 420.0 + ], + [ + 513.0, + 414.0 + ] + ], + "center_px": [ + 509.25, + 420.5 + ], + "area_px": 237.5 + }, + { + "image_points_px": [ + [ + 1182.0, + 416.0 + ], + [ + 1197.0, + 410.0 + ], + [ + 1218.0, + 418.0 + ], + [ + 1202.0, + 423.0 + ] + ], + "center_px": [ + 1199.75, + 416.75 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 47.0, + 573.0 + ], + [ + 26.0, + 579.0 + ], + [ + 14.0, + 568.0 + ], + [ + 35.0, + 562.0 + ] + ], + "center_px": [ + 30.5, + 570.5 + ], + "area_px": 303.0 + }, + { + "image_points_px": [ + [ + 444.0, + 434.0 + ], + [ + 422.0, + 440.0 + ], + [ + 409.0, + 432.0 + ], + [ + 430.0, + 426.0 + ] + ], + "center_px": [ + 426.25, + 433.0 + ], + "area_px": 253.0 + }, + { + "image_points_px": [ + [ + 291.0, + 428.0 + ], + [ + 268.0, + 434.0 + ], + [ + 256.0, + 426.0 + ], + [ + 281.0, + 421.0 + ] + ], + "center_px": [ + 274.0, + 427.25 + ], + "area_px": 240.5 + }, + { + "image_points_px": [ + [ + 1050.0, + 408.0 + ], + [ + 1039.0, + 420.0 + ], + [ + 1017.0, + 411.0 + ], + [ + 1037.0, + 403.0 + ] + ], + "center_px": [ + 1035.75, + 410.5 + ], + "area_px": 283.5 + }, + { + "image_points_px": [ + [ + 454.0, + 418.0 + ], + [ + 477.0, + 413.0 + ], + [ + 489.0, + 420.0 + ], + [ + 468.0, + 426.0 + ] + ], + "center_px": [ + 472.0, + 419.25 + ], + "area_px": 236.5 + }, + { + "image_points_px": [ + [ + 414.0, + 417.0 + ], + [ + 392.0, + 423.0 + ], + [ + 379.0, + 415.0 + ], + [ + 401.0, + 410.0 + ] + ], + "center_px": [ + 396.5, + 416.25 + ], + "area_px": 236.5 + }, + { + "image_points_px": [ + [ + 302.0, + 412.0 + ], + [ + 279.0, + 418.0 + ], + [ + 267.0, + 411.0 + ], + [ + 290.0, + 405.0 + ] + ], + "center_px": [ + 284.5, + 411.5 + ], + "area_px": 233.0 + }, + { + "image_points_px": [ + [ + 349.0, + 399.0 + ], + [ + 327.0, + 405.0 + ], + [ + 314.0, + 398.0 + ], + [ + 337.0, + 392.0 + ] + ], + "center_px": [ + 331.75, + 398.5 + ], + "area_px": 232.5 + }, + { + "image_points_px": [ + [ + 377.0, + 415.0 + ], + [ + 354.0, + 421.0 + ], + [ + 342.0, + 414.0 + ], + [ + 364.0, + 408.0 + ] + ], + "center_px": [ + 359.25, + 414.5 + ], + "area_px": 232.5 + }, + { + "image_points_px": [ + [ + 70.0, + 323.0 + ], + [ + 77.0, + 349.0 + ], + [ + 74.0, + 359.0 + ], + [ + 69.0, + 353.0 + ] + ], + "center_px": [ + 72.5, + 346.0 + ], + "area_px": 152.0 + }, + { + "image_points_px": [ + [ + 459.0, + 403.0 + ], + [ + 438.0, + 409.0 + ], + [ + 424.0, + 402.0 + ], + [ + 445.0, + 396.0 + ] + ], + "center_px": [ + 441.5, + 402.5 + ], + "area_px": 231.0 + }, + { + "image_points_px": [ + [ + 533.0, + 406.0 + ], + [ + 512.0, + 412.0 + ], + [ + 498.0, + 405.0 + ], + [ + 519.0, + 399.0 + ] + ], + "center_px": [ + 515.5, + 405.5 + ], + "area_px": 231.0 + }, + { + "image_points_px": [ + [ + 608.0, + 409.0 + ], + [ + 587.0, + 415.0 + ], + [ + 573.0, + 408.0 + ], + [ + 593.0, + 402.0 + ] + ], + "center_px": [ + 590.25, + 408.5 + ], + "area_px": 230.5 + }, + { + "image_points_px": [ + [ + 1214.0, + 402.0 + ], + [ + 1228.0, + 397.0 + ], + [ + 1249.0, + 404.0 + ], + [ + 1235.0, + 410.0 + ] + ], + "center_px": [ + 1231.5, + 403.25 + ], + "area_px": 220.5 + }, + { + "image_points_px": [ + [ + 570.0, + 408.0 + ], + [ + 549.0, + 413.0 + ], + [ + 535.0, + 406.0 + ], + [ + 557.0, + 401.0 + ] + ], + "center_px": [ + 552.75, + 407.0 + ], + "area_px": 218.0 + }, + { + "image_points_px": [ + [ + 649.0, + 396.0 + ], + [ + 628.0, + 401.0 + ], + [ + 614.0, + 395.0 + ], + [ + 634.0, + 389.0 + ] + ], + "center_px": [ + 631.25, + 395.25 + ], + "area_px": 213.0 + }, + { + "image_points_px": [ + [ + 265.0, + 411.0 + ], + [ + 242.0, + 417.0 + ], + [ + 231.0, + 410.0 + ], + [ + 254.0, + 404.0 + ] + ], + "center_px": [ + 248.0, + 410.5 + ], + "area_px": 227.0 + }, + { + "image_points_px": [ + [ + 654.0, + 382.0 + ], + [ + 673.0, + 377.0 + ], + [ + 689.0, + 383.0 + ], + [ + 669.0, + 388.0 + ] + ], + "center_px": [ + 671.25, + 382.5 + ], + "area_px": 194.5 + }, + { + "image_points_px": [ + [ + 276.0, + 396.0 + ], + [ + 253.0, + 402.0 + ], + [ + 242.0, + 395.0 + ], + [ + 264.0, + 389.0 + ] + ], + "center_px": [ + 258.75, + 395.5 + ], + "area_px": 226.5 + }, + { + "image_points_px": [ + [ + 496.0, + 405.0 + ], + [ + 475.0, + 411.0 + ], + [ + 462.0, + 403.0 + ], + [ + 483.0, + 398.0 + ] + ], + "center_px": [ + 479.0, + 404.25 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 339.0, + 414.0 + ], + [ + 315.0, + 419.0 + ], + [ + 305.0, + 412.0 + ], + [ + 328.0, + 407.0 + ] + ], + "center_px": [ + 321.75, + 413.0 + ], + "area_px": 217.0 + }, + { + "image_points_px": [ + [ + 422.0, + 402.0 + ], + [ + 401.0, + 408.0 + ], + [ + 388.0, + 401.0 + ], + [ + 409.0, + 395.0 + ] + ], + "center_px": [ + 405.0, + 401.5 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 385.0, + 400.0 + ], + [ + 363.0, + 406.0 + ], + [ + 351.0, + 399.0 + ], + [ + 374.0, + 394.0 + ] + ], + "center_px": [ + 368.25, + 399.75 + ], + "area_px": 209.5 + }, + { + "image_points_px": [ + [ + 358.0, + 385.0 + ], + [ + 336.0, + 390.0 + ], + [ + 324.0, + 384.0 + ], + [ + 346.0, + 378.0 + ] + ], + "center_px": [ + 341.0, + 384.25 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 539.0, + 392.0 + ], + [ + 518.0, + 397.0 + ], + [ + 505.0, + 390.0 + ], + [ + 525.0, + 385.0 + ] + ], + "center_px": [ + 521.75, + 391.0 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 466.0, + 389.0 + ], + [ + 444.0, + 394.0 + ], + [ + 432.0, + 388.0 + ], + [ + 453.0, + 382.0 + ] + ], + "center_px": [ + 448.75, + 388.25 + ], + "area_px": 208.5 + }, + { + "image_points_px": [ + [ + 468.0, + 389.0 + ], + [ + 490.0, + 384.0 + ], + [ + 502.0, + 390.0 + ], + [ + 482.0, + 396.0 + ] + ], + "center_px": [ + 485.5, + 389.75 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 616.0, + 381.0 + ], + [ + 597.0, + 386.0 + ], + [ + 582.0, + 379.0 + ], + [ + 601.0, + 374.0 + ] + ], + "center_px": [ + 599.0, + 380.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 287.0, + 382.0 + ], + [ + 263.0, + 387.0 + ], + [ + 253.0, + 381.0 + ], + [ + 276.0, + 376.0 + ] + ], + "center_px": [ + 269.75, + 381.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 394.0, + 386.0 + ], + [ + 371.0, + 391.0 + ], + [ + 360.0, + 385.0 + ], + [ + 382.0, + 380.0 + ] + ], + "center_px": [ + 376.75, + 385.5 + ], + "area_px": 192.5 + }, + { + "image_points_px": [ + [ + 473.0, + 375.0 + ], + [ + 451.0, + 380.0 + ], + [ + 439.0, + 374.0 + ], + [ + 461.0, + 369.0 + ] + ], + "center_px": [ + 456.0, + 374.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 546.0, + 378.0 + ], + [ + 568.0, + 373.0 + ], + [ + 580.0, + 379.0 + ], + [ + 559.0, + 384.0 + ] + ], + "center_px": [ + 563.25, + 378.5 + ], + "area_px": 191.5 + }, + { + "image_points_px": [ + [ + 586.0, + 366.0 + ], + [ + 607.0, + 361.0 + ], + [ + 620.0, + 367.0 + ], + [ + 601.0, + 372.0 + ] + ], + "center_px": [ + 603.5, + 366.5 + ], + "area_px": 190.0 + }, + { + "image_points_px": [ + [ + 622.0, + 367.0 + ], + [ + 641.0, + 362.0 + ], + [ + 656.0, + 368.0 + ], + [ + 636.0, + 373.0 + ] + ], + "center_px": [ + 638.75, + 367.5 + ], + "area_px": 189.5 + }, + { + "image_points_px": [ + [ + 338.0, + 131.0 + ], + [ + 366.0, + 128.0 + ], + [ + 373.0, + 132.0 + ], + [ + 359.0, + 134.0 + ] + ], + "center_px": [ + 359.0, + 131.25 + ], + "area_px": 108.5 + }, + { + "image_points_px": [ + [ + 693.0, + 370.0 + ], + [ + 712.0, + 365.0 + ], + [ + 727.0, + 371.0 + ], + [ + 709.0, + 376.0 + ] + ], + "center_px": [ + 710.25, + 370.5 + ], + "area_px": 188.5 + }, + { + "image_points_px": [ + [ + 312.0, + 398.0 + ], + [ + 289.0, + 403.0 + ], + [ + 279.0, + 396.0 + ], + [ + 301.0, + 391.0 + ] + ], + "center_px": [ + 295.25, + 397.0 + ], + "area_px": 210.0 + }, + { + "image_points_px": [ + [ + 251.0, + 381.0 + ], + [ + 228.0, + 386.0 + ], + [ + 218.0, + 380.0 + ], + [ + 240.0, + 374.0 + ] + ], + "center_px": [ + 234.25, + 380.25 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 429.0, + 388.0 + ], + [ + 408.0, + 393.0 + ], + [ + 396.0, + 386.0 + ], + [ + 417.0, + 381.0 + ] + ], + "center_px": [ + 412.5, + 387.0 + ], + "area_px": 207.0 + }, + { + "image_points_px": [ + [ + 322.0, + 383.0 + ], + [ + 300.0, + 389.0 + ], + [ + 289.0, + 382.0 + ], + [ + 311.0, + 377.0 + ] + ], + "center_px": [ + 305.5, + 382.75 + ], + "area_px": 203.5 + }, + { + "image_points_px": [ + [ + 437.0, + 374.0 + ], + [ + 417.0, + 379.0 + ], + [ + 404.0, + 373.0 + ], + [ + 424.0, + 367.0 + ] + ], + "center_px": [ + 420.5, + 373.25 + ], + "area_px": 201.5 + }, + { + "image_points_px": [ + [ + 508.0, + 376.0 + ], + [ + 488.0, + 382.0 + ], + [ + 475.0, + 375.0 + ], + [ + 495.0, + 370.0 + ] + ], + "center_px": [ + 491.5, + 375.75 + ], + "area_px": 201.5 + }, + { + "image_points_px": [ + [ + 652.0, + 382.0 + ], + [ + 632.0, + 387.0 + ], + [ + 619.0, + 380.0 + ], + [ + 636.0, + 375.0 + ] + ], + "center_px": [ + 634.75, + 381.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 549.0, + 364.0 + ], + [ + 530.0, + 370.0 + ], + [ + 516.0, + 363.0 + ], + [ + 536.0, + 358.0 + ] + ], + "center_px": [ + 532.75, + 363.75 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 262.0, + 367.0 + ], + [ + 239.0, + 372.0 + ], + [ + 229.0, + 366.0 + ], + [ + 251.0, + 361.0 + ] + ], + "center_px": [ + 245.25, + 366.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 227.0, + 366.0 + ], + [ + 205.0, + 371.0 + ], + [ + 194.0, + 365.0 + ], + [ + 217.0, + 360.0 + ] + ], + "center_px": [ + 210.75, + 365.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 332.0, + 370.0 + ], + [ + 310.0, + 375.0 + ], + [ + 299.0, + 369.0 + ], + [ + 321.0, + 364.0 + ] + ], + "center_px": [ + 315.5, + 369.5 + ], + "area_px": 187.0 + }, + { + "image_points_px": [ + [ + 511.0, + 376.0 + ], + [ + 532.0, + 372.0 + ], + [ + 544.0, + 378.0 + ], + [ + 524.0, + 383.0 + ] + ], + "center_px": [ + 527.75, + 377.25 + ], + "area_px": 189.5 + }, + { + "image_points_px": [ + [ + 945.0, + 574.0 + ], + [ + 957.0, + 561.0 + ], + [ + 975.0, + 569.0 + ], + [ + 955.0, + 578.0 + ] + ], + "center_px": [ + 958.0, + 570.5 + ], + "area_px": 250.0 + }, + { + "image_points_px": [ + [ + 402.0, + 372.0 + ], + [ + 380.0, + 377.0 + ], + [ + 369.0, + 371.0 + ], + [ + 389.0, + 366.0 + ] + ], + "center_px": [ + 385.0, + 371.5 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 658.0, + 368.0 + ], + [ + 678.0, + 364.0 + ], + [ + 691.0, + 370.0 + ], + [ + 673.0, + 375.0 + ] + ], + "center_px": [ + 675.0, + 369.25 + ], + "area_px": 186.5 + }, + { + "image_points_px": [ + [ + 410.0, + 359.0 + ], + [ + 389.0, + 364.0 + ], + [ + 377.0, + 358.0 + ], + [ + 397.0, + 353.0 + ] + ], + "center_px": [ + 393.25, + 358.5 + ], + "area_px": 185.5 + }, + { + "image_points_px": [ + [ + 514.0, + 363.0 + ], + [ + 494.0, + 368.0 + ], + [ + 481.0, + 362.0 + ], + [ + 501.0, + 357.0 + ] + ], + "center_px": [ + 497.5, + 362.5 + ], + "area_px": 185.0 + }, + { + "image_points_px": [ + [ + 591.0, + 353.0 + ], + [ + 611.0, + 348.0 + ], + [ + 624.0, + 354.0 + ], + [ + 605.0, + 359.0 + ] + ], + "center_px": [ + 607.75, + 353.5 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 520.0, + 350.0 + ], + [ + 500.0, + 355.0 + ], + [ + 487.0, + 349.0 + ], + [ + 506.0, + 344.0 + ] + ], + "center_px": [ + 503.25, + 349.5 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 626.0, + 354.0 + ], + [ + 642.0, + 349.0 + ], + [ + 659.0, + 355.0 + ], + [ + 639.0, + 360.0 + ] + ], + "center_px": [ + 641.5, + 354.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 765.0, + 346.0 + ], + [ + 747.0, + 351.0 + ], + [ + 732.0, + 345.0 + ], + [ + 750.0, + 340.0 + ] + ], + "center_px": [ + 748.5, + 345.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 240.0, + 395.0 + ], + [ + 219.0, + 400.0 + ], + [ + 208.0, + 393.0 + ], + [ + 229.0, + 388.0 + ] + ], + "center_px": [ + 224.0, + 394.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 731.0, + 358.0 + ], + [ + 748.0, + 353.0 + ], + [ + 764.0, + 359.0 + ], + [ + 744.0, + 363.0 + ] + ], + "center_px": [ + 746.75, + 358.25 + ], + "area_px": 167.0 + }, + { + "image_points_px": [ + [ + 296.0, + 368.0 + ], + [ + 275.0, + 374.0 + ], + [ + 264.0, + 367.0 + ], + [ + 285.0, + 362.0 + ] + ], + "center_px": [ + 280.0, + 367.75 + ], + "area_px": 197.0 + }, + { + "image_points_px": [ + [ + 442.0, + 450.0 + ], + [ + 462.0, + 444.0 + ], + [ + 473.0, + 451.0 + ], + [ + 453.0, + 458.0 + ] + ], + "center_px": [ + 457.5, + 450.75 + ], + "area_px": 221.5 + }, + { + "image_points_px": [ + [ + 278.0, + 443.0 + ], + [ + 259.0, + 450.0 + ], + [ + 247.0, + 443.0 + ], + [ + 267.0, + 436.0 + ] + ], + "center_px": [ + 262.75, + 443.0 + ], + "area_px": 217.0 + }, + { + "image_points_px": [ + [ + 272.0, + 354.0 + ], + [ + 250.0, + 359.0 + ], + [ + 240.0, + 353.0 + ], + [ + 261.0, + 348.0 + ] + ], + "center_px": [ + 255.75, + 353.5 + ], + "area_px": 181.5 + }, + { + "image_points_px": [ + [ + 238.0, + 353.0 + ], + [ + 216.0, + 358.0 + ], + [ + 206.0, + 352.0 + ], + [ + 227.0, + 347.0 + ] + ], + "center_px": [ + 221.75, + 352.5 + ], + "area_px": 181.5 + }, + { + "image_points_px": [ + [ + 383.0, + 345.0 + ], + [ + 362.0, + 350.0 + ], + [ + 351.0, + 344.0 + ], + [ + 371.0, + 339.0 + ] + ], + "center_px": [ + 366.75, + 344.5 + ], + "area_px": 180.5 + }, + { + "image_points_px": [ + [ + 447.0, + 361.0 + ], + [ + 468.0, + 356.0 + ], + [ + 479.0, + 362.0 + ], + [ + 460.0, + 367.0 + ] + ], + "center_px": [ + 463.5, + 361.5 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 444.0, + 360.0 + ], + [ + 423.0, + 365.0 + ], + [ + 412.0, + 359.0 + ], + [ + 431.0, + 354.0 + ] + ], + "center_px": [ + 427.5, + 359.5 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 728.0, + 358.0 + ], + [ + 709.0, + 362.0 + ], + [ + 696.0, + 356.0 + ], + [ + 713.0, + 351.0 + ] + ], + "center_px": [ + 711.5, + 356.75 + ], + "area_px": 180.0 + }, + { + "image_points_px": [ + [ + 485.0, + 349.0 + ], + [ + 466.0, + 354.0 + ], + [ + 453.0, + 348.0 + ], + [ + 473.0, + 343.0 + ] + ], + "center_px": [ + 469.25, + 348.5 + ], + "area_px": 179.5 + }, + { + "image_points_px": [ + [ + 552.0, + 365.0 + ], + [ + 572.0, + 360.0 + ], + [ + 584.0, + 366.0 + ], + [ + 566.0, + 371.0 + ] + ], + "center_px": [ + 568.5, + 365.5 + ], + "area_px": 179.0 + }, + { + "image_points_px": [ + [ + 693.0, + 356.0 + ], + [ + 674.0, + 361.0 + ], + [ + 661.0, + 355.0 + ], + [ + 678.0, + 350.0 + ] + ], + "center_px": [ + 676.5, + 355.5 + ], + "area_px": 178.0 + }, + { + "image_points_px": [ + [ + 593.0, + 340.0 + ], + [ + 575.0, + 345.0 + ], + [ + 561.0, + 339.0 + ], + [ + 579.0, + 334.0 + ] + ], + "center_px": [ + 577.0, + 339.5 + ], + "area_px": 178.0 + }, + { + "image_points_px": [ + [ + 306.0, + 355.0 + ], + [ + 284.0, + 360.0 + ], + [ + 274.0, + 354.0 + ], + [ + 296.0, + 350.0 + ] + ], + "center_px": [ + 290.0, + 354.75 + ], + "area_px": 166.0 + }, + { + "image_points_px": [ + [ + 317.0, + 343.0 + ], + [ + 339.0, + 339.0 + ], + [ + 349.0, + 344.0 + ], + [ + 328.0, + 349.0 + ] + ], + "center_px": [ + 333.25, + 343.75 + ], + "area_px": 165.5 + }, + { + "image_points_px": [ + [ + 522.0, + 350.0 + ], + [ + 542.0, + 346.0 + ], + [ + 554.0, + 351.0 + ], + [ + 534.0, + 356.0 + ] + ], + "center_px": [ + 538.0, + 350.75 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 451.0, + 348.0 + ], + [ + 431.0, + 352.0 + ], + [ + 419.0, + 347.0 + ], + [ + 439.0, + 342.0 + ] + ], + "center_px": [ + 435.0, + 347.25 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 417.0, + 346.0 + ], + [ + 397.0, + 351.0 + ], + [ + 385.0, + 345.0 + ], + [ + 405.0, + 341.0 + ] + ], + "center_px": [ + 401.0, + 345.75 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 664.0, + 342.0 + ], + [ + 681.0, + 338.0 + ], + [ + 696.0, + 344.0 + ], + [ + 677.0, + 348.0 + ] + ], + "center_px": [ + 679.5, + 343.0 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 698.0, + 344.0 + ], + [ + 716.0, + 339.0 + ], + [ + 730.0, + 345.0 + ], + [ + 711.0, + 349.0 + ] + ], + "center_px": [ + 713.75, + 344.25 + ], + "area_px": 162.5 + }, + { + "image_points_px": [ + [ + 767.0, + 346.0 + ], + [ + 785.0, + 342.0 + ], + [ + 799.0, + 348.0 + ], + [ + 783.0, + 352.0 + ] + ], + "center_px": [ + 783.5, + 347.0 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 734.0, + 333.0 + ], + [ + 751.0, + 328.0 + ], + [ + 766.0, + 334.0 + ], + [ + 747.0, + 338.0 + ] + ], + "center_px": [ + 749.5, + 333.25 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 599.0, + 328.0 + ], + [ + 617.0, + 324.0 + ], + [ + 631.0, + 329.0 + ], + [ + 613.0, + 334.0 + ] + ], + "center_px": [ + 615.0, + 328.75 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 768.0, + 334.0 + ], + [ + 787.0, + 330.0 + ], + [ + 800.0, + 335.0 + ], + [ + 784.0, + 340.0 + ] + ], + "center_px": [ + 784.75, + 334.75 + ], + "area_px": 161.5 + }, + { + "image_points_px": [ + [ + 215.0, + 379.0 + ], + [ + 194.0, + 384.0 + ], + [ + 184.0, + 377.0 + ], + [ + 205.0, + 373.0 + ] + ], + "center_px": [ + 199.5, + 378.25 + ], + "area_px": 181.5 + }, + { + "image_points_px": [ + [ + 595.0, + 340.0 + ], + [ + 614.0, + 336.0 + ], + [ + 627.0, + 341.0 + ], + [ + 607.0, + 345.0 + ] + ], + "center_px": [ + 610.75, + 340.5 + ], + "area_px": 147.5 + }, + { + "image_points_px": [ + [ + 702.0, + 320.0 + ], + [ + 721.0, + 316.0 + ], + [ + 734.0, + 321.0 + ], + [ + 716.0, + 325.0 + ] + ], + "center_px": [ + 718.25, + 320.5 + ], + "area_px": 146.5 + }, + { + "image_points_px": [ + [ + 769.0, + 322.0 + ], + [ + 786.0, + 318.0 + ], + [ + 801.0, + 323.0 + ], + [ + 782.0, + 327.0 + ] + ], + "center_px": [ + 784.5, + 322.5 + ], + "area_px": 146.0 + }, + { + "image_points_px": [ + [ + 802.0, + 335.0 + ], + [ + 820.0, + 331.0 + ], + [ + 834.0, + 336.0 + ], + [ + 816.0, + 340.0 + ] + ], + "center_px": [ + 818.0, + 335.5 + ], + "area_px": 146.0 + }, + { + "image_points_px": [ + [ + 203.0, + 352.0 + ], + [ + 183.0, + 357.0 + ], + [ + 172.0, + 351.0 + ], + [ + 194.0, + 346.0 + ] + ], + "center_px": [ + 188.0, + 351.5 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 340.0, + 357.0 + ], + [ + 320.0, + 362.0 + ], + [ + 309.0, + 356.0 + ], + [ + 330.0, + 351.0 + ] + ], + "center_px": [ + 324.75, + 356.5 + ], + "area_px": 175.5 + }, + { + "image_points_px": [ + [ + 315.0, + 343.0 + ], + [ + 295.0, + 348.0 + ], + [ + 284.0, + 342.0 + ], + [ + 305.0, + 337.0 + ] + ], + "center_px": [ + 299.75, + 342.5 + ], + "area_px": 175.5 + }, + { + "image_points_px": [ + [ + 50.0, + 333.0 + ], + [ + 27.0, + 338.0 + ], + [ + 19.0, + 332.0 + ], + [ + 42.0, + 328.0 + ] + ], + "center_px": [ + 34.5, + 332.75 + ], + "area_px": 162.5 + }, + { + "image_points_px": [ + [ + 35.0, + 346.0 + ], + [ + 12.0, + 350.0 + ], + [ + 4.0, + 345.0 + ], + [ + 27.0, + 340.0 + ] + ], + "center_px": [ + 19.5, + 345.25 + ], + "area_px": 162.5 + }, + { + "image_points_px": [ + [ + 282.0, + 342.0 + ], + [ + 260.0, + 346.0 + ], + [ + 251.0, + 340.0 + ], + [ + 271.0, + 336.0 + ] + ], + "center_px": [ + 266.0, + 341.0 + ], + "area_px": 166.0 + }, + { + "image_points_px": [ + [ + 215.0, + 339.0 + ], + [ + 193.0, + 344.0 + ], + [ + 184.0, + 338.0 + ], + [ + 206.0, + 334.0 + ] + ], + "center_px": [ + 199.5, + 338.75 + ], + "area_px": 161.5 + }, + { + "image_points_px": [ + [ + 388.0, + 465.0 + ], + [ + 366.0, + 472.0 + ], + [ + 357.0, + 468.0 + ], + [ + 380.0, + 461.0 + ] + ], + "center_px": [ + 372.75, + 466.5 + ], + "area_px": 149.5 + }, + { + "image_points_px": [ + [ + 193.0, + 326.0 + ], + [ + 172.0, + 331.0 + ], + [ + 162.0, + 325.0 + ], + [ + 184.0, + 321.0 + ] + ], + "center_px": [ + 177.75, + 325.75 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 115.0, + 335.0 + ], + [ + 92.0, + 340.0 + ], + [ + 84.0, + 335.0 + ], + [ + 106.0, + 330.0 + ] + ], + "center_px": [ + 99.25, + 335.0 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 226.0, + 327.0 + ], + [ + 205.0, + 332.0 + ], + [ + 195.0, + 326.0 + ], + [ + 216.0, + 322.0 + ] + ], + "center_px": [ + 210.5, + 326.75 + ], + "area_px": 160.5 + }, + { + "image_points_px": [ + [ + 324.0, + 331.0 + ], + [ + 303.0, + 335.0 + ], + [ + 293.0, + 330.0 + ], + [ + 313.0, + 325.0 + ] + ], + "center_px": [ + 308.25, + 330.25 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 491.0, + 337.0 + ], + [ + 471.0, + 341.0 + ], + [ + 460.0, + 336.0 + ], + [ + 480.0, + 331.0 + ] + ], + "center_px": [ + 475.5, + 336.25 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 427.0, + 334.0 + ], + [ + 447.0, + 330.0 + ], + [ + 458.0, + 335.0 + ], + [ + 438.0, + 340.0 + ] + ], + "center_px": [ + 442.5, + 334.75 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 399.0, + 321.0 + ], + [ + 379.0, + 326.0 + ], + [ + 368.0, + 320.0 + ], + [ + 388.0, + 316.0 + ] + ], + "center_px": [ + 383.5, + 320.75 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 248.0, + 340.0 + ], + [ + 227.0, + 345.0 + ], + [ + 217.0, + 340.0 + ], + [ + 239.0, + 335.0 + ] + ], + "center_px": [ + 232.75, + 340.0 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 588.0, + 353.0 + ], + [ + 569.0, + 357.0 + ], + [ + 557.0, + 351.0 + ], + [ + 575.0, + 347.0 + ] + ], + "center_px": [ + 572.25, + 352.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 525.0, + 338.0 + ], + [ + 506.0, + 342.0 + ], + [ + 494.0, + 336.0 + ], + [ + 512.0, + 332.0 + ] + ], + "center_px": [ + 509.25, + 337.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 630.0, + 341.0 + ], + [ + 648.0, + 337.0 + ], + [ + 661.0, + 343.0 + ], + [ + 642.0, + 347.0 + ] + ], + "center_px": [ + 645.25, + 342.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 424.0, + 334.0 + ], + [ + 405.0, + 339.0 + ], + [ + 393.0, + 333.0 + ], + [ + 413.0, + 329.0 + ] + ], + "center_px": [ + 408.75, + 333.75 + ], + "area_px": 159.0 + }, + { + "image_points_px": [ + [ + 528.0, + 338.0 + ], + [ + 548.0, + 334.0 + ], + [ + 559.0, + 339.0 + ], + [ + 541.0, + 344.0 + ] + ], + "center_px": [ + 544.0, + 338.75 + ], + "area_px": 158.5 + }, + { + "image_points_px": [ + [ + 110.0, + 607.0 + ], + [ + 126.0, + 625.0 + ], + [ + 120.0, + 632.0 + ], + [ + 112.0, + 631.0 + ] + ], + "center_px": [ + 117.0, + 623.75 + ], + "area_px": 205.0 + }, + { + "image_points_px": [ + [ + 698.0, + 332.0 + ], + [ + 681.0, + 336.0 + ], + [ + 667.0, + 330.0 + ], + [ + 684.0, + 326.0 + ] + ], + "center_px": [ + 682.5, + 331.0 + ], + "area_px": 158.0 + }, + { + "image_points_px": [ + [ + 701.0, + 332.0 + ], + [ + 718.0, + 327.0 + ], + [ + 732.0, + 333.0 + ], + [ + 713.0, + 337.0 + ] + ], + "center_px": [ + 716.0, + 332.25 + ], + "area_px": 157.5 + }, + { + "image_points_px": [ + [ + 700.0, + 320.0 + ], + [ + 682.0, + 324.0 + ], + [ + 669.0, + 319.0 + ], + [ + 686.0, + 314.0 + ] + ], + "center_px": [ + 684.25, + 319.25 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 664.0, + 330.0 + ], + [ + 647.0, + 335.0 + ], + [ + 633.0, + 329.0 + ], + [ + 651.0, + 325.0 + ] + ], + "center_px": [ + 648.75, + 329.75 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 803.0, + 323.0 + ], + [ + 820.0, + 319.0 + ], + [ + 834.0, + 324.0 + ], + [ + 818.0, + 329.0 + ] + ], + "center_px": [ + 818.75, + 323.75 + ], + "area_px": 156.0 + }, + { + "image_points_px": [ + [ + 366.0, + 320.0 + ], + [ + 345.0, + 324.0 + ], + [ + 335.0, + 319.0 + ], + [ + 356.0, + 315.0 + ] + ], + "center_px": [ + 350.5, + 319.5 + ], + "area_px": 145.0 + }, + { + "image_points_px": [ + [ + 192.0, + 365.0 + ], + [ + 172.0, + 370.0 + ], + [ + 162.0, + 363.0 + ], + [ + 183.0, + 359.0 + ] + ], + "center_px": [ + 177.25, + 364.25 + ], + "area_px": 176.0 + }, + { + "image_points_px": [ + [ + 333.0, + 319.0 + ], + [ + 313.0, + 323.0 + ], + [ + 302.0, + 318.0 + ], + [ + 322.0, + 314.0 + ] + ], + "center_px": [ + 317.5, + 318.5 + ], + "area_px": 144.0 + }, + { + "image_points_px": [ + [ + 466.0, + 324.0 + ], + [ + 487.0, + 320.0 + ], + [ + 497.0, + 325.0 + ], + [ + 479.0, + 329.0 + ] + ], + "center_px": [ + 482.25, + 324.5 + ], + "area_px": 143.5 + }, + { + "image_points_px": [ + [ + 505.0, + 313.0 + ], + [ + 524.0, + 309.0 + ], + [ + 536.0, + 314.0 + ], + [ + 516.0, + 318.0 + ] + ], + "center_px": [ + 520.25, + 313.5 + ], + "area_px": 143.5 + }, + { + "image_points_px": [ + [ + 566.0, + 327.0 + ], + [ + 586.0, + 323.0 + ], + [ + 597.0, + 328.0 + ], + [ + 578.0, + 332.0 + ] + ], + "center_px": [ + 581.75, + 327.5 + ], + "area_px": 143.5 + }, + { + "image_points_px": [ + [ + 541.0, + 303.0 + ], + [ + 522.0, + 307.0 + ], + [ + 510.0, + 302.0 + ], + [ + 529.0, + 298.0 + ] + ], + "center_px": [ + 525.5, + 302.5 + ], + "area_px": 143.0 + }, + { + "image_points_px": [ + [ + 503.0, + 313.0 + ], + [ + 484.0, + 317.0 + ], + [ + 472.0, + 312.0 + ], + [ + 491.0, + 308.0 + ] + ], + "center_px": [ + 487.5, + 312.5 + ], + "area_px": 143.0 + }, + { + "image_points_px": [ + [ + 636.0, + 318.0 + ], + [ + 655.0, + 314.0 + ], + [ + 667.0, + 319.0 + ], + [ + 650.0, + 323.0 + ] + ], + "center_px": [ + 652.0, + 318.5 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 736.0, + 321.0 + ], + [ + 754.0, + 317.0 + ], + [ + 767.0, + 322.0 + ], + [ + 749.0, + 326.0 + ] + ], + "center_px": [ + 751.5, + 321.5 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 803.0, + 312.0 + ], + [ + 821.0, + 308.0 + ], + [ + 834.0, + 313.0 + ], + [ + 818.0, + 317.0 + ] + ], + "center_px": [ + 819.0, + 312.5 + ], + "area_px": 141.0 + }, + { + "image_points_px": [ + [ + 901.0, + 304.0 + ], + [ + 918.0, + 300.0 + ], + [ + 932.0, + 305.0 + ], + [ + 916.0, + 309.0 + ] + ], + "center_px": [ + 916.75, + 304.5 + ], + "area_px": 140.5 + }, + { + "image_points_px": [ + [ + 868.0, + 303.0 + ], + [ + 884.0, + 299.0 + ], + [ + 899.0, + 304.0 + ], + [ + 884.0, + 308.0 + ] + ], + "center_px": [ + 883.75, + 303.5 + ], + "area_px": 139.5 + }, + { + "image_points_px": [ + [ + 172.0, + 313.0 + ], + [ + 151.0, + 318.0 + ], + [ + 142.0, + 312.0 + ], + [ + 162.0, + 308.0 + ] + ], + "center_px": [ + 156.75, + 312.75 + ], + "area_px": 155.5 + }, + { + "image_points_px": [ + [ + 170.0, + 350.0 + ], + [ + 150.0, + 355.0 + ], + [ + 140.0, + 349.0 + ], + [ + 161.0, + 345.0 + ] + ], + "center_px": [ + 155.25, + 349.75 + ], + "area_px": 155.5 + }, + { + "image_points_px": [ + [ + 258.0, + 328.0 + ], + [ + 238.0, + 333.0 + ], + [ + 228.0, + 327.0 + ], + [ + 249.0, + 323.0 + ] + ], + "center_px": [ + 243.25, + 327.75 + ], + "area_px": 155.5 + }, + { + "image_points_px": [ + [ + 63.0, + 321.0 + ], + [ + 41.0, + 326.0 + ], + [ + 33.0, + 321.0 + ], + [ + 54.0, + 316.0 + ] + ], + "center_px": [ + 47.75, + 321.0 + ], + "area_px": 150.0 + }, + { + "image_points_px": [ + [ + 291.0, + 329.0 + ], + [ + 271.0, + 334.0 + ], + [ + 261.0, + 328.0 + ], + [ + 281.0, + 324.0 + ] + ], + "center_px": [ + 276.0, + 328.75 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 464.0, + 323.0 + ], + [ + 445.0, + 328.0 + ], + [ + 434.0, + 322.0 + ], + [ + 453.0, + 318.0 + ] + ], + "center_px": [ + 449.0, + 322.75 + ], + "area_px": 154.0 + }, + { + "image_points_px": [ + [ + 431.0, + 322.0 + ], + [ + 412.0, + 327.0 + ], + [ + 401.0, + 321.0 + ], + [ + 420.0, + 317.0 + ] + ], + "center_px": [ + 416.0, + 321.75 + ], + "area_px": 154.0 + }, + { + "image_points_px": [ + [ + 127.0, + 324.0 + ], + [ + 106.0, + 328.0 + ], + [ + 97.0, + 323.0 + ], + [ + 120.0, + 319.0 + ] + ], + "center_px": [ + 112.5, + 323.5 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 140.0, + 312.0 + ], + [ + 117.0, + 316.0 + ], + [ + 110.0, + 311.0 + ], + [ + 131.0, + 307.0 + ] + ], + "center_px": [ + 124.5, + 311.5 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 160.0, + 325.0 + ], + [ + 138.0, + 329.0 + ], + [ + 130.0, + 324.0 + ], + [ + 152.0, + 320.0 + ] + ], + "center_px": [ + 145.0, + 324.5 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 76.0, + 310.0 + ], + [ + 54.0, + 314.0 + ], + [ + 46.0, + 309.0 + ], + [ + 68.0, + 305.0 + ] + ], + "center_px": [ + 61.0, + 309.5 + ], + "area_px": 142.0 + }, + { + "image_points_px": [ + [ + 530.0, + 326.0 + ], + [ + 511.0, + 330.0 + ], + [ + 500.0, + 325.0 + ], + [ + 517.0, + 320.0 + ] + ], + "center_px": [ + 514.5, + 325.25 + ], + "area_px": 153.0 + }, + { + "image_points_px": [ + [ + 568.0, + 315.0 + ], + [ + 551.0, + 320.0 + ], + [ + 538.0, + 314.0 + ], + [ + 556.0, + 310.0 + ] + ], + "center_px": [ + 553.25, + 314.75 + ], + "area_px": 152.5 + }, + { + "image_points_px": [ + [ + 108.0, + 311.0 + ], + [ + 86.0, + 315.0 + ], + [ + 78.0, + 310.0 + ], + [ + 99.0, + 306.0 + ] + ], + "center_px": [ + 92.75, + 310.5 + ], + "area_px": 141.5 + }, + { + "image_points_px": [ + [ + 634.0, + 317.0 + ], + [ + 617.0, + 322.0 + ], + [ + 604.0, + 316.0 + ], + [ + 621.0, + 312.0 + ] + ], + "center_px": [ + 619.0, + 316.75 + ], + "area_px": 152.0 + }, + { + "image_points_px": [ + [ + 571.0, + 315.0 + ], + [ + 588.0, + 311.0 + ], + [ + 601.0, + 316.0 + ], + [ + 584.0, + 321.0 + ] + ], + "center_px": [ + 586.0, + 315.75 + ], + "area_px": 152.0 + }, + { + "image_points_px": [ + [ + 238.0, + 316.0 + ], + [ + 260.0, + 312.0 + ], + [ + 268.0, + 317.0 + ], + [ + 248.0, + 321.0 + ] + ], + "center_px": [ + 253.5, + 316.5 + ], + "area_px": 141.0 + }, + { + "image_points_px": [ + [ + 183.0, + 302.0 + ], + [ + 161.0, + 306.0 + ], + [ + 153.0, + 301.0 + ], + [ + 173.0, + 297.0 + ] + ], + "center_px": [ + 167.5, + 301.5 + ], + "area_px": 141.0 + }, + { + "image_points_px": [ + [ + 800.0, + 312.0 + ], + [ + 785.0, + 316.0 + ], + [ + 770.0, + 311.0 + ], + [ + 786.0, + 306.0 + ] + ], + "center_px": [ + 785.25, + 311.25 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 837.0, + 324.0 + ], + [ + 853.0, + 320.0 + ], + [ + 867.0, + 325.0 + ], + [ + 852.0, + 330.0 + ] + ], + "center_px": [ + 852.25, + 324.75 + ], + "area_px": 150.5 + }, + { + "image_points_px": [ + [ + 300.0, + 318.0 + ], + [ + 280.0, + 322.0 + ], + [ + 270.0, + 317.0 + ], + [ + 291.0, + 313.0 + ] + ], + "center_px": [ + 285.25, + 317.5 + ], + "area_px": 140.5 + }, + { + "image_points_px": [ + [ + 408.0, + 310.0 + ], + [ + 427.0, + 306.0 + ], + [ + 438.0, + 311.0 + ], + [ + 419.0, + 315.0 + ] + ], + "center_px": [ + 423.0, + 310.5 + ], + "area_px": 139.0 + }, + { + "image_points_px": [ + [ + 738.0, + 309.0 + ], + [ + 756.0, + 306.0 + ], + [ + 768.0, + 311.0 + ], + [ + 752.0, + 315.0 + ] + ], + "center_px": [ + 753.5, + 310.25 + ], + "area_px": 139.0 + }, + { + "image_points_px": [ + [ + 543.0, + 303.0 + ], + [ + 561.0, + 299.0 + ], + [ + 573.0, + 304.0 + ], + [ + 554.0, + 308.0 + ] + ], + "center_px": [ + 557.75, + 303.5 + ], + "area_px": 138.5 + }, + { + "image_points_px": [ + [ + 508.0, + 302.0 + ], + [ + 490.0, + 306.0 + ], + [ + 478.0, + 301.0 + ], + [ + 497.0, + 297.0 + ] + ], + "center_px": [ + 493.25, + 301.5 + ], + "area_px": 138.5 + }, + { + "image_points_px": [ + [ + 470.0, + 312.0 + ], + [ + 452.0, + 316.0 + ], + [ + 440.0, + 311.0 + ], + [ + 459.0, + 307.0 + ] + ], + "center_px": [ + 455.25, + 311.5 + ], + "area_px": 138.5 + }, + { + "image_points_px": [ + [ + 420.0, + 288.0 + ], + [ + 401.0, + 292.0 + ], + [ + 390.0, + 287.0 + ], + [ + 408.0, + 283.0 + ] + ], + "center_px": [ + 404.75, + 287.5 + ], + "area_px": 138.5 + }, + { + "image_points_px": [ + [ + 575.0, + 304.0 + ], + [ + 592.0, + 300.0 + ], + [ + 605.0, + 305.0 + ], + [ + 586.0, + 309.0 + ] + ], + "center_px": [ + 589.5, + 304.5 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 607.0, + 305.0 + ], + [ + 625.0, + 301.0 + ], + [ + 637.0, + 306.0 + ], + [ + 619.0, + 310.0 + ] + ], + "center_px": [ + 622.0, + 305.5 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 640.0, + 306.0 + ], + [ + 656.0, + 302.0 + ], + [ + 670.0, + 307.0 + ], + [ + 651.0, + 311.0 + ] + ], + "center_px": [ + 654.25, + 306.5 + ], + "area_px": 137.5 + }, + { + "image_points_px": [ + [ + 577.0, + 293.0 + ], + [ + 559.0, + 297.0 + ], + [ + 547.0, + 292.0 + ], + [ + 564.0, + 288.0 + ] + ], + "center_px": [ + 561.75, + 292.5 + ], + "area_px": 137.5 + }, + { + "image_points_px": [ + [ + 702.0, + 308.0 + ], + [ + 684.0, + 312.0 + ], + [ + 672.0, + 307.0 + ], + [ + 688.0, + 303.0 + ] + ], + "center_px": [ + 686.5, + 307.5 + ], + "area_px": 137.0 + }, + { + "image_points_px": [ + [ + 837.0, + 313.0 + ], + [ + 853.0, + 309.0 + ], + [ + 867.0, + 314.0 + ], + [ + 850.0, + 318.0 + ] + ], + "center_px": [ + 851.75, + 313.5 + ], + "area_px": 136.5 + }, + { + "image_points_px": [ + [ + 836.0, + 302.0 + ], + [ + 853.0, + 298.0 + ], + [ + 866.0, + 303.0 + ], + [ + 851.0, + 307.0 + ] + ], + "center_px": [ + 851.5, + 302.5 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 870.0, + 314.0 + ], + [ + 886.0, + 310.0 + ], + [ + 900.0, + 315.0 + ], + [ + 884.0, + 319.0 + ] + ], + "center_px": [ + 885.0, + 314.5 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 836.0, + 291.0 + ], + [ + 851.0, + 287.0 + ], + [ + 866.0, + 292.0 + ], + [ + 850.0, + 296.0 + ] + ], + "center_px": [ + 850.75, + 291.5 + ], + "area_px": 135.5 + }, + { + "image_points_px": [ + [ + 804.0, + 290.0 + ], + [ + 820.0, + 286.0 + ], + [ + 834.0, + 291.0 + ], + [ + 819.0, + 295.0 + ] + ], + "center_px": [ + 819.25, + 290.5 + ], + "area_px": 135.5 + }, + { + "image_points_px": [ + [ + 868.0, + 292.0 + ], + [ + 883.0, + 288.0 + ], + [ + 898.0, + 293.0 + ], + [ + 883.0, + 297.0 + ] + ], + "center_px": [ + 883.0, + 292.5 + ], + "area_px": 135.0 + }, + { + "image_points_px": [ + [ + 804.0, + 300.0 + ], + [ + 821.0, + 297.0 + ], + [ + 834.0, + 302.0 + ], + [ + 816.0, + 305.0 + ] + ], + "center_px": [ + 818.75, + 301.0 + ], + "area_px": 125.0 + }, + { + "image_points_px": [ + [ + 739.0, + 298.0 + ], + [ + 756.0, + 295.0 + ], + [ + 769.0, + 300.0 + ], + [ + 752.0, + 303.0 + ] + ], + "center_px": [ + 754.0, + 299.0 + ], + "area_px": 124.0 + }, + { + "image_points_px": [ + [ + 708.0, + 287.0 + ], + [ + 726.0, + 283.0 + ], + [ + 738.0, + 288.0 + ], + [ + 719.0, + 291.0 + ] + ], + "center_px": [ + 722.75, + 287.25 + ], + "area_px": 123.5 + }, + { + "image_points_px": [ + [ + 705.0, + 308.0 + ], + [ + 723.0, + 305.0 + ], + [ + 735.0, + 309.0 + ], + [ + 717.0, + 313.0 + ] + ], + "center_px": [ + 720.0, + 308.75 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 772.0, + 289.0 + ], + [ + 788.0, + 285.0 + ], + [ + 802.0, + 290.0 + ], + [ + 784.0, + 293.0 + ] + ], + "center_px": [ + 786.5, + 289.25 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 707.0, + 297.0 + ], + [ + 723.0, + 294.0 + ], + [ + 737.0, + 298.0 + ], + [ + 720.0, + 302.0 + ] + ], + "center_px": [ + 721.75, + 297.75 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 740.0, + 288.0 + ], + [ + 755.0, + 284.0 + ], + [ + 770.0, + 289.0 + ], + [ + 753.0, + 292.0 + ] + ], + "center_px": [ + 754.5, + 288.25 + ], + "area_px": 121.0 + }, + { + "image_points_px": [ + [ + 44.0, + 309.0 + ], + [ + 22.0, + 313.0 + ], + [ + 15.0, + 308.0 + ], + [ + 37.0, + 304.0 + ] + ], + "center_px": [ + 29.5, + 308.5 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 309.0, + 307.0 + ], + [ + 290.0, + 311.0 + ], + [ + 280.0, + 306.0 + ], + [ + 299.0, + 301.0 + ] + ], + "center_px": [ + 294.5, + 306.25 + ], + "area_px": 149.5 + }, + { + "image_points_px": [ + [ + 203.0, + 314.0 + ], + [ + 183.0, + 319.0 + ], + [ + 174.0, + 314.0 + ], + [ + 194.0, + 309.0 + ] + ], + "center_px": [ + 188.5, + 314.0 + ], + "area_px": 145.0 + }, + { + "image_points_px": [ + [ + 57.0, + 298.0 + ], + [ + 36.0, + 302.0 + ], + [ + 28.0, + 297.0 + ], + [ + 50.0, + 293.0 + ] + ], + "center_px": [ + 42.75, + 297.5 + ], + "area_px": 137.5 + }, + { + "image_points_px": [ + [ + 89.0, + 299.0 + ], + [ + 67.0, + 303.0 + ], + [ + 60.0, + 298.0 + ], + [ + 80.0, + 294.0 + ] + ], + "center_px": [ + 74.0, + 298.5 + ], + "area_px": 137.0 + }, + { + "image_points_px": [ + [ + 151.0, + 301.0 + ], + [ + 130.0, + 305.0 + ], + [ + 122.0, + 300.0 + ], + [ + 143.0, + 296.0 + ] + ], + "center_px": [ + 136.5, + 300.5 + ], + "area_px": 137.0 + }, + { + "image_points_px": [ + [ + 206.0, + 315.0 + ], + [ + 228.0, + 311.0 + ], + [ + 235.0, + 316.0 + ], + [ + 216.0, + 320.0 + ] + ], + "center_px": [ + 221.25, + 315.5 + ], + "area_px": 136.5 + }, + { + "image_points_px": [ + [ + 120.0, + 300.0 + ], + [ + 99.0, + 304.0 + ], + [ + 91.0, + 299.0 + ], + [ + 111.0, + 295.0 + ] + ], + "center_px": [ + 105.25, + 299.5 + ], + "area_px": 136.5 + }, + { + "image_points_px": [ + [ + 214.0, + 303.0 + ], + [ + 193.0, + 307.0 + ], + [ + 185.0, + 302.0 + ], + [ + 204.0, + 298.0 + ] + ], + "center_px": [ + 199.0, + 302.5 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 373.0, + 309.0 + ], + [ + 352.0, + 312.0 + ], + [ + 344.0, + 308.0 + ], + [ + 362.0, + 303.0 + ] + ], + "center_px": [ + 357.75, + 308.0 + ], + "area_px": 135.5 + }, + { + "image_points_px": [ + [ + 581.0, + 393.0 + ], + [ + 597.0, + 388.0 + ], + [ + 609.0, + 394.0 + ], + [ + 592.0, + 400.0 + ] + ], + "center_px": [ + 594.75, + 393.75 + ], + "area_px": 170.5 + }, + { + "image_points_px": [ + [ + 405.0, + 310.0 + ], + [ + 387.0, + 314.0 + ], + [ + 376.0, + 309.0 + ], + [ + 396.0, + 305.0 + ] + ], + "center_px": [ + 391.0, + 309.5 + ], + "area_px": 135.0 + }, + { + "image_points_px": [ + [ + 349.0, + 297.0 + ], + [ + 331.0, + 301.0 + ], + [ + 320.0, + 296.0 + ], + [ + 340.0, + 292.0 + ] + ], + "center_px": [ + 335.0, + 296.5 + ], + "area_px": 135.0 + }, + { + "image_points_px": [ + [ + 476.0, + 301.0 + ], + [ + 458.0, + 305.0 + ], + [ + 447.0, + 300.0 + ], + [ + 466.0, + 296.0 + ] + ], + "center_px": [ + 461.75, + 300.5 + ], + "area_px": 134.5 + }, + { + "image_points_px": [ + [ + 412.0, + 299.0 + ], + [ + 394.0, + 303.0 + ], + [ + 383.0, + 298.0 + ], + [ + 402.0, + 294.0 + ] + ], + "center_px": [ + 397.75, + 298.5 + ], + "area_px": 134.5 + }, + { + "image_points_px": [ + [ + 357.0, + 286.0 + ], + [ + 339.0, + 290.0 + ], + [ + 328.0, + 285.0 + ], + [ + 347.0, + 281.0 + ] + ], + "center_px": [ + 342.75, + 285.5 + ], + "area_px": 134.5 + }, + { + "image_points_px": [ + [ + 1077.0, + 539.0 + ], + [ + 1084.0, + 526.0 + ], + [ + 1102.0, + 533.0 + ], + [ + 1085.0, + 541.0 + ] + ], + "center_px": [ + 1087.0, + 534.75 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 101.0, + 288.0 + ], + [ + 80.0, + 292.0 + ], + [ + 72.0, + 287.0 + ], + [ + 93.0, + 284.0 + ] + ], + "center_px": [ + 86.5, + 287.75 + ], + "area_px": 122.5 + }, + { + "image_points_px": [ + [ + 341.0, + 308.0 + ], + [ + 321.0, + 311.0 + ], + [ + 312.0, + 306.0 + ], + [ + 331.0, + 303.0 + ] + ], + "center_px": [ + 326.25, + 307.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 606.0, + 118.0 + ], + [ + 605.0, + 121.0 + ], + [ + 577.0, + 120.0 + ], + [ + 595.0, + 116.0 + ] + ], + "center_px": [ + 595.75, + 118.75 + ], + "area_px": 82.5 + }, + { + "image_points_px": [ + [ + 236.0, + 282.0 + ], + [ + 257.0, + 279.0 + ], + [ + 265.0, + 283.0 + ], + [ + 246.0, + 287.0 + ] + ], + "center_px": [ + 251.0, + 282.75 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 544.0, + 392.0 + ], + [ + 562.0, + 387.0 + ], + [ + 572.0, + 393.0 + ], + [ + 554.0, + 398.0 + ] + ], + "center_px": [ + 558.0, + 392.5 + ], + "area_px": 158.0 + }, + { + "image_points_px": [ + [ + 359.0, + 286.0 + ], + [ + 380.0, + 283.0 + ], + [ + 388.0, + 287.0 + ], + [ + 370.0, + 291.0 + ] + ], + "center_px": [ + 374.25, + 286.75 + ], + "area_px": 121.0 + }, + { + "image_points_px": [ + [ + 453.0, + 289.0 + ], + [ + 473.0, + 286.0 + ], + [ + 482.0, + 290.0 + ], + [ + 463.0, + 294.0 + ] + ], + "center_px": [ + 467.75, + 289.75 + ], + "area_px": 121.0 + }, + { + "image_points_px": [ + [ + 643.0, + 295.0 + ], + [ + 661.0, + 292.0 + ], + [ + 672.0, + 297.0 + ], + [ + 654.0, + 300.0 + ] + ], + "center_px": [ + 657.5, + 296.0 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 248.0, + 305.0 + ], + [ + 269.0, + 301.0 + ], + [ + 277.0, + 305.0 + ], + [ + 256.0, + 309.0 + ] + ], + "center_px": [ + 262.5, + 305.0 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 444.0, + 300.0 + ], + [ + 424.0, + 303.0 + ], + [ + 415.0, + 299.0 + ], + [ + 433.0, + 295.0 + ] + ], + "center_px": [ + 429.0, + 299.25 + ], + "area_px": 120.5 + }, + { + "image_points_px": [ + [ + 318.0, + 295.0 + ], + [ + 297.0, + 299.0 + ], + [ + 289.0, + 295.0 + ], + [ + 309.0, + 291.0 + ] + ], + "center_px": [ + 303.25, + 295.0 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 772.0, + 299.0 + ], + [ + 788.0, + 296.0 + ], + [ + 801.0, + 301.0 + ], + [ + 783.0, + 304.0 + ] + ], + "center_px": [ + 786.0, + 300.0 + ], + "area_px": 121.0 + }, + { + "image_points_px": [ + [ + 611.0, + 294.0 + ], + [ + 630.0, + 291.0 + ], + [ + 640.0, + 295.0 + ], + [ + 623.0, + 299.0 + ] + ], + "center_px": [ + 626.0, + 294.75 + ], + "area_px": 119.5 + }, + { + "image_points_px": [ + [ + 581.0, + 283.0 + ], + [ + 562.0, + 286.0 + ], + [ + 552.0, + 282.0 + ], + [ + 569.0, + 278.0 + ] + ], + "center_px": [ + 566.0, + 282.25 + ], + "area_px": 119.5 + }, + { + "image_points_px": [ + [ + 646.0, + 285.0 + ], + [ + 663.0, + 281.0 + ], + [ + 675.0, + 286.0 + ], + [ + 656.0, + 289.0 + ] + ], + "center_px": [ + 660.0, + 285.25 + ], + "area_px": 119.5 + }, + { + "image_points_px": [ + [ + 612.0, + 284.0 + ], + [ + 594.0, + 287.0 + ], + [ + 583.0, + 283.0 + ], + [ + 600.0, + 279.0 + ] + ], + "center_px": [ + 597.25, + 283.25 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 579.0, + 293.0 + ], + [ + 597.0, + 290.0 + ], + [ + 608.0, + 294.0 + ], + [ + 592.0, + 298.0 + ] + ], + "center_px": [ + 594.0, + 293.75 + ], + "area_px": 118.5 + }, + { + "image_points_px": [ + [ + 677.0, + 286.0 + ], + [ + 693.0, + 282.0 + ], + [ + 706.0, + 287.0 + ], + [ + 688.0, + 290.0 + ] + ], + "center_px": [ + 691.0, + 286.25 + ], + "area_px": 118.5 + }, + { + "image_points_px": [ + [ + 836.0, + 280.0 + ], + [ + 852.0, + 277.0 + ], + [ + 865.0, + 281.0 + ], + [ + 848.0, + 285.0 + ] + ], + "center_px": [ + 850.25, + 280.75 + ], + "area_px": 118.0 + }, + { + "image_points_px": [ + [ + 675.0, + 296.0 + ], + [ + 692.0, + 293.0 + ], + [ + 704.0, + 297.0 + ], + [ + 688.0, + 301.0 + ] + ], + "center_px": [ + 689.75, + 296.75 + ], + "area_px": 118.0 + }, + { + "image_points_px": [ + [ + 899.0, + 282.0 + ], + [ + 914.0, + 279.0 + ], + [ + 928.0, + 284.0 + ], + [ + 914.0, + 287.0 + ] + ], + "center_px": [ + 913.75, + 283.0 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 804.0, + 279.0 + ], + [ + 819.0, + 276.0 + ], + [ + 833.0, + 281.0 + ], + [ + 819.0, + 284.0 + ] + ], + "center_px": [ + 818.75, + 280.0 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 773.0, + 278.0 + ], + [ + 788.0, + 275.0 + ], + [ + 802.0, + 279.0 + ], + [ + 786.0, + 283.0 + ] + ], + "center_px": [ + 787.25, + 278.75 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 1147.0, + 430.0 + ], + [ + 1133.0, + 436.0 + ], + [ + 1119.0, + 432.0 + ], + [ + 1135.0, + 425.0 + ] + ], + "center_px": [ + 1133.5, + 430.75 + ], + "area_px": 152.0 + }, + { + "image_points_px": [ + [ + 960.0, + 274.0 + ], + [ + 976.0, + 271.0 + ], + [ + 989.0, + 275.0 + ], + [ + 975.0, + 279.0 + ] + ], + "center_px": [ + 975.0, + 274.75 + ], + "area_px": 116.5 + }, + { + "image_points_px": [ + [ + 931.0, + 283.0 + ], + [ + 946.0, + 280.0 + ], + [ + 960.0, + 284.0 + ], + [ + 945.0, + 288.0 + ] + ], + "center_px": [ + 945.5, + 283.75 + ], + "area_px": 116.5 + }, + { + "image_points_px": [ + [ + 897.0, + 262.0 + ], + [ + 911.0, + 259.0 + ], + [ + 926.0, + 263.0 + ], + [ + 911.0, + 267.0 + ] + ], + "center_px": [ + 911.25, + 262.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 836.0, + 270.0 + ], + [ + 850.0, + 267.0 + ], + [ + 865.0, + 271.0 + ], + [ + 850.0, + 275.0 + ] + ], + "center_px": [ + 850.25, + 270.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 992.0, + 275.0 + ], + [ + 1007.0, + 272.0 + ], + [ + 1021.0, + 276.0 + ], + [ + 1007.0, + 280.0 + ] + ], + "center_px": [ + 1006.75, + 275.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 929.0, + 273.0 + ], + [ + 944.0, + 270.0 + ], + [ + 958.0, + 274.0 + ], + [ + 944.0, + 278.0 + ] + ], + "center_px": [ + 943.75, + 273.75 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 963.0, + 284.0 + ], + [ + 977.0, + 281.0 + ], + [ + 992.0, + 285.0 + ], + [ + 978.0, + 289.0 + ] + ], + "center_px": [ + 977.5, + 284.75 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 898.0, + 272.0 + ], + [ + 912.0, + 269.0 + ], + [ + 927.0, + 273.0 + ], + [ + 913.0, + 277.0 + ] + ], + "center_px": [ + 912.5, + 272.75 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 989.0, + 265.0 + ], + [ + 1003.0, + 262.0 + ], + [ + 1018.0, + 266.0 + ], + [ + 1005.0, + 270.0 + ] + ], + "center_px": [ + 1003.75, + 265.75 + ], + "area_px": 115.0 + }, + { + "image_points_px": [ + [ + 336.0, + 275.0 + ], + [ + 357.0, + 272.0 + ], + [ + 365.0, + 276.0 + ], + [ + 346.0, + 279.0 + ] + ], + "center_px": [ + 351.0, + 275.5 + ], + "area_px": 107.0 + }, + { + "image_points_px": [ + [ + 422.0, + 288.0 + ], + [ + 441.0, + 285.0 + ], + [ + 451.0, + 289.0 + ], + [ + 431.0, + 292.0 + ] + ], + "center_px": [ + 436.25, + 288.5 + ], + "area_px": 106.5 + }, + { + "image_points_px": [ + [ + 614.0, + 284.0 + ], + [ + 634.0, + 281.0 + ], + [ + 643.0, + 285.0 + ], + [ + 626.0, + 288.0 + ] + ], + "center_px": [ + 629.25, + 284.5 + ], + "area_px": 105.5 + }, + { + "image_points_px": [ + [ + 1020.0, + 266.0 + ], + [ + 1033.0, + 263.0 + ], + [ + 1049.0, + 267.0 + ], + [ + 1034.0, + 270.0 + ] + ], + "center_px": [ + 1034.0, + 266.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 1180.0, + 416.0 + ], + [ + 1166.0, + 422.0 + ], + [ + 1152.0, + 418.0 + ], + [ + 1167.0, + 412.0 + ] + ], + "center_px": [ + 1166.25, + 417.0 + ], + "area_px": 139.0 + }, + { + "image_points_px": [ + [ + 70.0, + 287.0 + ], + [ + 49.0, + 291.0 + ], + [ + 42.0, + 286.0 + ], + [ + 63.0, + 283.0 + ] + ], + "center_px": [ + 56.0, + 286.75 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 39.0, + 286.0 + ], + [ + 18.0, + 290.0 + ], + [ + 11.0, + 285.0 + ], + [ + 32.0, + 282.0 + ] + ], + "center_px": [ + 25.0, + 285.75 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 326.0, + 285.0 + ], + [ + 308.0, + 289.0 + ], + [ + 298.0, + 284.0 + ], + [ + 316.0, + 280.0 + ] + ], + "center_px": [ + 312.0, + 284.5 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 162.0, + 290.0 + ], + [ + 141.0, + 294.0 + ], + [ + 134.0, + 289.0 + ], + [ + 154.0, + 286.0 + ] + ], + "center_px": [ + 147.75, + 289.75 + ], + "area_px": 118.5 + }, + { + "image_points_px": [ + [ + 224.0, + 292.0 + ], + [ + 204.0, + 296.0 + ], + [ + 196.0, + 291.0 + ], + [ + 215.0, + 288.0 + ] + ], + "center_px": [ + 209.75, + 291.75 + ], + "area_px": 117.5 + }, + { + "image_points_px": [ + [ + 193.0, + 291.0 + ], + [ + 173.0, + 295.0 + ], + [ + 165.0, + 290.0 + ], + [ + 184.0, + 287.0 + ] + ], + "center_px": [ + 178.75, + 290.75 + ], + "area_px": 117.5 + }, + { + "image_points_px": [ + [ + 286.0, + 295.0 + ], + [ + 266.0, + 298.0 + ], + [ + 258.0, + 294.0 + ], + [ + 277.0, + 290.0 + ] + ], + "center_px": [ + 271.75, + 294.25 + ], + "area_px": 117.5 + }, + { + "image_points_px": [ + [ + 933.0, + 294.0 + ], + [ + 947.0, + 290.0 + ], + [ + 961.0, + 295.0 + ], + [ + 947.0, + 299.0 + ] + ], + "center_px": [ + 947.0, + 294.5 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 380.0, + 298.0 + ], + [ + 361.0, + 301.0 + ], + [ + 352.0, + 297.0 + ], + [ + 371.0, + 293.0 + ] + ], + "center_px": [ + 366.0, + 297.25 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 304.0, + 274.0 + ], + [ + 284.0, + 277.0 + ], + [ + 276.0, + 273.0 + ], + [ + 294.0, + 269.0 + ] + ], + "center_px": [ + 289.5, + 273.25 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 267.0, + 283.0 + ], + [ + 287.0, + 280.0 + ], + [ + 295.0, + 284.0 + ], + [ + 277.0, + 288.0 + ] + ], + "center_px": [ + 281.5, + 283.75 + ], + "area_px": 117.0 + }, + { + "image_points_px": [ + [ + 131.0, + 289.0 + ], + [ + 111.0, + 293.0 + ], + [ + 103.0, + 289.0 + ], + [ + 124.0, + 285.0 + ] + ], + "center_px": [ + 117.25, + 289.0 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 334.0, + 275.0 + ], + [ + 315.0, + 278.0 + ], + [ + 306.0, + 274.0 + ], + [ + 324.0, + 270.0 + ] + ], + "center_px": [ + 319.75, + 274.25 + ], + "area_px": 116.5 + }, + { + "image_points_px": [ + [ + 402.0, + 267.0 + ], + [ + 383.0, + 270.0 + ], + [ + 374.0, + 266.0 + ], + [ + 392.0, + 262.0 + ] + ], + "center_px": [ + 387.75, + 266.25 + ], + "area_px": 116.5 + }, + { + "image_points_px": [ + [ + 342.0, + 265.0 + ], + [ + 323.0, + 268.0 + ], + [ + 314.0, + 264.0 + ], + [ + 332.0, + 260.0 + ] + ], + "center_px": [ + 327.75, + 264.25 + ], + "area_px": 116.5 + }, + { + "image_points_px": [ + [ + 52.0, + 276.0 + ], + [ + 31.0, + 279.0 + ], + [ + 24.0, + 275.0 + ], + [ + 46.0, + 272.0 + ] + ], + "center_px": [ + 38.25, + 275.5 + ], + "area_px": 105.5 + }, + { + "image_points_px": [ + [ + 456.0, + 279.0 + ], + [ + 438.0, + 282.0 + ], + [ + 428.0, + 278.0 + ], + [ + 446.0, + 274.0 + ] + ], + "center_px": [ + 442.0, + 278.25 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 426.0, + 278.0 + ], + [ + 407.0, + 281.0 + ], + [ + 398.0, + 277.0 + ], + [ + 415.0, + 273.0 + ] + ], + "center_px": [ + 411.5, + 277.25 + ], + "area_px": 116.0 + }, + { + "image_points_px": [ + [ + 215.0, + 271.0 + ], + [ + 237.0, + 268.0 + ], + [ + 243.0, + 272.0 + ], + [ + 223.0, + 275.0 + ] + ], + "center_px": [ + 229.5, + 271.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 549.0, + 282.0 + ], + [ + 531.0, + 285.0 + ], + [ + 521.0, + 281.0 + ], + [ + 538.0, + 277.0 + ] + ], + "center_px": [ + 534.75, + 281.25 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 518.0, + 281.0 + ], + [ + 500.0, + 284.0 + ], + [ + 490.0, + 280.0 + ], + [ + 507.0, + 276.0 + ] + ], + "center_px": [ + 503.75, + 280.25 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 487.0, + 280.0 + ], + [ + 469.0, + 283.0 + ], + [ + 459.0, + 279.0 + ], + [ + 476.0, + 275.0 + ] + ], + "center_px": [ + 472.75, + 279.25 + ], + "area_px": 115.5 + }, + { + "image_points_px": [ + [ + 145.0, + 279.0 + ], + [ + 166.0, + 276.0 + ], + [ + 173.0, + 280.0 + ], + [ + 152.0, + 283.0 + ] + ], + "center_px": [ + 159.0, + 279.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 82.0, + 277.0 + ], + [ + 61.0, + 280.0 + ], + [ + 54.0, + 276.0 + ], + [ + 75.0, + 273.0 + ] + ], + "center_px": [ + 68.0, + 276.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 523.0, + 271.0 + ], + [ + 506.0, + 274.0 + ], + [ + 495.0, + 270.0 + ], + [ + 512.0, + 266.0 + ] + ], + "center_px": [ + 509.0, + 270.25 + ], + "area_px": 115.0 + }, + { + "image_points_px": [ + [ + 493.0, + 270.0 + ], + [ + 476.0, + 273.0 + ], + [ + 465.0, + 269.0 + ], + [ + 482.0, + 265.0 + ] + ], + "center_px": [ + 479.0, + 269.25 + ], + "area_px": 115.0 + }, + { + "image_points_px": [ + [ + 742.0, + 277.0 + ], + [ + 758.0, + 274.0 + ], + [ + 770.0, + 279.0 + ], + [ + 755.0, + 282.0 + ] + ], + "center_px": [ + 756.25, + 278.0 + ], + "area_px": 115.0 + }, + { + "image_points_px": [ + [ + 680.0, + 275.0 + ], + [ + 695.0, + 272.0 + ], + [ + 708.0, + 277.0 + ], + [ + 692.0, + 280.0 + ] + ], + "center_px": [ + 693.75, + 276.0 + ], + "area_px": 115.0 + }, + { + "image_points_px": [ + [ + 649.0, + 274.0 + ], + [ + 664.0, + 271.0 + ], + [ + 677.0, + 276.0 + ], + [ + 661.0, + 279.0 + ] + ], + "center_px": [ + 662.75, + 275.0 + ], + "area_px": 115.0 + }, + { + "image_points_px": [ + [ + 619.0, + 264.0 + ], + [ + 602.0, + 267.0 + ], + [ + 591.0, + 263.0 + ], + [ + 607.0, + 259.0 + ] + ], + "center_px": [ + 604.75, + 263.25 + ], + "area_px": 114.5 + }, + { + "image_points_px": [ + [ + 615.0, + 274.0 + ], + [ + 599.0, + 277.0 + ], + [ + 587.0, + 273.0 + ], + [ + 603.0, + 269.0 + ] + ], + "center_px": [ + 601.0, + 273.25 + ], + "area_px": 114.0 + }, + { + "image_points_px": [ + [ + 646.0, + 275.0 + ], + [ + 631.0, + 278.0 + ], + [ + 618.0, + 274.0 + ], + [ + 634.0, + 270.0 + ] + ], + "center_px": [ + 632.25, + 274.25 + ], + "area_px": 113.5 + }, + { + "image_points_px": [ + [ + 741.0, + 267.0 + ], + [ + 725.0, + 271.0 + ], + [ + 713.0, + 266.0 + ], + [ + 728.0, + 263.0 + ] + ], + "center_px": [ + 726.75, + 266.75 + ], + "area_px": 113.5 + }, + { + "image_points_px": [ + [ + 805.0, + 269.0 + ], + [ + 821.0, + 266.0 + ], + [ + 833.0, + 270.0 + ], + [ + 818.0, + 274.0 + ] + ], + "center_px": [ + 819.25, + 269.75 + ], + "area_px": 113.5 + }, + { + "image_points_px": [ + [ + 739.0, + 277.0 + ], + [ + 724.0, + 281.0 + ], + [ + 711.0, + 276.0 + ], + [ + 727.0, + 273.0 + ] + ], + "center_px": [ + 725.25, + 276.75 + ], + "area_px": 113.5 + }, + { + "image_points_px": [ + [ + 868.0, + 281.0 + ], + [ + 882.0, + 278.0 + ], + [ + 896.0, + 283.0 + ], + [ + 882.0, + 286.0 + ] + ], + "center_px": [ + 882.0, + 282.0 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 284.0, + 263.0 + ], + [ + 305.0, + 260.0 + ], + [ + 312.0, + 264.0 + ], + [ + 293.0, + 267.0 + ] + ], + "center_px": [ + 298.5, + 263.5 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 867.0, + 271.0 + ], + [ + 883.0, + 268.0 + ], + [ + 895.0, + 272.0 + ], + [ + 881.0, + 276.0 + ] + ], + "center_px": [ + 881.5, + 271.75 + ], + "area_px": 113.0 + }, + { + "image_points_px": [ + [ + 710.0, + 267.0 + ], + [ + 695.0, + 270.0 + ], + [ + 682.0, + 266.0 + ], + [ + 697.0, + 262.0 + ] + ], + "center_px": [ + 696.0, + 266.25 + ], + "area_px": 113.0 + }, + { + "image_points_px": [ + [ + 802.0, + 269.0 + ], + [ + 788.0, + 273.0 + ], + [ + 774.0, + 268.0 + ], + [ + 788.0, + 265.0 + ] + ], + "center_px": [ + 788.0, + 268.75 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 864.0, + 261.0 + ], + [ + 850.0, + 265.0 + ], + [ + 836.0, + 260.0 + ], + [ + 850.0, + 257.0 + ] + ], + "center_px": [ + 850.0, + 260.75 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 928.0, + 263.0 + ], + [ + 942.0, + 260.0 + ], + [ + 956.0, + 264.0 + ], + [ + 943.0, + 268.0 + ] + ], + "center_px": [ + 942.25, + 263.75 + ], + "area_px": 111.5 + }, + { + "image_points_px": [ + [ + 344.0, + 265.0 + ], + [ + 364.0, + 262.0 + ], + [ + 372.0, + 266.0 + ], + [ + 353.0, + 269.0 + ] + ], + "center_px": [ + 358.25, + 265.5 + ], + "area_px": 103.5 + }, + { + "image_points_px": [ + [ + 367.0, + 276.0 + ], + [ + 387.0, + 273.0 + ], + [ + 395.0, + 277.0 + ], + [ + 376.0, + 280.0 + ] + ], + "center_px": [ + 381.25, + 276.5 + ], + "area_px": 103.5 + }, + { + "image_points_px": [ + [ + 404.0, + 267.0 + ], + [ + 424.0, + 264.0 + ], + [ + 432.0, + 268.0 + ], + [ + 415.0, + 271.0 + ] + ], + "center_px": [ + 418.75, + 267.5 + ], + "area_px": 102.5 + }, + { + "image_points_px": [ + [ + 500.0, + 260.0 + ], + [ + 519.0, + 257.0 + ], + [ + 528.0, + 261.0 + ], + [ + 510.0, + 264.0 + ] + ], + "center_px": [ + 514.25, + 260.5 + ], + "area_px": 102.5 + }, + { + "image_points_px": [ + [ + 530.0, + 261.0 + ], + [ + 549.0, + 258.0 + ], + [ + 558.0, + 262.0 + ], + [ + 541.0, + 265.0 + ] + ], + "center_px": [ + 544.5, + 261.5 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 441.0, + 258.0 + ], + [ + 458.0, + 255.0 + ], + [ + 469.0, + 259.0 + ], + [ + 450.0, + 262.0 + ] + ], + "center_px": [ + 454.5, + 258.5 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 594.0, + 253.0 + ], + [ + 611.0, + 250.0 + ], + [ + 622.0, + 254.0 + ], + [ + 604.0, + 257.0 + ] + ], + "center_px": [ + 607.75, + 253.5 + ], + "area_px": 101.5 + }, + { + "image_points_px": [ + [ + 714.0, + 257.0 + ], + [ + 732.0, + 254.0 + ], + [ + 742.0, + 258.0 + ], + [ + 726.0, + 261.0 + ] + ], + "center_px": [ + 728.5, + 257.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 959.0, + 264.0 + ], + [ + 976.0, + 262.0 + ], + [ + 987.0, + 265.0 + ], + [ + 973.0, + 269.0 + ] + ], + "center_px": [ + 973.75, + 265.0 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 684.0, + 256.0 + ], + [ + 701.0, + 253.0 + ], + [ + 712.0, + 257.0 + ], + [ + 695.0, + 260.0 + ] + ], + "center_px": [ + 698.0, + 256.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 624.0, + 254.0 + ], + [ + 641.0, + 251.0 + ], + [ + 652.0, + 255.0 + ], + [ + 635.0, + 258.0 + ] + ], + "center_px": [ + 638.0, + 254.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 775.0, + 259.0 + ], + [ + 792.0, + 256.0 + ], + [ + 803.0, + 260.0 + ], + [ + 787.0, + 263.0 + ] + ], + "center_px": [ + 789.25, + 259.5 + ], + "area_px": 100.5 + }, + { + "image_points_px": [ + [ + 654.0, + 255.0 + ], + [ + 670.0, + 252.0 + ], + [ + 682.0, + 256.0 + ], + [ + 665.0, + 259.0 + ] + ], + "center_px": [ + 667.75, + 255.5 + ], + "area_px": 100.5 + }, + { + "image_points_px": [ + [ + 621.0, + 264.0 + ], + [ + 639.0, + 261.0 + ], + [ + 649.0, + 264.0 + ], + [ + 633.0, + 268.0 + ] + ], + "center_px": [ + 635.5, + 264.25 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 956.0, + 255.0 + ], + [ + 972.0, + 252.0 + ], + [ + 984.0, + 256.0 + ], + [ + 969.0, + 259.0 + ] + ], + "center_px": [ + 970.25, + 255.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 805.0, + 250.0 + ], + [ + 820.0, + 247.0 + ], + [ + 833.0, + 251.0 + ], + [ + 817.0, + 254.0 + ] + ], + "center_px": [ + 818.75, + 250.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 805.0, + 260.0 + ], + [ + 821.0, + 257.0 + ], + [ + 833.0, + 261.0 + ], + [ + 819.0, + 264.0 + ] + ], + "center_px": [ + 819.5, + 260.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 744.0, + 258.0 + ], + [ + 760.0, + 255.0 + ], + [ + 772.0, + 259.0 + ], + [ + 758.0, + 262.0 + ] + ], + "center_px": [ + 758.5, + 258.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 835.0, + 251.0 + ], + [ + 850.0, + 248.0 + ], + [ + 863.0, + 252.0 + ], + [ + 848.0, + 255.0 + ] + ], + "center_px": [ + 849.0, + 251.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 987.0, + 256.0 + ], + [ + 1002.0, + 253.0 + ], + [ + 1015.0, + 257.0 + ], + [ + 1001.0, + 260.0 + ] + ], + "center_px": [ + 1001.25, + 256.5 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 926.0, + 254.0 + ], + [ + 941.0, + 251.0 + ], + [ + 954.0, + 255.0 + ], + [ + 941.0, + 258.0 + ] + ], + "center_px": [ + 940.5, + 254.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 535.0, + 251.0 + ], + [ + 554.0, + 249.0 + ], + [ + 563.0, + 252.0 + ], + [ + 545.0, + 255.0 + ] + ], + "center_px": [ + 549.25, + 251.75 + ], + "area_px": 88.5 + }, + { + "image_points_px": [ + [ + 954.0, + 245.0 + ], + [ + 970.0, + 243.0 + ], + [ + 982.0, + 246.0 + ], + [ + 966.0, + 249.0 + ] + ], + "center_px": [ + 968.0, + 245.75 + ], + "area_px": 86.0 + }, + { + "image_points_px": [ + [ + 864.0, + 243.0 + ], + [ + 879.0, + 240.0 + ], + [ + 892.0, + 244.0 + ], + [ + 875.0, + 246.0 + ] + ], + "center_px": [ + 877.5, + 243.25 + ], + "area_px": 86.0 + }, + { + "image_points_px": [ + [ + 894.0, + 244.0 + ], + [ + 909.0, + 241.0 + ], + [ + 922.0, + 245.0 + ], + [ + 906.0, + 247.0 + ] + ], + "center_px": [ + 907.75, + 244.25 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 135.0, + 258.0 + ], + [ + 116.0, + 262.0 + ], + [ + 108.0, + 257.0 + ], + [ + 127.0, + 254.0 + ] + ], + "center_px": [ + 121.5, + 257.75 + ], + "area_px": 113.5 + }, + { + "image_points_px": [ + [ + 194.0, + 260.0 + ], + [ + 175.0, + 264.0 + ], + [ + 167.0, + 259.0 + ], + [ + 185.0, + 256.0 + ] + ], + "center_px": [ + 180.25, + 259.75 + ], + "area_px": 113.0 + }, + { + "image_points_px": [ + [ + 47.0, + 255.0 + ], + [ + 27.0, + 259.0 + ], + [ + 20.0, + 255.0 + ], + [ + 40.0, + 251.0 + ] + ], + "center_px": [ + 33.5, + 255.0 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 273.0, + 273.0 + ], + [ + 254.0, + 276.0 + ], + [ + 246.0, + 272.0 + ], + [ + 264.0, + 268.0 + ] + ], + "center_px": [ + 259.25, + 272.25 + ], + "area_px": 113.0 + }, + { + "image_points_px": [ + [ + 379.0, + 256.0 + ], + [ + 362.0, + 260.0 + ], + [ + 352.0, + 255.0 + ], + [ + 370.0, + 252.0 + ] + ], + "center_px": [ + 365.75, + 255.75 + ], + "area_px": 112.0 + }, + { + "image_points_px": [ + [ + 164.0, + 259.0 + ], + [ + 145.0, + 263.0 + ], + [ + 137.0, + 259.0 + ], + [ + 156.0, + 255.0 + ] + ], + "center_px": [ + 150.5, + 259.0 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 35.0, + 265.0 + ], + [ + 14.0, + 268.0 + ], + [ + 8.0, + 264.0 + ], + [ + 28.0, + 261.0 + ] + ], + "center_px": [ + 21.25, + 264.5 + ], + "area_px": 101.5 + }, + { + "image_points_px": [ + [ + 462.0, + 269.0 + ], + [ + 444.0, + 272.0 + ], + [ + 435.0, + 268.0 + ], + [ + 451.0, + 264.0 + ] + ], + "center_px": [ + 448.0, + 268.25 + ], + "area_px": 111.5 + }, + { + "image_points_px": [ + [ + 106.0, + 257.0 + ], + [ + 87.0, + 261.0 + ], + [ + 79.0, + 257.0 + ], + [ + 97.0, + 253.0 + ] + ], + "center_px": [ + 92.25, + 257.0 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 557.0, + 272.0 + ], + [ + 573.0, + 268.0 + ], + [ + 584.0, + 273.0 + ], + [ + 567.0, + 276.0 + ] + ], + "center_px": [ + 570.25, + 272.25 + ], + "area_px": 111.0 + }, + { + "image_points_px": [ + [ + 213.0, + 271.0 + ], + [ + 193.0, + 274.0 + ], + [ + 186.0, + 270.0 + ], + [ + 206.0, + 267.0 + ] + ], + "center_px": [ + 199.5, + 270.5 + ], + "area_px": 101.0 + }, + { + "image_points_px": [ + [ + 553.0, + 272.0 + ], + [ + 537.0, + 275.0 + ], + [ + 526.0, + 271.0 + ], + [ + 542.0, + 267.0 + ] + ], + "center_px": [ + 539.5, + 271.25 + ], + "area_px": 110.5 + }, + { + "image_points_px": [ + [ + 372.0, + 357.0 + ], + [ + 356.0, + 363.0 + ], + [ + 346.0, + 358.0 + ], + [ + 362.0, + 352.0 + ] + ], + "center_px": [ + 359.0, + 357.5 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 363.0, + 370.0 + ], + [ + 348.0, + 376.0 + ], + [ + 337.0, + 371.0 + ], + [ + 352.0, + 365.0 + ] + ], + "center_px": [ + 350.0, + 370.5 + ], + "area_px": 141.0 + }, + { + "image_points_px": [ + [ + 117.0, + 248.0 + ], + [ + 97.0, + 251.0 + ], + [ + 90.0, + 247.0 + ], + [ + 109.0, + 244.0 + ] + ], + "center_px": [ + 103.25, + 247.5 + ], + "area_px": 100.5 + }, + { + "image_points_px": [ + [ + 174.0, + 250.0 + ], + [ + 155.0, + 253.0 + ], + [ + 147.0, + 249.0 + ], + [ + 167.0, + 246.0 + ] + ], + "center_px": [ + 160.75, + 249.5 + ], + "area_px": 100.5 + }, + { + "image_points_px": [ + [ + 867.0, + 261.0 + ], + [ + 880.0, + 258.0 + ], + [ + 894.0, + 263.0 + ], + [ + 881.0, + 266.0 + ] + ], + "center_px": [ + 880.5, + 262.0 + ], + "area_px": 107.0 + }, + { + "image_points_px": [ + [ + 533.0, + 251.0 + ], + [ + 517.0, + 255.0 + ], + [ + 506.0, + 251.0 + ], + [ + 522.0, + 247.0 + ] + ], + "center_px": [ + 519.5, + 251.0 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 503.0, + 250.0 + ], + [ + 487.0, + 254.0 + ], + [ + 476.0, + 250.0 + ], + [ + 492.0, + 246.0 + ] + ], + "center_px": [ + 489.5, + 250.0 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 232.0, + 252.0 + ], + [ + 214.0, + 255.0 + ], + [ + 205.0, + 251.0 + ], + [ + 225.0, + 248.0 + ] + ], + "center_px": [ + 219.0, + 251.5 + ], + "area_px": 100.0 + }, + { + "image_points_px": [ + [ + 31.0, + 245.0 + ], + [ + 10.0, + 248.0 + ], + [ + 4.0, + 245.0 + ], + [ + 24.0, + 241.0 + ] + ], + "center_px": [ + 17.25, + 244.75 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 743.0, + 248.0 + ], + [ + 729.0, + 252.0 + ], + [ + 716.0, + 248.0 + ], + [ + 730.0, + 244.0 + ] + ], + "center_px": [ + 729.5, + 248.0 + ], + "area_px": 108.0 + }, + { + "image_points_px": [ + [ + 328.0, + 245.0 + ], + [ + 309.0, + 248.0 + ], + [ + 301.0, + 244.0 + ], + [ + 319.0, + 241.0 + ] + ], + "center_px": [ + 314.25, + 244.5 + ], + "area_px": 99.5 + }, + { + "image_points_px": [ + [ + 388.0, + 247.0 + ], + [ + 407.0, + 244.0 + ], + [ + 415.0, + 248.0 + ], + [ + 398.0, + 251.0 + ] + ], + "center_px": [ + 402.0, + 247.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 350.0, + 255.0 + ], + [ + 331.0, + 258.0 + ], + [ + 323.0, + 254.0 + ], + [ + 340.0, + 251.0 + ] + ], + "center_px": [ + 336.0, + 254.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 357.0, + 246.0 + ], + [ + 339.0, + 249.0 + ], + [ + 330.0, + 245.0 + ], + [ + 348.0, + 242.0 + ] + ], + "center_px": [ + 343.5, + 245.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 299.0, + 244.0 + ], + [ + 281.0, + 247.0 + ], + [ + 272.0, + 243.0 + ], + [ + 290.0, + 240.0 + ] + ], + "center_px": [ + 285.5, + 243.5 + ], + "area_px": 99.0 + }, + { + "image_points_px": [ + [ + 386.0, + 247.0 + ], + [ + 369.0, + 250.0 + ], + [ + 359.0, + 246.0 + ], + [ + 377.0, + 243.0 + ] + ], + "center_px": [ + 372.75, + 246.5 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 393.0, + 238.0 + ], + [ + 376.0, + 241.0 + ], + [ + 366.0, + 237.0 + ], + [ + 384.0, + 234.0 + ] + ], + "center_px": [ + 379.75, + 237.5 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 215.0, + 242.0 + ], + [ + 235.0, + 239.0 + ], + [ + 242.0, + 242.0 + ], + [ + 224.0, + 246.0 + ] + ], + "center_px": [ + 229.0, + 242.25 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 213.0, + 241.0 + ], + [ + 195.0, + 245.0 + ], + [ + 186.0, + 241.0 + ], + [ + 206.0, + 238.0 + ] + ], + "center_px": [ + 200.0, + 241.25 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 592.0, + 253.0 + ], + [ + 574.0, + 256.0 + ], + [ + 565.0, + 252.0 + ], + [ + 581.0, + 249.0 + ] + ], + "center_px": [ + 578.0, + 252.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 417.0, + 248.0 + ], + [ + 435.0, + 245.0 + ], + [ + 444.0, + 249.0 + ], + [ + 428.0, + 252.0 + ] + ], + "center_px": [ + 431.0, + 248.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 561.0, + 262.0 + ], + [ + 579.0, + 259.0 + ], + [ + 588.0, + 263.0 + ], + [ + 572.0, + 266.0 + ] + ], + "center_px": [ + 575.0, + 262.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 264.0, + 253.0 + ], + [ + 284.0, + 250.0 + ], + [ + 291.0, + 253.0 + ], + [ + 274.0, + 257.0 + ] + ], + "center_px": [ + 278.25, + 253.25 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 569.0, + 243.0 + ], + [ + 586.0, + 240.0 + ], + [ + 596.0, + 244.0 + ], + [ + 579.0, + 247.0 + ] + ], + "center_px": [ + 582.5, + 243.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 471.0, + 259.0 + ], + [ + 488.0, + 256.0 + ], + [ + 498.0, + 260.0 + ], + [ + 481.0, + 263.0 + ] + ], + "center_px": [ + 484.5, + 259.5 + ], + "area_px": 98.0 + }, + { + "image_points_px": [ + [ + 744.0, + 267.0 + ], + [ + 759.0, + 264.0 + ], + [ + 771.0, + 268.0 + ], + [ + 754.0, + 271.0 + ] + ], + "center_px": [ + 757.0, + 267.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 652.0, + 265.0 + ], + [ + 669.0, + 262.0 + ], + [ + 679.0, + 266.0 + ], + [ + 664.0, + 269.0 + ] + ], + "center_px": [ + 666.0, + 265.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 657.0, + 246.0 + ], + [ + 674.0, + 243.0 + ], + [ + 684.0, + 247.0 + ], + [ + 669.0, + 250.0 + ] + ], + "center_px": [ + 671.0, + 246.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 627.0, + 245.0 + ], + [ + 644.0, + 242.0 + ], + [ + 654.0, + 246.0 + ], + [ + 639.0, + 249.0 + ] + ], + "center_px": [ + 641.0, + 245.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 447.0, + 249.0 + ], + [ + 465.0, + 246.0 + ], + [ + 474.0, + 249.0 + ], + [ + 457.0, + 253.0 + ] + ], + "center_px": [ + 460.75, + 249.25 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 598.0, + 244.0 + ], + [ + 614.0, + 241.0 + ], + [ + 625.0, + 245.0 + ], + [ + 609.0, + 248.0 + ] + ], + "center_px": [ + 611.5, + 244.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 628.0, + 236.0 + ], + [ + 613.0, + 239.0 + ], + [ + 601.0, + 235.0 + ], + [ + 617.0, + 232.0 + ] + ], + "center_px": [ + 614.75, + 235.5 + ], + "area_px": 96.5 + }, + { + "image_points_px": [ + [ + 660.0, + 228.0 + ], + [ + 644.0, + 231.0 + ], + [ + 633.0, + 227.0 + ], + [ + 648.0, + 224.0 + ] + ], + "center_px": [ + 646.25, + 227.5 + ], + "area_px": 96.5 + }, + { + "image_points_px": [ + [ + 179.0, + 337.0 + ], + [ + 161.0, + 343.0 + ], + [ + 153.0, + 338.0 + ], + [ + 168.0, + 333.0 + ] + ], + "center_px": [ + 165.25, + 337.75 + ], + "area_px": 126.5 + }, + { + "image_points_px": [ + [ + 1211.0, + 403.0 + ], + [ + 1198.0, + 408.0 + ], + [ + 1185.0, + 405.0 + ], + [ + 1199.0, + 398.0 + ] + ], + "center_px": [ + 1198.25, + 403.5 + ], + "area_px": 129.0 + }, + { + "image_points_px": [ + [ + 835.0, + 242.0 + ], + [ + 851.0, + 239.0 + ], + [ + 862.0, + 243.0 + ], + [ + 848.0, + 246.0 + ] + ], + "center_px": [ + 849.0, + 242.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 774.0, + 240.0 + ], + [ + 758.0, + 243.0 + ], + [ + 747.0, + 239.0 + ], + [ + 761.0, + 236.0 + ] + ], + "center_px": [ + 760.0, + 239.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 806.0, + 232.0 + ], + [ + 819.0, + 229.0 + ], + [ + 833.0, + 233.0 + ], + [ + 818.0, + 236.0 + ] + ], + "center_px": [ + 819.0, + 232.5 + ], + "area_px": 95.0 + }, + { + "image_points_px": [ + [ + 835.0, + 233.0 + ], + [ + 849.0, + 230.0 + ], + [ + 862.0, + 234.0 + ], + [ + 848.0, + 237.0 + ] + ], + "center_px": [ + 848.5, + 233.5 + ], + "area_px": 95.0 + }, + { + "image_points_px": [ + [ + 745.0, + 239.0 + ], + [ + 730.0, + 242.0 + ], + [ + 718.0, + 239.0 + ], + [ + 732.0, + 235.0 + ] + ], + "center_px": [ + 731.25, + 238.75 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 1241.0, + 390.0 + ], + [ + 1228.0, + 395.0 + ], + [ + 1215.0, + 391.0 + ], + [ + 1230.0, + 385.0 + ] + ], + "center_px": [ + 1228.5, + 390.25 + ], + "area_px": 129.0 + }, + { + "image_points_px": [ + [ + 749.0, + 222.0 + ], + [ + 764.0, + 219.0 + ], + [ + 776.0, + 223.0 + ], + [ + 758.0, + 225.0 + ] + ], + "center_px": [ + 761.75, + 222.25 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 657.0, + 237.0 + ], + [ + 640.0, + 239.0 + ], + [ + 630.0, + 236.0 + ], + [ + 646.0, + 233.0 + ] + ], + "center_px": [ + 643.25, + 236.25 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 544.0, + 233.0 + ], + [ + 561.0, + 231.0 + ], + [ + 571.0, + 234.0 + ], + [ + 555.0, + 237.0 + ] + ], + "center_px": [ + 557.75, + 233.75 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 748.0, + 230.0 + ], + [ + 764.0, + 228.0 + ], + [ + 775.0, + 231.0 + ], + [ + 759.0, + 234.0 + ] + ], + "center_px": [ + 761.5, + 230.75 + ], + "area_px": 83.5 + }, + { + "image_points_px": [ + [ + 893.0, + 235.0 + ], + [ + 909.0, + 232.0 + ], + [ + 920.0, + 236.0 + ], + [ + 904.0, + 238.0 + ] + ], + "center_px": [ + 906.5, + 235.25 + ], + "area_px": 83.5 + }, + { + "image_points_px": [ + [ + 777.0, + 231.0 + ], + [ + 794.0, + 229.0 + ], + [ + 804.0, + 232.0 + ], + [ + 789.0, + 235.0 + ] + ], + "center_px": [ + 791.0, + 231.75 + ], + "area_px": 83.5 + }, + { + "image_points_px": [ + [ + 925.0, + 244.0 + ], + [ + 940.0, + 242.0 + ], + [ + 952.0, + 245.0 + ], + [ + 936.0, + 248.0 + ] + ], + "center_px": [ + 938.25, + 244.75 + ], + "area_px": 83.0 + }, + { + "image_points_px": [ + [ + 835.0, + 224.0 + ], + [ + 851.0, + 222.0 + ], + [ + 862.0, + 225.0 + ], + [ + 847.0, + 228.0 + ] + ], + "center_px": [ + 848.75, + 224.75 + ], + "area_px": 83.0 + }, + { + "image_points_px": [ + [ + 923.0, + 235.0 + ], + [ + 937.0, + 233.0 + ], + [ + 950.0, + 236.0 + ], + [ + 935.0, + 239.0 + ] + ], + "center_px": [ + 936.25, + 235.75 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 891.0, + 235.0 + ], + [ + 876.0, + 237.0 + ], + [ + 864.0, + 234.0 + ], + [ + 878.0, + 231.0 + ] + ], + "center_px": [ + 877.25, + 234.25 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 806.0, + 224.0 + ], + [ + 821.0, + 221.0 + ], + [ + 833.0, + 224.0 + ], + [ + 818.0, + 227.0 + ] + ], + "center_px": [ + 819.5, + 224.0 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 76.0, + 256.0 + ], + [ + 57.0, + 260.0 + ], + [ + 50.0, + 256.0 + ], + [ + 68.0, + 252.0 + ] + ], + "center_px": [ + 62.75, + 256.0 + ], + "area_px": 104.0 + }, + { + "image_points_px": [ + [ + 88.0, + 247.0 + ], + [ + 68.0, + 250.0 + ], + [ + 62.0, + 246.0 + ], + [ + 81.0, + 243.0 + ] + ], + "center_px": [ + 74.75, + 246.5 + ], + "area_px": 97.5 + }, + { + "image_points_px": [ + [ + 59.0, + 246.0 + ], + [ + 39.0, + 249.0 + ], + [ + 33.0, + 245.0 + ], + [ + 52.0, + 242.0 + ] + ], + "center_px": [ + 45.75, + 245.5 + ], + "area_px": 97.5 + }, + { + "image_points_px": [ + [ + 1245.0, + 379.0 + ], + [ + 1257.0, + 374.0 + ], + [ + 1271.0, + 377.0 + ], + [ + 1259.0, + 382.0 + ] + ], + "center_px": [ + 1258.0, + 378.0 + ], + "area_px": 106.0 + }, + { + "image_points_px": [ + [ + 155.0, + 240.0 + ], + [ + 137.0, + 243.0 + ], + [ + 129.0, + 239.0 + ], + [ + 149.0, + 236.0 + ] + ], + "center_px": [ + 142.5, + 239.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 145.0, + 249.0 + ], + [ + 126.0, + 252.0 + ], + [ + 119.0, + 248.0 + ], + [ + 138.0, + 245.0 + ] + ], + "center_px": [ + 132.0, + 248.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 127.0, + 239.0 + ], + [ + 108.0, + 242.0 + ], + [ + 101.0, + 238.0 + ], + [ + 120.0, + 235.0 + ] + ], + "center_px": [ + 114.0, + 238.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 99.0, + 238.0 + ], + [ + 80.0, + 241.0 + ], + [ + 73.0, + 237.0 + ], + [ + 92.0, + 234.0 + ] + ], + "center_px": [ + 86.0, + 237.5 + ], + "area_px": 97.0 + }, + { + "image_points_px": [ + [ + 203.0, + 251.0 + ], + [ + 185.0, + 254.0 + ], + [ + 177.0, + 250.0 + ], + [ + 196.0, + 247.0 + ] + ], + "center_px": [ + 190.25, + 250.5 + ], + "area_px": 96.5 + }, + { + "image_points_px": [ + [ + 270.0, + 243.0 + ], + [ + 251.0, + 246.0 + ], + [ + 244.0, + 242.0 + ], + [ + 261.0, + 239.0 + ] + ], + "center_px": [ + 256.5, + 242.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 194.0, + 232.0 + ], + [ + 176.0, + 235.0 + ], + [ + 168.0, + 231.0 + ], + [ + 186.0, + 228.0 + ] + ], + "center_px": [ + 181.0, + 231.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 166.0, + 231.0 + ], + [ + 148.0, + 234.0 + ], + [ + 140.0, + 230.0 + ], + [ + 158.0, + 227.0 + ] + ], + "center_px": [ + 153.0, + 230.5 + ], + "area_px": 96.0 + }, + { + "image_points_px": [ + [ + 320.0, + 254.0 + ], + [ + 301.0, + 257.0 + ], + [ + 294.0, + 253.0 + ], + [ + 310.0, + 250.0 + ] + ], + "center_px": [ + 306.25, + 253.5 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 235.0, + 252.0 + ], + [ + 255.0, + 249.0 + ], + [ + 261.0, + 252.0 + ], + [ + 243.0, + 256.0 + ] + ], + "center_px": [ + 248.5, + 252.25 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 71.0, + 237.0 + ], + [ + 51.0, + 240.0 + ], + [ + 45.0, + 237.0 + ], + [ + 63.0, + 233.0 + ] + ], + "center_px": [ + 57.5, + 236.75 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 43.0, + 236.0 + ], + [ + 23.0, + 239.0 + ], + [ + 17.0, + 236.0 + ], + [ + 35.0, + 232.0 + ] + ], + "center_px": [ + 29.5, + 235.75 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 307.0, + 235.0 + ], + [ + 289.0, + 238.0 + ], + [ + 281.0, + 234.0 + ], + [ + 298.0, + 231.0 + ] + ], + "center_px": [ + 293.75, + 234.5 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 259.0, + 225.0 + ], + [ + 242.0, + 228.0 + ], + [ + 233.0, + 224.0 + ], + [ + 251.0, + 221.0 + ] + ], + "center_px": [ + 246.25, + 224.5 + ], + "area_px": 95.5 + }, + { + "image_points_px": [ + [ + 278.0, + 234.0 + ], + [ + 260.0, + 237.0 + ], + [ + 252.0, + 234.0 + ], + [ + 270.0, + 230.0 + ] + ], + "center_px": [ + 265.0, + 233.75 + ], + "area_px": 91.0 + }, + { + "image_points_px": [ + [ + 427.0, + 230.0 + ], + [ + 411.0, + 233.0 + ], + [ + 401.0, + 229.0 + ], + [ + 418.0, + 226.0 + ] + ], + "center_px": [ + 414.25, + 229.5 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 399.0, + 229.0 + ], + [ + 383.0, + 232.0 + ], + [ + 373.0, + 228.0 + ], + [ + 390.0, + 225.0 + ] + ], + "center_px": [ + 386.25, + 228.5 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 450.0, + 240.0 + ], + [ + 434.0, + 243.0 + ], + [ + 424.0, + 239.0 + ], + [ + 441.0, + 236.0 + ] + ], + "center_px": [ + 437.25, + 239.5 + ], + "area_px": 94.5 + }, + { + "image_points_px": [ + [ + 687.0, + 247.0 + ], + [ + 704.0, + 244.0 + ], + [ + 713.0, + 248.0 + ], + [ + 698.0, + 251.0 + ] + ], + "center_px": [ + 700.5, + 247.5 + ], + "area_px": 94.0 + }, + { + "image_points_px": [ + [ + 184.0, + 241.0 + ], + [ + 164.0, + 243.0 + ], + [ + 158.0, + 240.0 + ], + [ + 177.0, + 237.0 + ] + ], + "center_px": [ + 170.75, + 240.25 + ], + "area_px": 84.5 + }, + { + "image_points_px": [ + [ + 456.0, + 231.0 + ], + [ + 440.0, + 234.0 + ], + [ + 430.0, + 230.0 + ], + [ + 446.0, + 227.0 + ] + ], + "center_px": [ + 443.0, + 230.5 + ], + "area_px": 94.0 + }, + { + "image_points_px": [ + [ + 573.0, + 234.0 + ], + [ + 588.0, + 231.0 + ], + [ + 599.0, + 235.0 + ], + [ + 583.0, + 238.0 + ] + ], + "center_px": [ + 585.75, + 234.5 + ], + "area_px": 93.5 + }, + { + "image_points_px": [ + [ + 205.0, + 223.0 + ], + [ + 225.0, + 221.0 + ], + [ + 231.0, + 224.0 + ], + [ + 214.0, + 227.0 + ] + ], + "center_px": [ + 218.75, + 223.75 + ], + "area_px": 83.5 + }, + { + "image_points_px": [ + [ + 721.0, + 221.0 + ], + [ + 734.0, + 218.0 + ], + [ + 747.0, + 222.0 + ], + [ + 733.0, + 225.0 + ] + ], + "center_px": [ + 733.75, + 221.5 + ], + "area_px": 91.5 + }, + { + "image_points_px": [ + [ + 350.0, + 219.0 + ], + [ + 331.0, + 221.0 + ], + [ + 324.0, + 218.0 + ], + [ + 341.0, + 215.0 + ] + ], + "center_px": [ + 336.5, + 218.25 + ], + "area_px": 83.0 + }, + { + "image_points_px": [ + [ + 689.0, + 237.0 + ], + [ + 705.0, + 235.0 + ], + [ + 715.0, + 239.0 + ], + [ + 699.0, + 241.0 + ] + ], + "center_px": [ + 702.0, + 238.0 + ], + "area_px": 84.0 + }, + { + "image_points_px": [ + [ + 110.0, + 229.0 + ], + [ + 91.0, + 232.0 + ], + [ + 84.0, + 229.0 + ], + [ + 104.0, + 226.0 + ] + ], + "center_px": [ + 97.25, + 229.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 82.0, + 228.0 + ], + [ + 63.0, + 231.0 + ], + [ + 56.0, + 228.0 + ], + [ + 76.0, + 225.0 + ] + ], + "center_px": [ + 69.25, + 228.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 421.0, + 239.0 + ], + [ + 403.0, + 241.0 + ], + [ + 395.0, + 238.0 + ], + [ + 412.0, + 235.0 + ] + ], + "center_px": [ + 407.75, + 238.25 + ], + "area_px": 82.5 + }, + { + "image_points_px": [ + [ + 345.0, + 227.0 + ], + [ + 363.0, + 225.0 + ], + [ + 371.0, + 228.0 + ], + [ + 354.0, + 231.0 + ] + ], + "center_px": [ + 358.25, + 227.75 + ], + "area_px": 82.5 + }, + { + "image_points_px": [ + [ + 516.0, + 232.0 + ], + [ + 533.0, + 230.0 + ], + [ + 542.0, + 233.0 + ], + [ + 525.0, + 236.0 + ] + ], + "center_px": [ + 529.0, + 232.75 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 487.0, + 231.0 + ], + [ + 504.0, + 229.0 + ], + [ + 513.0, + 232.0 + ], + [ + 496.0, + 235.0 + ] + ], + "center_px": [ + 500.0, + 231.75 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 484.0, + 232.0 + ], + [ + 467.0, + 234.0 + ], + [ + 458.0, + 231.0 + ], + [ + 475.0, + 228.0 + ] + ], + "center_px": [ + 471.0, + 231.25 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 467.0, + 214.0 + ], + [ + 449.0, + 216.0 + ], + [ + 441.0, + 213.0 + ], + [ + 457.0, + 210.0 + ] + ], + "center_px": [ + 453.5, + 213.25 + ], + "area_px": 82.0 + }, + { + "image_points_px": [ + [ + 250.0, + 233.0 + ], + [ + 231.0, + 236.0 + ], + [ + 224.0, + 233.0 + ], + [ + 243.0, + 230.0 + ] + ], + "center_px": [ + 237.0, + 233.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 148.0, + 221.0 + ], + [ + 129.0, + 224.0 + ], + [ + 122.0, + 221.0 + ], + [ + 141.0, + 218.0 + ] + ], + "center_px": [ + 135.0, + 221.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 39.0, + 218.0 + ], + [ + 20.0, + 221.0 + ], + [ + 13.0, + 218.0 + ], + [ + 32.0, + 215.0 + ] + ], + "center_px": [ + 26.0, + 218.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 577.0, + 225.0 + ], + [ + 593.0, + 223.0 + ], + [ + 603.0, + 226.0 + ], + [ + 586.0, + 229.0 + ] + ], + "center_px": [ + 589.75, + 225.75 + ], + "area_px": 81.5 + }, + { + "image_points_px": [ + [ + 552.0, + 216.0 + ], + [ + 570.0, + 214.0 + ], + [ + 578.0, + 217.0 + ], + [ + 563.0, + 220.0 + ] + ], + "center_px": [ + 565.75, + 216.75 + ], + "area_px": 81.5 + }, + { + "image_points_px": [ + [ + 605.0, + 226.0 + ], + [ + 622.0, + 224.0 + ], + [ + 631.0, + 227.0 + ], + [ + 615.0, + 230.0 + ] + ], + "center_px": [ + 618.25, + 226.75 + ], + "area_px": 81.5 + }, + { + "image_points_px": [ + [ + 693.0, + 220.0 + ], + [ + 710.0, + 218.0 + ], + [ + 719.0, + 221.0 + ], + [ + 703.0, + 224.0 + ] + ], + "center_px": [ + 706.25, + 220.75 + ], + "area_px": 81.5 + }, + { + "image_points_px": [ + [ + 317.0, + 227.0 + ], + [ + 336.0, + 224.0 + ], + [ + 343.0, + 227.0 + ], + [ + 325.0, + 230.0 + ] + ], + "center_px": [ + 330.25, + 227.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 267.0, + 216.0 + ], + [ + 249.0, + 219.0 + ], + [ + 241.0, + 216.0 + ], + [ + 260.0, + 213.0 + ] + ], + "center_px": [ + 254.25, + 216.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 528.0, + 207.0 + ], + [ + 545.0, + 205.0 + ], + [ + 554.0, + 208.0 + ], + [ + 539.0, + 211.0 + ] + ], + "center_px": [ + 541.5, + 207.75 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 660.0, + 237.0 + ], + [ + 675.0, + 234.0 + ], + [ + 686.0, + 238.0 + ], + [ + 669.0, + 240.0 + ] + ], + "center_px": [ + 672.5, + 237.25 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 662.0, + 228.0 + ], + [ + 677.0, + 225.0 + ], + [ + 688.0, + 229.0 + ], + [ + 671.0, + 231.0 + ] + ], + "center_px": [ + 674.5, + 228.25 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 634.0, + 219.0 + ], + [ + 617.0, + 221.0 + ], + [ + 608.0, + 218.0 + ], + [ + 623.0, + 215.0 + ] + ], + "center_px": [ + 620.5, + 218.25 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 606.0, + 218.0 + ], + [ + 589.0, + 220.0 + ], + [ + 580.0, + 217.0 + ], + [ + 595.0, + 214.0 + ] + ], + "center_px": [ + 592.5, + 217.25 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 453.0, + 240.0 + ], + [ + 471.0, + 237.0 + ], + [ + 479.0, + 240.0 + ], + [ + 461.0, + 243.0 + ] + ], + "center_px": [ + 466.0, + 240.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 696.0, + 204.0 + ], + [ + 710.0, + 201.0 + ], + [ + 722.0, + 205.0 + ], + [ + 705.0, + 207.0 + ] + ], + "center_px": [ + 708.25, + 204.25 + ], + "area_px": 80.5 + }, + { + "image_points_px": [ + [ + 691.0, + 229.0 + ], + [ + 705.0, + 226.0 + ], + [ + 717.0, + 230.0 + ], + [ + 700.0, + 232.0 + ] + ], + "center_px": [ + 703.25, + 229.25 + ], + "area_px": 80.5 + }, + { + "image_points_px": [ + [ + 720.0, + 213.0 + ], + [ + 704.0, + 215.0 + ], + [ + 694.0, + 212.0 + ], + [ + 709.0, + 209.0 + ] + ], + "center_px": [ + 706.75, + 212.25 + ], + "area_px": 80.5 + }, + { + "image_points_px": [ + [ + 948.0, + 374.0 + ], + [ + 954.0, + 372.0 + ], + [ + 973.0, + 380.0 + ], + [ + 963.0, + 381.0 + ] + ], + "center_px": [ + 959.5, + 376.75 + ], + "area_px": 85.5 + }, + { + "image_points_px": [ + [ + 719.0, + 230.0 + ], + [ + 734.0, + 227.0 + ], + [ + 745.0, + 231.0 + ], + [ + 730.0, + 233.0 + ] + ], + "center_px": [ + 732.0, + 230.25 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 520.0, + 224.0 + ], + [ + 536.0, + 221.0 + ], + [ + 546.0, + 224.0 + ], + [ + 528.0, + 227.0 + ] + ], + "center_px": [ + 532.5, + 224.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 748.0, + 214.0 + ], + [ + 733.0, + 216.0 + ], + [ + 722.0, + 213.0 + ], + [ + 736.0, + 210.0 + ] + ], + "center_px": [ + 734.75, + 213.25 + ], + "area_px": 79.5 + }, + { + "image_points_px": [ + [ + 548.0, + 225.0 + ], + [ + 565.0, + 222.0 + ], + [ + 574.0, + 225.0 + ], + [ + 557.0, + 228.0 + ] + ], + "center_px": [ + 561.0, + 225.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 863.0, + 217.0 + ], + [ + 876.0, + 214.0 + ], + [ + 889.0, + 218.0 + ], + [ + 875.0, + 220.0 + ] + ], + "center_px": [ + 875.75, + 217.25 + ], + "area_px": 78.5 + }, + { + "image_points_px": [ + [ + 636.0, + 219.0 + ], + [ + 651.0, + 216.0 + ], + [ + 662.0, + 219.0 + ], + [ + 647.0, + 222.0 + ] + ], + "center_px": [ + 649.0, + 219.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 778.0, + 223.0 + ], + [ + 792.0, + 220.0 + ], + [ + 804.0, + 223.0 + ], + [ + 789.0, + 226.0 + ] + ], + "center_px": [ + 790.75, + 223.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 138.0, + 230.0 + ], + [ + 119.0, + 233.0 + ], + [ + 113.0, + 229.0 + ], + [ + 130.0, + 226.0 + ] + ], + "center_px": [ + 125.0, + 229.5 + ], + "area_px": 93.0 + }, + { + "image_points_px": [ + [ + 93.0, + 220.0 + ], + [ + 75.0, + 223.0 + ], + [ + 68.0, + 219.0 + ], + [ + 85.0, + 216.0 + ] + ], + "center_px": [ + 80.25, + 219.5 + ], + "area_px": 92.5 + }, + { + "image_points_px": [ + [ + 221.0, + 233.0 + ], + [ + 205.0, + 236.0 + ], + [ + 196.0, + 232.0 + ], + [ + 214.0, + 229.0 + ] + ], + "center_px": [ + 209.0, + 232.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 363.0, + 237.0 + ], + [ + 346.0, + 240.0 + ], + [ + 338.0, + 236.0 + ], + [ + 355.0, + 233.0 + ] + ], + "center_px": [ + 350.5, + 236.5 + ], + "area_px": 92.0 + }, + { + "image_points_px": [ + [ + 120.0, + 221.0 + ], + [ + 101.0, + 223.0 + ], + [ + 95.0, + 220.0 + ], + [ + 114.0, + 217.0 + ] + ], + "center_px": [ + 107.5, + 220.25 + ], + "area_px": 81.5 + }, + { + "image_points_px": [ + [ + 363.0, + 332.0 + ], + [ + 380.0, + 328.0 + ], + [ + 387.0, + 333.0 + ], + [ + 370.0, + 337.0 + ] + ], + "center_px": [ + 375.0, + 332.5 + ], + "area_px": 113.0 + }, + { + "image_points_px": [ + [ + 286.0, + 226.0 + ], + [ + 267.0, + 228.0 + ], + [ + 261.0, + 225.0 + ], + [ + 279.0, + 222.0 + ] + ], + "center_px": [ + 273.25, + 225.25 + ], + "area_px": 81.0 + }, + { + "image_points_px": [ + [ + 212.0, + 215.0 + ], + [ + 193.0, + 217.0 + ], + [ + 187.0, + 214.0 + ], + [ + 204.0, + 211.0 + ] + ], + "center_px": [ + 199.0, + 214.25 + ], + "area_px": 80.5 + }, + { + "image_points_px": [ + [ + 160.0, + 213.0 + ], + [ + 179.0, + 211.0 + ], + [ + 185.0, + 214.0 + ], + [ + 168.0, + 217.0 + ] + ], + "center_px": [ + 173.0, + 213.75 + ], + "area_px": 80.5 + }, + { + "image_points_px": [ + [ + 54.0, + 227.0 + ], + [ + 34.0, + 230.0 + ], + [ + 29.0, + 227.0 + ], + [ + 48.0, + 224.0 + ] + ], + "center_px": [ + 41.25, + 227.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 893.0, + 226.0 + ], + [ + 906.0, + 223.0 + ], + [ + 918.0, + 227.0 + ], + [ + 905.0, + 230.0 + ] + ], + "center_px": [ + 905.5, + 226.5 + ], + "area_px": 88.0 + }, + { + "image_points_px": [ + [ + 270.0, + 216.0 + ], + [ + 287.0, + 214.0 + ], + [ + 295.0, + 217.0 + ], + [ + 277.0, + 220.0 + ] + ], + "center_px": [ + 282.25, + 216.75 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 297.0, + 217.0 + ], + [ + 315.0, + 215.0 + ], + [ + 322.0, + 218.0 + ], + [ + 305.0, + 221.0 + ] + ], + "center_px": [ + 309.75, + 217.75 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 436.0, + 221.0 + ], + [ + 453.0, + 219.0 + ], + [ + 461.0, + 222.0 + ], + [ + 444.0, + 225.0 + ] + ], + "center_px": [ + 448.5, + 221.75 + ], + "area_px": 79.5 + }, + { + "image_points_px": [ + [ + 412.0, + 212.0 + ], + [ + 395.0, + 215.0 + ], + [ + 387.0, + 211.0 + ], + [ + 403.0, + 209.0 + ] + ], + "center_px": [ + 399.25, + 211.75 + ], + "area_px": 79.0 + }, + { + "image_points_px": [ + [ + 178.0, + 223.0 + ], + [ + 197.0, + 220.0 + ], + [ + 203.0, + 223.0 + ], + [ + 185.0, + 226.0 + ] + ], + "center_px": [ + 190.75, + 223.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 175.0, + 222.0 + ], + [ + 157.0, + 225.0 + ], + [ + 150.0, + 222.0 + ], + [ + 169.0, + 219.0 + ] + ], + "center_px": [ + 162.75, + 222.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 329.0, + 210.0 + ], + [ + 312.0, + 212.0 + ], + [ + 304.0, + 209.0 + ], + [ + 320.0, + 206.0 + ] + ], + "center_px": [ + 316.25, + 209.25 + ], + "area_px": 79.0 + }, + { + "image_points_px": [ + [ + 377.0, + 220.0 + ], + [ + 360.0, + 222.0 + ], + [ + 352.0, + 219.0 + ], + [ + 368.0, + 216.0 + ] + ], + "center_px": [ + 364.25, + 219.25 + ], + "area_px": 79.0 + }, + { + "image_points_px": [ + [ + 52.0, + 210.0 + ], + [ + 71.0, + 208.0 + ], + [ + 77.0, + 211.0 + ], + [ + 57.0, + 213.0 + ] + ], + "center_px": [ + 64.25, + 210.5 + ], + "area_px": 69.5 + }, + { + "image_points_px": [ + [ + 525.0, + 215.0 + ], + [ + 541.0, + 213.0 + ], + [ + 550.0, + 216.0 + ], + [ + 534.0, + 219.0 + ] + ], + "center_px": [ + 537.5, + 215.75 + ], + "area_px": 78.5 + }, + { + "image_points_px": [ + [ + 499.0, + 207.0 + ], + [ + 483.0, + 209.0 + ], + [ + 474.0, + 206.0 + ], + [ + 490.0, + 203.0 + ] + ], + "center_px": [ + 486.5, + 206.25 + ], + "area_px": 78.5 + }, + { + "image_points_px": [ + [ + 494.0, + 215.0 + ], + [ + 477.0, + 217.0 + ], + [ + 469.0, + 214.0 + ], + [ + 484.0, + 211.0 + ] + ], + "center_px": [ + 481.0, + 214.25 + ], + "area_px": 78.5 + }, + { + "image_points_px": [ + [ + 472.0, + 206.0 + ], + [ + 455.0, + 208.0 + ], + [ + 447.0, + 205.0 + ], + [ + 462.0, + 202.0 + ] + ], + "center_px": [ + 459.0, + 205.25 + ], + "area_px": 78.5 + }, + { + "image_points_px": [ + [ + 239.0, + 215.0 + ], + [ + 221.0, + 218.0 + ], + [ + 214.0, + 215.0 + ], + [ + 232.0, + 212.0 + ] + ], + "center_px": [ + 226.5, + 215.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 158.0, + 213.0 + ], + [ + 140.0, + 216.0 + ], + [ + 133.0, + 213.0 + ], + [ + 151.0, + 210.0 + ] + ], + "center_px": [ + 145.5, + 213.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 168.0, + 205.0 + ], + [ + 150.0, + 208.0 + ], + [ + 143.0, + 205.0 + ], + [ + 161.0, + 202.0 + ] + ], + "center_px": [ + 155.5, + 205.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 141.0, + 204.0 + ], + [ + 123.0, + 207.0 + ], + [ + 116.0, + 204.0 + ], + [ + 134.0, + 201.0 + ] + ], + "center_px": [ + 128.5, + 204.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 314.0, + 226.0 + ], + [ + 296.0, + 229.0 + ], + [ + 289.0, + 226.0 + ], + [ + 307.0, + 223.0 + ] + ], + "center_px": [ + 301.5, + 226.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 609.0, + 210.0 + ], + [ + 592.0, + 212.0 + ], + [ + 584.0, + 209.0 + ], + [ + 598.0, + 206.0 + ] + ], + "center_px": [ + 595.75, + 209.25 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 665.0, + 219.0 + ], + [ + 681.0, + 217.0 + ], + [ + 690.0, + 220.0 + ], + [ + 675.0, + 223.0 + ] + ], + "center_px": [ + 677.75, + 219.75 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 581.0, + 209.0 + ], + [ + 565.0, + 211.0 + ], + [ + 556.0, + 208.0 + ], + [ + 571.0, + 205.0 + ] + ], + "center_px": [ + 568.25, + 208.25 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 558.0, + 200.0 + ], + [ + 543.0, + 203.0 + ], + [ + 533.0, + 199.0 + ], + [ + 548.0, + 197.0 + ] + ], + "center_px": [ + 545.5, + 199.75 + ], + "area_px": 77.5 + }, + { + "image_points_px": [ + [ + 612.0, + 202.0 + ], + [ + 596.0, + 204.0 + ], + [ + 587.0, + 201.0 + ], + [ + 601.0, + 198.0 + ] + ], + "center_px": [ + 599.0, + 201.25 + ], + "area_px": 77.5 + }, + { + "image_points_px": [ + [ + 178.0, + 197.0 + ], + [ + 160.0, + 200.0 + ], + [ + 153.0, + 197.0 + ], + [ + 169.0, + 194.0 + ] + ], + "center_px": [ + 165.0, + 197.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 384.0, + 211.0 + ], + [ + 367.0, + 214.0 + ], + [ + 359.0, + 211.0 + ], + [ + 376.0, + 208.0 + ] + ], + "center_px": [ + 371.5, + 211.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 248.0, + 207.0 + ], + [ + 231.0, + 210.0 + ], + [ + 223.0, + 207.0 + ], + [ + 240.0, + 204.0 + ] + ], + "center_px": [ + 235.5, + 207.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 283.0, + 200.0 + ], + [ + 266.0, + 203.0 + ], + [ + 258.0, + 200.0 + ], + [ + 275.0, + 197.0 + ] + ], + "center_px": [ + 270.5, + 200.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 637.0, + 210.0 + ], + [ + 622.0, + 213.0 + ], + [ + 612.0, + 209.0 + ], + [ + 626.0, + 207.0 + ] + ], + "center_px": [ + 624.25, + 209.75 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 408.0, + 221.0 + ], + [ + 425.0, + 218.0 + ], + [ + 433.0, + 221.0 + ], + [ + 417.0, + 224.0 + ] + ], + "center_px": [ + 420.75, + 221.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 380.0, + 220.0 + ], + [ + 396.0, + 217.0 + ], + [ + 405.0, + 220.0 + ], + [ + 388.0, + 223.0 + ] + ], + "center_px": [ + 392.25, + 220.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 497.0, + 215.0 + ], + [ + 513.0, + 212.0 + ], + [ + 522.0, + 215.0 + ], + [ + 505.0, + 218.0 + ] + ], + "center_px": [ + 509.25, + 215.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 390.0, + 203.0 + ], + [ + 374.0, + 206.0 + ], + [ + 365.0, + 203.0 + ], + [ + 382.0, + 200.0 + ] + ], + "center_px": [ + 377.75, + 203.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 749.0, + 206.0 + ], + [ + 735.0, + 208.0 + ], + [ + 724.0, + 205.0 + ], + [ + 738.0, + 202.0 + ] + ], + "center_px": [ + 736.5, + 205.25 + ], + "area_px": 76.5 + }, + { + "image_points_px": [ + [ + 779.0, + 214.0 + ], + [ + 794.0, + 212.0 + ], + [ + 804.0, + 215.0 + ], + [ + 791.0, + 218.0 + ] + ], + "center_px": [ + 792.0, + 214.75 + ], + "area_px": 76.5 + }, + { + "image_points_px": [ + [ + 751.0, + 213.0 + ], + [ + 764.0, + 211.0 + ], + [ + 776.0, + 214.0 + ], + [ + 762.0, + 217.0 + ] + ], + "center_px": [ + 763.25, + 213.75 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 752.0, + 205.0 + ], + [ + 765.0, + 203.0 + ], + [ + 777.0, + 206.0 + ], + [ + 763.0, + 209.0 + ] + ], + "center_px": [ + 764.25, + 205.75 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 835.0, + 208.0 + ], + [ + 847.0, + 205.0 + ], + [ + 860.0, + 209.0 + ], + [ + 845.0, + 211.0 + ] + ], + "center_px": [ + 846.75, + 208.25 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 805.0, + 192.0 + ], + [ + 792.0, + 194.0 + ], + [ + 780.0, + 191.0 + ], + [ + 793.0, + 188.0 + ] + ], + "center_px": [ + 792.5, + 191.25 + ], + "area_px": 75.5 + }, + { + "image_points_px": [ + [ + 639.0, + 202.0 + ], + [ + 624.0, + 205.0 + ], + [ + 614.0, + 202.0 + ], + [ + 629.0, + 199.0 + ] + ], + "center_px": [ + 626.5, + 202.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 531.0, + 199.0 + ], + [ + 516.0, + 202.0 + ], + [ + 506.0, + 199.0 + ], + [ + 521.0, + 196.0 + ] + ], + "center_px": [ + 518.5, + 199.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 639.0, + 211.0 + ], + [ + 654.0, + 208.0 + ], + [ + 664.0, + 211.0 + ], + [ + 650.0, + 214.0 + ] + ], + "center_px": [ + 651.75, + 211.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 753.0, + 198.0 + ], + [ + 766.0, + 195.0 + ], + [ + 778.0, + 198.0 + ], + [ + 764.0, + 201.0 + ] + ], + "center_px": [ + 765.25, + 198.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 725.0, + 189.0 + ], + [ + 711.0, + 192.0 + ], + [ + 700.0, + 189.0 + ], + [ + 713.0, + 186.0 + ] + ], + "center_px": [ + 712.25, + 189.0 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 414.0, + 212.0 + ], + [ + 431.0, + 210.0 + ], + [ + 439.0, + 213.0 + ], + [ + 421.0, + 215.0 + ] + ], + "center_px": [ + 426.25, + 212.5 + ], + "area_px": 67.5 + }, + { + "image_points_px": [ + [ + 420.0, + 204.0 + ], + [ + 436.0, + 202.0 + ], + [ + 445.0, + 205.0 + ], + [ + 427.0, + 207.0 + ] + ], + "center_px": [ + 432.0, + 204.5 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 560.0, + 200.0 + ], + [ + 577.0, + 198.0 + ], + [ + 585.0, + 201.0 + ], + [ + 568.0, + 203.0 + ] + ], + "center_px": [ + 572.5, + 200.5 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 452.0, + 197.0 + ], + [ + 469.0, + 195.0 + ], + [ + 477.0, + 198.0 + ], + [ + 460.0, + 200.0 + ] + ], + "center_px": [ + 464.5, + 197.5 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 669.0, + 203.0 + ], + [ + 685.0, + 201.0 + ], + [ + 694.0, + 204.0 + ], + [ + 677.0, + 206.0 + ] + ], + "center_px": [ + 681.25, + 203.5 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 617.0, + 194.0 + ], + [ + 634.0, + 192.0 + ], + [ + 642.0, + 195.0 + ], + [ + 626.0, + 197.0 + ] + ], + "center_px": [ + 629.75, + 194.5 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 725.0, + 197.0 + ], + [ + 742.0, + 195.0 + ], + [ + 750.0, + 198.0 + ], + [ + 735.0, + 200.0 + ] + ], + "center_px": [ + 738.0, + 197.5 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 667.0, + 211.0 + ], + [ + 682.0, + 209.0 + ], + [ + 692.0, + 212.0 + ], + [ + 675.0, + 214.0 + ] + ], + "center_px": [ + 679.0, + 211.5 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 698.0, + 196.0 + ], + [ + 714.0, + 194.0 + ], + [ + 723.0, + 197.0 + ], + [ + 707.0, + 199.0 + ] + ], + "center_px": [ + 710.5, + 196.5 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 590.0, + 193.0 + ], + [ + 606.0, + 191.0 + ], + [ + 615.0, + 194.0 + ], + [ + 599.0, + 196.0 + ] + ], + "center_px": [ + 602.5, + 193.5 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 642.0, + 202.0 + ], + [ + 656.0, + 200.0 + ], + [ + 667.0, + 203.0 + ], + [ + 650.0, + 205.0 + ] + ], + "center_px": [ + 653.75, + 202.5 + ], + "area_px": 65.5 + }, + { + "image_points_px": [ + [ + 807.0, + 199.0 + ], + [ + 822.0, + 197.0 + ], + [ + 832.0, + 200.0 + ], + [ + 816.0, + 202.0 + ] + ], + "center_px": [ + 819.25, + 199.5 + ], + "area_px": 65.5 + }, + { + "image_points_px": [ + [ + 703.0, + 174.0 + ], + [ + 718.0, + 172.0 + ], + [ + 728.0, + 175.0 + ], + [ + 713.0, + 177.0 + ] + ], + "center_px": [ + 715.5, + 174.5 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 780.0, + 198.0 + ], + [ + 793.0, + 196.0 + ], + [ + 805.0, + 199.0 + ], + [ + 789.0, + 201.0 + ] + ], + "center_px": [ + 791.75, + 198.5 + ], + "area_px": 64.5 + }, + { + "image_points_px": [ + [ + 669.0, + 195.0 + ], + [ + 651.0, + 197.0 + ], + [ + 644.0, + 195.0 + ], + [ + 658.0, + 192.0 + ] + ], + "center_px": [ + 655.5, + 194.75 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 671.0, + 196.0 + ], + [ + 685.0, + 193.0 + ], + [ + 696.0, + 196.0 + ], + [ + 679.0, + 198.0 + ] + ], + "center_px": [ + 682.75, + 195.75 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 287.0, + 567.0 + ], + [ + 307.0, + 578.0 + ], + [ + 297.0, + 580.0 + ], + [ + 290.0, + 577.0 + ] + ], + "center_px": [ + 295.25, + 575.5 + ], + "area_px": 105.5 + }, + { + "image_points_px": [ + [ + 335.0, + 236.0 + ], + [ + 317.0, + 239.0 + ], + [ + 311.0, + 235.0 + ], + [ + 327.0, + 232.0 + ] + ], + "center_px": [ + 322.5, + 235.5 + ], + "area_px": 89.0 + }, + { + "image_points_px": [ + [ + 113.0, + 204.0 + ], + [ + 95.0, + 206.0 + ], + [ + 89.0, + 203.0 + ], + [ + 107.0, + 200.0 + ] + ], + "center_px": [ + 101.0, + 203.25 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 61.0, + 202.0 + ], + [ + 44.0, + 205.0 + ], + [ + 37.0, + 201.0 + ], + [ + 55.0, + 199.0 + ] + ], + "center_px": [ + 49.25, + 201.75 + ], + "area_px": 77.5 + }, + { + "image_points_px": [ + [ + 220.0, + 207.0 + ], + [ + 203.0, + 209.0 + ], + [ + 196.0, + 206.0 + ], + [ + 213.0, + 203.0 + ] + ], + "center_px": [ + 208.0, + 206.25 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 275.0, + 208.0 + ], + [ + 258.0, + 211.0 + ], + [ + 251.0, + 207.0 + ], + [ + 268.0, + 205.0 + ] + ], + "center_px": [ + 263.0, + 207.75 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 170.0, + 205.0 + ], + [ + 188.0, + 203.0 + ], + [ + 194.0, + 206.0 + ], + [ + 178.0, + 209.0 + ] + ], + "center_px": [ + 182.5, + 205.75 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 103.0, + 211.0 + ], + [ + 84.0, + 214.0 + ], + [ + 79.0, + 211.0 + ], + [ + 97.0, + 208.0 + ] + ], + "center_px": [ + 90.75, + 211.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 290.0, + 193.0 + ], + [ + 273.0, + 195.0 + ], + [ + 266.0, + 192.0 + ], + [ + 282.0, + 189.0 + ] + ], + "center_px": [ + 277.75, + 192.25 + ], + "area_px": 76.5 + }, + { + "image_points_px": [ + [ + 302.0, + 209.0 + ], + [ + 286.0, + 212.0 + ], + [ + 278.0, + 208.0 + ], + [ + 295.0, + 206.0 + ] + ], + "center_px": [ + 290.25, + 208.75 + ], + "area_px": 76.5 + }, + { + "image_points_px": [ + [ + 354.0, + 673.0 + ], + [ + 337.0, + 681.0 + ], + [ + 331.0, + 681.0 + ], + [ + 350.0, + 672.0 + ] + ], + "center_px": [ + 343.0, + 676.75 + ], + "area_px": 51.5 + }, + { + "image_points_px": [ + [ + 130.0, + 212.0 + ], + [ + 112.0, + 215.0 + ], + [ + 106.0, + 212.0 + ], + [ + 124.0, + 209.0 + ] + ], + "center_px": [ + 118.0, + 212.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 34.0, + 201.0 + ], + [ + 16.0, + 204.0 + ], + [ + 10.0, + 201.0 + ], + [ + 28.0, + 198.0 + ] + ], + "center_px": [ + 22.0, + 201.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 356.0, + 211.0 + ], + [ + 339.0, + 213.0 + ], + [ + 332.0, + 210.0 + ], + [ + 347.0, + 207.0 + ] + ], + "center_px": [ + 343.5, + 210.25 + ], + "area_px": 76.0 + }, + { + "image_points_px": [ + [ + 63.0, + 202.0 + ], + [ + 82.0, + 200.0 + ], + [ + 87.0, + 203.0 + ], + [ + 68.0, + 205.0 + ] + ], + "center_px": [ + 75.0, + 202.5 + ], + "area_px": 67.0 + }, + { + "image_points_px": [ + [ + 98.0, + 195.0 + ], + [ + 81.0, + 198.0 + ], + [ + 74.0, + 195.0 + ], + [ + 92.0, + 192.0 + ] + ], + "center_px": [ + 86.25, + 195.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 417.0, + 204.0 + ], + [ + 402.0, + 207.0 + ], + [ + 393.0, + 203.0 + ], + [ + 409.0, + 201.0 + ] + ], + "center_px": [ + 405.25, + 203.75 + ], + "area_px": 75.5 + }, + { + "image_points_px": [ + [ + 363.0, + 203.0 + ], + [ + 347.0, + 205.0 + ], + [ + 339.0, + 202.0 + ], + [ + 354.0, + 199.0 + ] + ], + "center_px": [ + 350.75, + 202.25 + ], + "area_px": 75.5 + }, + { + "image_points_px": [ + [ + 396.0, + 196.0 + ], + [ + 380.0, + 198.0 + ], + [ + 372.0, + 195.0 + ], + [ + 387.0, + 192.0 + ] + ], + "center_px": [ + 383.75, + 195.25 + ], + "area_px": 75.5 + }, + { + "image_points_px": [ + [ + 450.0, + 197.0 + ], + [ + 435.0, + 200.0 + ], + [ + 426.0, + 196.0 + ], + [ + 441.0, + 194.0 + ] + ], + "center_px": [ + 438.0, + 196.75 + ], + "area_px": 75.0 + }, + { + "image_points_px": [ + [ + 150.0, + 196.0 + ], + [ + 133.0, + 199.0 + ], + [ + 126.0, + 196.0 + ], + [ + 143.0, + 193.0 + ] + ], + "center_px": [ + 138.0, + 196.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 100.0, + 195.0 + ], + [ + 118.0, + 193.0 + ], + [ + 124.0, + 196.0 + ], + [ + 105.0, + 198.0 + ] + ], + "center_px": [ + 111.75, + 195.5 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 526.0, + 207.0 + ], + [ + 512.0, + 210.0 + ], + [ + 502.0, + 206.0 + ], + [ + 517.0, + 204.0 + ] + ], + "center_px": [ + 514.25, + 206.75 + ], + "area_px": 74.5 + }, + { + "image_points_px": [ + [ + 256.0, + 199.0 + ], + [ + 239.0, + 202.0 + ], + [ + 232.0, + 199.0 + ], + [ + 248.0, + 196.0 + ] + ], + "center_px": [ + 243.75, + 199.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 160.0, + 189.0 + ], + [ + 141.0, + 191.0 + ], + [ + 136.0, + 188.0 + ], + [ + 153.0, + 186.0 + ] + ], + "center_px": [ + 147.5, + 188.5 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 317.0, + 193.0 + ], + [ + 301.0, + 196.0 + ], + [ + 293.0, + 193.0 + ], + [ + 309.0, + 190.0 + ] + ], + "center_px": [ + 305.0, + 193.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 272.0, + 184.0 + ], + [ + 256.0, + 187.0 + ], + [ + 248.0, + 184.0 + ], + [ + 264.0, + 181.0 + ] + ], + "center_px": [ + 260.0, + 184.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 423.0, + 196.0 + ], + [ + 407.0, + 199.0 + ], + [ + 399.0, + 196.0 + ], + [ + 414.0, + 193.0 + ] + ], + "center_px": [ + 410.75, + 196.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 286.0, + 200.0 + ], + [ + 302.0, + 198.0 + ], + [ + 310.0, + 201.0 + ], + [ + 291.0, + 203.0 + ] + ], + "center_px": [ + 297.25, + 200.5 + ], + "area_px": 65.5 + }, + { + "image_points_px": [ + [ + 312.0, + 201.0 + ], + [ + 330.0, + 199.0 + ], + [ + 336.0, + 202.0 + ], + [ + 319.0, + 204.0 + ] + ], + "center_px": [ + 324.25, + 201.5 + ], + "area_px": 65.5 + }, + { + "image_points_px": [ + [ + 561.0, + 192.0 + ], + [ + 546.0, + 195.0 + ], + [ + 537.0, + 192.0 + ], + [ + 551.0, + 189.0 + ] + ], + "center_px": [ + 548.75, + 192.0 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 346.0, + 194.0 + ], + [ + 362.0, + 192.0 + ], + [ + 370.0, + 195.0 + ], + [ + 352.0, + 197.0 + ] + ], + "center_px": [ + 357.5, + 194.5 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 344.0, + 194.0 + ], + [ + 326.0, + 196.0 + ], + [ + 320.0, + 193.0 + ], + [ + 336.0, + 191.0 + ] + ], + "center_px": [ + 331.5, + 193.5 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 300.0, + 185.0 + ], + [ + 317.0, + 183.0 + ], + [ + 324.0, + 186.0 + ], + [ + 307.0, + 188.0 + ] + ], + "center_px": [ + 312.0, + 185.5 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 240.0, + 191.0 + ], + [ + 257.0, + 189.0 + ], + [ + 264.0, + 192.0 + ], + [ + 247.0, + 194.0 + ] + ], + "center_px": [ + 252.0, + 191.5 + ], + "area_px": 65.0 + }, + { + "image_points_px": [ + [ + 479.0, + 198.0 + ], + [ + 496.0, + 196.0 + ], + [ + 503.0, + 199.0 + ], + [ + 487.0, + 201.0 + ] + ], + "center_px": [ + 491.25, + 198.5 + ], + "area_px": 64.5 + }, + { + "image_points_px": [ + [ + 727.0, + 189.0 + ], + [ + 742.0, + 187.0 + ], + [ + 751.0, + 190.0 + ], + [ + 735.0, + 192.0 + ] + ], + "center_px": [ + 738.75, + 189.5 + ], + "area_px": 63.5 + }, + { + "image_points_px": [ + [ + 541.0, + 184.0 + ], + [ + 556.0, + 182.0 + ], + [ + 565.0, + 185.0 + ], + [ + 549.0, + 187.0 + ] + ], + "center_px": [ + 552.75, + 184.5 + ], + "area_px": 63.5 + }, + { + "image_points_px": [ + [ + 567.0, + 185.0 + ], + [ + 583.0, + 183.0 + ], + [ + 591.0, + 186.0 + ], + [ + 576.0, + 188.0 + ] + ], + "center_px": [ + 579.25, + 185.5 + ], + "area_px": 63.5 + }, + { + "image_points_px": [ + [ + 462.0, + 182.0 + ], + [ + 478.0, + 180.0 + ], + [ + 486.0, + 183.0 + ], + [ + 471.0, + 185.0 + ] + ], + "center_px": [ + 474.25, + 182.5 + ], + "area_px": 63.5 + }, + { + "image_points_px": [ + [ + 700.0, + 181.0 + ], + [ + 683.0, + 183.0 + ], + [ + 676.0, + 180.0 + ], + [ + 689.0, + 178.0 + ] + ], + "center_px": [ + 687.0, + 180.5 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 623.0, + 179.0 + ], + [ + 638.0, + 177.0 + ], + [ + 647.0, + 180.0 + ], + [ + 632.0, + 182.0 + ] + ], + "center_px": [ + 635.0, + 179.5 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 431.0, + 189.0 + ], + [ + 448.0, + 187.0 + ], + [ + 455.0, + 189.0 + ], + [ + 439.0, + 192.0 + ] + ], + "center_px": [ + 443.25, + 189.25 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 647.0, + 187.0 + ], + [ + 661.0, + 185.0 + ], + [ + 671.0, + 188.0 + ], + [ + 656.0, + 190.0 + ] + ], + "center_px": [ + 658.75, + 187.5 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 600.0, + 171.0 + ], + [ + 614.0, + 169.0 + ], + [ + 624.0, + 172.0 + ], + [ + 609.0, + 174.0 + ] + ], + "center_px": [ + 611.75, + 171.5 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 458.0, + 190.0 + ], + [ + 472.0, + 187.0 + ], + [ + 482.0, + 190.0 + ], + [ + 464.0, + 192.0 + ] + ], + "center_px": [ + 469.0, + 189.75 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 702.0, + 181.0 + ], + [ + 715.0, + 179.0 + ], + [ + 726.0, + 182.0 + ], + [ + 711.0, + 184.0 + ] + ], + "center_px": [ + 713.5, + 181.5 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 754.0, + 190.0 + ], + [ + 768.0, + 188.0 + ], + [ + 778.0, + 191.0 + ], + [ + 764.0, + 193.0 + ] + ], + "center_px": [ + 766.0, + 190.5 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 594.0, + 186.0 + ], + [ + 611.0, + 184.0 + ], + [ + 618.0, + 186.0 + ], + [ + 604.0, + 189.0 + ] + ], + "center_px": [ + 606.75, + 186.25 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 539.0, + 184.0 + ], + [ + 522.0, + 186.0 + ], + [ + 515.0, + 184.0 + ], + [ + 529.0, + 181.0 + ] + ], + "center_px": [ + 526.25, + 183.75 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 588.0, + 193.0 + ], + [ + 571.0, + 195.0 + ], + [ + 564.0, + 193.0 + ], + [ + 578.0, + 190.0 + ] + ], + "center_px": [ + 575.25, + 192.75 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 571.0, + 178.0 + ], + [ + 587.0, + 176.0 + ], + [ + 595.0, + 178.0 + ], + [ + 581.0, + 181.0 + ] + ], + "center_px": [ + 583.5, + 178.25 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 649.0, + 180.0 + ], + [ + 665.0, + 178.0 + ], + [ + 673.0, + 180.0 + ], + [ + 660.0, + 183.0 + ] + ], + "center_px": [ + 661.75, + 180.25 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 779.0, + 183.0 + ], + [ + 763.0, + 185.0 + ], + [ + 755.0, + 183.0 + ], + [ + 767.0, + 180.0 + ] + ], + "center_px": [ + 766.0, + 182.75 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 203.0, + 198.0 + ], + [ + 187.0, + 201.0 + ], + [ + 180.0, + 197.0 + ], + [ + 196.0, + 195.0 + ] + ], + "center_px": [ + 191.5, + 197.75 + ], + "area_px": 73.5 + }, + { + "image_points_px": [ + [ + 71.0, + 194.0 + ], + [ + 54.0, + 197.0 + ], + [ + 48.0, + 194.0 + ], + [ + 65.0, + 191.0 + ] + ], + "center_px": [ + 59.5, + 194.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 133.0, + 188.0 + ], + [ + 117.0, + 191.0 + ], + [ + 110.0, + 188.0 + ], + [ + 127.0, + 185.0 + ] + ], + "center_px": [ + 121.75, + 188.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 460.0, + 182.0 + ], + [ + 446.0, + 185.0 + ], + [ + 437.0, + 181.0 + ], + [ + 452.0, + 179.0 + ] + ], + "center_px": [ + 448.75, + 181.75 + ], + "area_px": 72.0 + }, + { + "image_points_px": [ + [ + 238.0, + 191.0 + ], + [ + 222.0, + 194.0 + ], + [ + 215.0, + 191.0 + ], + [ + 231.0, + 188.0 + ] + ], + "center_px": [ + 226.5, + 191.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 211.0, + 190.0 + ], + [ + 195.0, + 193.0 + ], + [ + 188.0, + 190.0 + ], + [ + 204.0, + 187.0 + ] + ], + "center_px": [ + 199.5, + 190.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 206.0, + 198.0 + ], + [ + 223.0, + 196.0 + ], + [ + 229.0, + 199.0 + ], + [ + 211.0, + 201.0 + ] + ], + "center_px": [ + 217.25, + 198.5 + ], + "area_px": 63.5 + }, + { + "image_points_px": [ + [ + 376.0, + 187.0 + ], + [ + 361.0, + 190.0 + ], + [ + 353.0, + 187.0 + ], + [ + 367.0, + 184.0 + ] + ], + "center_px": [ + 364.25, + 187.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 434.0, + 181.0 + ], + [ + 420.0, + 184.0 + ], + [ + 411.0, + 181.0 + ], + [ + 425.0, + 178.0 + ] + ], + "center_px": [ + 422.5, + 181.0 + ], + "area_px": 69.0 + }, + { + "image_points_px": [ + [ + 382.0, + 180.0 + ], + [ + 365.0, + 182.0 + ], + [ + 359.0, + 179.0 + ], + [ + 375.0, + 177.0 + ] + ], + "center_px": [ + 370.25, + 179.5 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 228.0, + 176.0 + ], + [ + 212.0, + 178.0 + ], + [ + 205.0, + 175.0 + ], + [ + 222.0, + 173.0 + ] + ], + "center_px": [ + 216.75, + 175.5 + ], + "area_px": 62.5 + }, + { + "image_points_px": [ + [ + 312.0, + 171.0 + ], + [ + 296.0, + 173.0 + ], + [ + 289.0, + 170.0 + ], + [ + 305.0, + 168.0 + ] + ], + "center_px": [ + 300.5, + 170.5 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 305.0, + 178.0 + ], + [ + 289.0, + 180.0 + ], + [ + 282.0, + 177.0 + ], + [ + 298.0, + 175.0 + ] + ], + "center_px": [ + 293.5, + 177.5 + ], + "area_px": 62.0 + }, + { + "image_points_px": [ + [ + 358.0, + 476.0 + ], + [ + 365.0, + 474.0 + ], + [ + 378.0, + 483.0 + ], + [ + 369.0, + 486.0 + ] + ], + "center_px": [ + 367.5, + 479.75 + ], + "area_px": 106.0 + }, + { + "image_points_px": [ + [ + 388.0, + 173.0 + ], + [ + 373.0, + 175.0 + ], + [ + 365.0, + 172.0 + ], + [ + 381.0, + 170.0 + ] + ], + "center_px": [ + 376.75, + 172.5 + ], + "area_px": 61.5 + }, + { + "image_points_px": [ + [ + 385.0, + 180.0 + ], + [ + 401.0, + 178.0 + ], + [ + 408.0, + 181.0 + ], + [ + 393.0, + 183.0 + ] + ], + "center_px": [ + 396.75, + 180.5 + ], + "area_px": 61.5 + }, + { + "image_points_px": [ + [ + 168.0, + 181.0 + ], + [ + 152.0, + 184.0 + ], + [ + 145.0, + 181.0 + ], + [ + 163.0, + 179.0 + ] + ], + "center_px": [ + 157.0, + 181.25 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 467.0, + 175.0 + ], + [ + 483.0, + 173.0 + ], + [ + 490.0, + 176.0 + ], + [ + 476.0, + 178.0 + ] + ], + "center_px": [ + 479.0, + 175.5 + ], + "area_px": 61.0 + }, + { + "image_points_px": [ + [ + 442.0, + 174.0 + ], + [ + 457.0, + 172.0 + ], + [ + 465.0, + 175.0 + ], + [ + 450.0, + 177.0 + ] + ], + "center_px": [ + 453.5, + 174.5 + ], + "area_px": 61.0 + }, + { + "image_points_px": [ + [ + 326.0, + 186.0 + ], + [ + 344.0, + 184.0 + ], + [ + 349.0, + 186.0 + ], + [ + 334.0, + 189.0 + ] + ], + "center_px": [ + 338.25, + 186.25 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 298.0, + 185.0 + ], + [ + 280.0, + 187.0 + ], + [ + 275.0, + 185.0 + ], + [ + 290.0, + 182.0 + ] + ], + "center_px": [ + 285.75, + 184.75 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 280.0, + 177.0 + ], + [ + 262.0, + 179.0 + ], + [ + 257.0, + 177.0 + ], + [ + 272.0, + 174.0 + ] + ], + "center_px": [ + 267.75, + 176.75 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 203.0, + 175.0 + ], + [ + 186.0, + 177.0 + ], + [ + 180.0, + 175.0 + ], + [ + 196.0, + 172.0 + ] + ], + "center_px": [ + 191.25, + 174.75 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 598.0, + 178.0 + ], + [ + 611.0, + 176.0 + ], + [ + 621.0, + 179.0 + ], + [ + 605.0, + 181.0 + ] + ], + "center_px": [ + 608.75, + 178.5 + ], + "area_px": 60.5 + }, + { + "image_points_px": [ + [ + 470.0, + 168.0 + ], + [ + 455.0, + 170.0 + ], + [ + 447.0, + 167.0 + ], + [ + 461.0, + 165.0 + ] + ], + "center_px": [ + 458.25, + 167.5 + ], + "area_px": 60.5 + }, + { + "image_points_px": [ + [ + 363.0, + 172.0 + ], + [ + 346.0, + 174.0 + ], + [ + 340.0, + 172.0 + ], + [ + 355.0, + 169.0 + ] + ], + "center_px": [ + 351.0, + 171.75 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 674.0, + 188.0 + ], + [ + 689.0, + 186.0 + ], + [ + 697.0, + 189.0 + ], + [ + 684.0, + 191.0 + ] + ], + "center_px": [ + 686.0, + 188.5 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 701.0, + 174.0 + ], + [ + 686.0, + 176.0 + ], + [ + 678.0, + 173.0 + ], + [ + 691.0, + 171.0 + ] + ], + "center_px": [ + 689.0, + 173.5 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 552.0, + 163.0 + ], + [ + 567.0, + 161.0 + ], + [ + 575.0, + 164.0 + ], + [ + 562.0, + 166.0 + ] + ], + "center_px": [ + 564.0, + 163.5 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 680.0, + 166.0 + ], + [ + 693.0, + 164.0 + ], + [ + 703.0, + 167.0 + ], + [ + 688.0, + 169.0 + ] + ], + "center_px": [ + 691.0, + 166.5 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 489.0, + 183.0 + ], + [ + 505.0, + 181.0 + ], + [ + 512.0, + 183.0 + ], + [ + 497.0, + 186.0 + ] + ], + "center_px": [ + 500.75, + 183.25 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 445.0, + 167.0 + ], + [ + 429.0, + 169.0 + ], + [ + 422.0, + 167.0 + ], + [ + 436.0, + 164.0 + ] + ], + "center_px": [ + 433.0, + 166.75 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 396.0, + 166.0 + ], + [ + 412.0, + 164.0 + ], + [ + 419.0, + 166.0 + ], + [ + 405.0, + 169.0 + ] + ], + "center_px": [ + 408.0, + 166.25 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 705.0, + 167.0 + ], + [ + 719.0, + 165.0 + ], + [ + 728.0, + 168.0 + ], + [ + 716.0, + 170.0 + ] + ], + "center_px": [ + 717.0, + 167.5 + ], + "area_px": 59.0 + }, + { + "image_points_px": [ + [ + 521.0, + 169.0 + ], + [ + 505.0, + 171.0 + ], + [ + 498.0, + 169.0 + ], + [ + 511.0, + 166.0 + ] + ], + "center_px": [ + 508.75, + 168.75 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 675.0, + 173.0 + ], + [ + 659.0, + 175.0 + ], + [ + 652.0, + 173.0 + ], + [ + 664.0, + 170.0 + ] + ], + "center_px": [ + 662.5, + 172.75 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 626.0, + 172.0 + ], + [ + 641.0, + 170.0 + ], + [ + 649.0, + 172.0 + ], + [ + 636.0, + 175.0 + ] + ], + "center_px": [ + 638.0, + 172.25 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 472.0, + 168.0 + ], + [ + 488.0, + 166.0 + ], + [ + 495.0, + 169.0 + ], + [ + 478.0, + 170.0 + ] + ], + "center_px": [ + 483.25, + 168.25 + ], + "area_px": 51.0 + }, + { + "image_points_px": [ + [ + 346.0, + 165.0 + ], + [ + 363.0, + 163.0 + ], + [ + 369.0, + 165.0 + ], + [ + 352.0, + 167.0 + ] + ], + "center_px": [ + 357.5, + 165.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 427.0, + 160.0 + ], + [ + 443.0, + 158.0 + ], + [ + 450.0, + 160.0 + ], + [ + 433.0, + 162.0 + ] + ], + "center_px": [ + 438.25, + 160.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 502.0, + 162.0 + ], + [ + 518.0, + 160.0 + ], + [ + 525.0, + 162.0 + ], + [ + 509.0, + 164.0 + ] + ], + "center_px": [ + 513.5, + 162.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 575.0, + 171.0 + ], + [ + 591.0, + 169.0 + ], + [ + 598.0, + 171.0 + ], + [ + 582.0, + 173.0 + ] + ], + "center_px": [ + 586.5, + 171.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 654.0, + 166.0 + ], + [ + 669.0, + 164.0 + ], + [ + 677.0, + 166.0 + ], + [ + 661.0, + 168.0 + ] + ], + "center_px": [ + 665.25, + 166.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 578.0, + 164.0 + ], + [ + 593.0, + 162.0 + ], + [ + 601.0, + 164.0 + ], + [ + 585.0, + 166.0 + ] + ], + "center_px": [ + 589.25, + 164.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 681.0, + 160.0 + ], + [ + 697.0, + 158.0 + ], + [ + 704.0, + 160.0 + ], + [ + 689.0, + 162.0 + ] + ], + "center_px": [ + 692.75, + 160.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 606.0, + 158.0 + ], + [ + 621.0, + 156.0 + ], + [ + 629.0, + 158.0 + ], + [ + 613.0, + 160.0 + ] + ], + "center_px": [ + 617.25, + 158.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 456.0, + 154.0 + ], + [ + 472.0, + 152.0 + ], + [ + 479.0, + 154.0 + ], + [ + 464.0, + 156.0 + ] + ], + "center_px": [ + 467.75, + 154.0 + ], + "area_px": 46.0 + }, + { + "image_points_px": [ + [ + 107.0, + 187.0 + ], + [ + 90.0, + 190.0 + ], + [ + 85.0, + 187.0 + ], + [ + 101.0, + 184.0 + ] + ], + "center_px": [ + 95.75, + 187.0 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 194.0, + 182.0 + ], + [ + 178.0, + 185.0 + ], + [ + 172.0, + 182.0 + ], + [ + 187.0, + 179.0 + ] + ], + "center_px": [ + 182.75, + 182.0 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 220.0, + 183.0 + ], + [ + 202.0, + 185.0 + ], + [ + 198.0, + 182.0 + ], + [ + 213.0, + 180.0 + ] + ], + "center_px": [ + 208.25, + 182.5 + ], + "area_px": 60.5 + }, + { + "image_points_px": [ + [ + 143.0, + 181.0 + ], + [ + 126.0, + 183.0 + ], + [ + 121.0, + 180.0 + ], + [ + 137.0, + 178.0 + ] + ], + "center_px": [ + 131.75, + 180.5 + ], + "area_px": 60.5 + }, + { + "image_points_px": [ + [ + 236.0, + 169.0 + ], + [ + 220.0, + 171.0 + ], + [ + 214.0, + 168.0 + ], + [ + 230.0, + 166.0 + ] + ], + "center_px": [ + 225.0, + 168.5 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 287.0, + 170.0 + ], + [ + 270.0, + 172.0 + ], + [ + 265.0, + 169.0 + ], + [ + 279.0, + 167.0 + ] + ], + "center_px": [ + 275.25, + 169.5 + ], + "area_px": 59.5 + }, + { + "image_points_px": [ + [ + 475.0, + 161.0 + ], + [ + 459.0, + 163.0 + ], + [ + 453.0, + 160.0 + ], + [ + 466.0, + 158.0 + ] + ], + "center_px": [ + 463.25, + 160.5 + ], + "area_px": 58.5 + }, + { + "image_points_px": [ + [ + 509.0, + 454.0 + ], + [ + 492.0, + 461.0 + ], + [ + 488.0, + 459.0 + ], + [ + 499.0, + 453.0 + ] + ], + "center_px": [ + 497.0, + 456.75 + ], + "area_px": 66.5 + }, + { + "image_points_px": [ + [ + 372.0, + 165.0 + ], + [ + 386.0, + 163.0 + ], + [ + 394.0, + 166.0 + ], + [ + 379.0, + 168.0 + ] + ], + "center_px": [ + 382.75, + 165.5 + ], + "area_px": 58.5 + }, + { + "image_points_px": [ + [ + 549.0, + 170.0 + ], + [ + 564.0, + 168.0 + ], + [ + 571.0, + 171.0 + ], + [ + 558.0, + 173.0 + ] + ], + "center_px": [ + 560.5, + 170.5 + ], + "area_px": 58.0 + }, + { + "image_points_px": [ + [ + 424.0, + 160.0 + ], + [ + 411.0, + 162.0 + ], + [ + 402.0, + 159.0 + ], + [ + 417.0, + 157.0 + ] + ], + "center_px": [ + 413.5, + 159.5 + ], + "area_px": 58.0 + }, + { + "image_points_px": [ + [ + 244.0, + 162.0 + ], + [ + 228.0, + 164.0 + ], + [ + 222.0, + 162.0 + ], + [ + 237.0, + 159.0 + ] + ], + "center_px": [ + 232.75, + 161.75 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 308.0, + 178.0 + ], + [ + 324.0, + 176.0 + ], + [ + 330.0, + 178.0 + ], + [ + 315.0, + 181.0 + ] + ], + "center_px": [ + 319.25, + 178.25 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 579.0, + 157.0 + ], + [ + 564.0, + 159.0 + ], + [ + 557.0, + 156.0 + ], + [ + 569.0, + 154.0 + ] + ], + "center_px": [ + 567.25, + 156.5 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 524.0, + 169.0 + ], + [ + 537.0, + 167.0 + ], + [ + 546.0, + 170.0 + ], + [ + 532.0, + 172.0 + ] + ], + "center_px": [ + 534.75, + 169.5 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 550.0, + 163.0 + ], + [ + 536.0, + 165.0 + ], + [ + 528.0, + 162.0 + ], + [ + 541.0, + 160.0 + ] + ], + "center_px": [ + 538.75, + 162.5 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 477.0, + 161.0 + ], + [ + 491.0, + 159.0 + ], + [ + 499.0, + 162.0 + ], + [ + 486.0, + 164.0 + ] + ], + "center_px": [ + 488.25, + 161.5 + ], + "area_px": 57.5 + }, + { + "image_points_px": [ + [ + 391.0, + 173.0 + ], + [ + 407.0, + 171.0 + ], + [ + 413.0, + 173.0 + ], + [ + 399.0, + 176.0 + ] + ], + "center_px": [ + 402.5, + 173.25 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 626.0, + 165.0 + ], + [ + 612.0, + 167.0 + ], + [ + 604.0, + 164.0 + ], + [ + 616.0, + 162.0 + ] + ], + "center_px": [ + 614.5, + 164.5 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 581.0, + 157.0 + ], + [ + 595.0, + 155.0 + ], + [ + 603.0, + 158.0 + ], + [ + 591.0, + 160.0 + ] + ], + "center_px": [ + 592.5, + 157.5 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 439.0, + 174.0 + ], + [ + 423.0, + 176.0 + ], + [ + 417.0, + 174.0 + ], + [ + 430.0, + 171.0 + ] + ], + "center_px": [ + 427.25, + 173.75 + ], + "area_px": 55.0 + }, + { + "image_points_px": [ + [ + 656.0, + 159.0 + ], + [ + 670.0, + 157.0 + ], + [ + 678.0, + 160.0 + ], + [ + 667.0, + 162.0 + ] + ], + "center_px": [ + 667.75, + 159.5 + ], + "area_px": 56.5 + }, + { + "image_points_px": [ + [ + 609.0, + 151.0 + ], + [ + 622.0, + 149.0 + ], + [ + 631.0, + 152.0 + ], + [ + 619.0, + 154.0 + ] + ], + "center_px": [ + 620.25, + 151.5 + ], + "area_px": 56.5 + }, + { + "image_points_px": [ + [ + 659.0, + 152.0 + ], + [ + 674.0, + 151.0 + ], + [ + 681.0, + 153.0 + ], + [ + 668.0, + 155.0 + ] + ], + "center_px": [ + 670.5, + 152.75 + ], + "area_px": 47.0 + }, + { + "image_points_px": [ + [ + 531.0, + 156.0 + ], + [ + 547.0, + 154.0 + ], + [ + 553.0, + 156.0 + ], + [ + 538.0, + 158.0 + ] + ], + "center_px": [ + 542.25, + 156.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 334.0, + 151.0 + ], + [ + 350.0, + 149.0 + ], + [ + 356.0, + 151.0 + ], + [ + 341.0, + 153.0 + ] + ], + "center_px": [ + 345.25, + 151.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 389.0, + 146.0 + ], + [ + 405.0, + 144.0 + ], + [ + 411.0, + 146.0 + ], + [ + 396.0, + 148.0 + ] + ], + "center_px": [ + 400.25, + 146.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 490.0, + 142.0 + ], + [ + 506.0, + 140.0 + ], + [ + 512.0, + 142.0 + ], + [ + 497.0, + 144.0 + ] + ], + "center_px": [ + 501.25, + 142.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 408.0, + 153.0 + ], + [ + 423.0, + 151.0 + ], + [ + 430.0, + 153.0 + ], + [ + 415.0, + 155.0 + ] + ], + "center_px": [ + 419.0, + 153.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 437.0, + 147.0 + ], + [ + 452.0, + 145.0 + ], + [ + 459.0, + 147.0 + ], + [ + 444.0, + 149.0 + ] + ], + "center_px": [ + 448.0, + 147.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 418.0, + 140.0 + ], + [ + 433.0, + 138.0 + ], + [ + 440.0, + 140.0 + ], + [ + 425.0, + 142.0 + ] + ], + "center_px": [ + 429.0, + 140.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 423.0, + 134.0 + ], + [ + 438.0, + 132.0 + ], + [ + 445.0, + 134.0 + ], + [ + 430.0, + 136.0 + ] + ], + "center_px": [ + 434.0, + 134.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 612.0, + 145.0 + ], + [ + 626.0, + 143.0 + ], + [ + 634.0, + 145.0 + ], + [ + 619.0, + 147.0 + ] + ], + "center_px": [ + 622.75, + 145.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 590.0, + 138.0 + ], + [ + 604.0, + 136.0 + ], + [ + 612.0, + 138.0 + ], + [ + 597.0, + 140.0 + ] + ], + "center_px": [ + 600.75, + 138.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 450.0, + 128.0 + ], + [ + 435.0, + 130.0 + ], + [ + 428.0, + 128.0 + ], + [ + 442.0, + 126.0 + ] + ], + "center_px": [ + 438.75, + 128.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 538.0, + 143.0 + ], + [ + 552.0, + 141.0 + ], + [ + 560.0, + 143.0 + ], + [ + 546.0, + 145.0 + ] + ], + "center_px": [ + 549.0, + 143.0 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 899.0, + 253.0 + ], + [ + 911.0, + 250.0 + ], + [ + 920.0, + 254.0 + ], + [ + 909.0, + 257.0 + ] + ], + "center_px": [ + 909.75, + 253.5 + ], + "area_px": 74.5 + }, + { + "image_points_px": [ + [ + 318.0, + 164.0 + ], + [ + 303.0, + 166.0 + ], + [ + 297.0, + 163.0 + ], + [ + 312.0, + 161.0 + ] + ], + "center_px": [ + 307.5, + 163.5 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 276.0, + 156.0 + ], + [ + 261.0, + 158.0 + ], + [ + 255.0, + 155.0 + ], + [ + 269.0, + 153.0 + ] + ], + "center_px": [ + 265.25, + 155.5 + ], + "area_px": 56.5 + }, + { + "image_points_px": [ + [ + 353.0, + 158.0 + ], + [ + 368.0, + 156.0 + ], + [ + 374.0, + 158.0 + ], + [ + 361.0, + 161.0 + ] + ], + "center_px": [ + 364.0, + 158.25 + ], + "area_px": 52.5 + }, + { + "image_points_px": [ + [ + 977.0, + 569.0 + ], + [ + 984.0, + 566.0 + ], + [ + 993.0, + 573.0 + ], + [ + 995.0, + 577.0 + ] + ], + "center_px": [ + 987.25, + 571.25 + ], + "area_px": 66.0 + }, + { + "image_points_px": [ + [ + 317.0, + 144.0 + ], + [ + 332.0, + 142.0 + ], + [ + 338.0, + 144.0 + ], + [ + 323.0, + 146.0 + ] + ], + "center_px": [ + 327.5, + 144.0 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 475.0, + 129.0 + ], + [ + 489.0, + 127.0 + ], + [ + 496.0, + 129.0 + ], + [ + 481.0, + 131.0 + ] + ], + "center_px": [ + 485.25, + 129.0 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 443.0, + 141.0 + ], + [ + 458.0, + 139.0 + ], + [ + 464.0, + 141.0 + ], + [ + 450.0, + 143.0 + ] + ], + "center_px": [ + 453.75, + 141.0 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 560.0, + 150.0 + ], + [ + 574.0, + 148.0 + ], + [ + 581.0, + 150.0 + ], + [ + 567.0, + 152.0 + ] + ], + "center_px": [ + 570.5, + 150.0 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 543.0, + 137.0 + ], + [ + 557.0, + 135.0 + ], + [ + 564.0, + 137.0 + ], + [ + 550.0, + 139.0 + ] + ], + "center_px": [ + 553.5, + 137.0 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 546.0, + 131.0 + ], + [ + 560.0, + 129.0 + ], + [ + 567.0, + 131.0 + ], + [ + 554.0, + 133.0 + ] + ], + "center_px": [ + 556.75, + 131.0 + ], + "area_px": 42.0 + }, + { + "image_points_px": [ + [ + 570.0, + 131.0 + ], + [ + 585.0, + 130.0 + ], + [ + 591.0, + 132.0 + ], + [ + 576.0, + 133.0 + ] + ], + "center_px": [ + 580.5, + 131.5 + ], + "area_px": 36.0 + }, + { + "image_points_px": [ + [ + 869.0, + 252.0 + ], + [ + 881.0, + 249.0 + ], + [ + 889.0, + 253.0 + ], + [ + 878.0, + 256.0 + ] + ], + "center_px": [ + 879.25, + 252.5 + ], + "area_px": 71.5 + }, + { + "image_points_px": [ + [ + 307.0, + 150.0 + ], + [ + 292.0, + 152.0 + ], + [ + 287.0, + 149.0 + ], + [ + 300.0, + 147.0 + ] + ], + "center_px": [ + 296.5, + 149.5 + ], + "area_px": 54.0 + }, + { + "image_points_px": [ + [ + 434.0, + 147.0 + ], + [ + 421.0, + 149.0 + ], + [ + 414.0, + 146.0 + ], + [ + 427.0, + 144.0 + ] + ], + "center_px": [ + 424.0, + 146.5 + ], + "area_px": 53.0 + }, + { + "image_points_px": [ + [ + 491.0, + 136.0 + ], + [ + 477.0, + 137.0 + ], + [ + 471.0, + 135.0 + ], + [ + 485.0, + 133.0 + ] + ], + "center_px": [ + 481.0, + 135.25 + ], + "area_px": 44.0 + }, + { + "image_points_px": [ + [ + 616.0, + 138.0 + ], + [ + 629.0, + 137.0 + ], + [ + 636.0, + 139.0 + ], + [ + 623.0, + 141.0 + ] + ], + "center_px": [ + 626.0, + 138.75 + ], + "area_px": 43.0 + }, + { + "image_points_px": [ + [ + 371.0, + 139.0 + ], + [ + 386.0, + 137.0 + ], + [ + 391.0, + 139.0 + ], + [ + 377.0, + 141.0 + ] + ], + "center_px": [ + 381.25, + 139.0 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 377.0, + 133.0 + ], + [ + 391.0, + 131.0 + ], + [ + 397.0, + 133.0 + ], + [ + 383.0, + 135.0 + ] + ], + "center_px": [ + 387.0, + 133.0 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 539.0, + 136.0 + ], + [ + 525.0, + 138.0 + ], + [ + 519.0, + 136.0 + ], + [ + 532.0, + 134.0 + ] + ], + "center_px": [ + 528.75, + 136.0 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 570.0, + 125.0 + ], + [ + 557.0, + 127.0 + ], + [ + 550.0, + 125.0 + ], + [ + 563.0, + 123.0 + ] + ], + "center_px": [ + 560.0, + 125.0 + ], + "area_px": 40.0 + }, + { + "image_points_px": [ + [ + 511.0, + 112.0 + ], + [ + 525.0, + 111.0 + ], + [ + 531.0, + 113.0 + ], + [ + 516.0, + 114.0 + ] + ], + "center_px": [ + 520.75, + 112.5 + ], + "area_px": 34.5 + }, + { + "image_points_px": [ + [ + 810.0, + 241.0 + ], + [ + 821.0, + 238.0 + ], + [ + 829.0, + 242.0 + ], + [ + 818.0, + 245.0 + ] + ], + "center_px": [ + 819.5, + 241.5 + ], + "area_px": 68.0 + } + ] +} \ No newline at end of file diff --git a/pipeline/render_3a_camera_pose.json b/pipeline/render_3a_camera_pose.json new file mode 100644 index 0000000..87eb5d8 --- /dev/null +++ b/pipeline/render_3a_camera_pose.json @@ -0,0 +1,329 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-29T05:34:16Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3a_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json" + }, + "camera": { + "camera_id": "cam1", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 4, + "used_marker_ids": [ + 210, + 205, + 206, + 207 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27 + ], + "rms": [ + 1.0114134663676055, + 0.6639182528097215, + 0.5739469492087472, + 0.5286835626522526, + 0.4694051705223743, + 0.3969964464975006, + 0.3151761230050886, + 0.22825811420039874, + 0.14334708153431971, + 0.07618149778337073, + 0.04802982967284346, + 0.04035287824536157, + 0.033959902522562355, + 0.028057435706365975, + 0.022767087572099415, + 0.018281990481919433, + 0.01422702734760535, + 0.01058775888038278, + 0.007566043482152367, + 0.005123936904466261, + 0.003261157779092087, + 0.0018882632118665536, + 0.0007684323923658777, + 0.0001398894364081004, + 4.2590187754836205e-05, + 4.161871278906256e-05, + 4.161660887281736e-05, + 4.16166073463803e-05 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125, + 6.25e-05, + 3.125e-05, + 1.5625e-05, + 7.8125e-06, + 3.90625e-06, + 1.953125e-06, + 9.765625e-07, + 4.8828125e-07, + 2.44140625e-07, + 1.220703125e-07, + 6.103515625e-08, + 3.0517578125e-08, + 1.52587890625e-08, + 7.62939453125e-09, + 3.814697265625e-09, + 1.9073486328125e-09, + 9.5367431640625e-10, + 4.76837158203125e-10, + 2.384185791015625e-10, + 1.1920928955078125e-10, + 5.960464477539063e-11, + 2.980232238769531e-11, + 1.4901161193847657e-11, + 7.450580596923828e-12 + ] + }, + "residual_rms_px": 0.10430687360172344, + "residual_median_px": 0.07433889289506992, + "residual_max_px": 0.1640622076531485, + "sigma2_normalized": 6.92776802797649e-09 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.7620593309402466, + -0.647443413734436, + 0.009086735546588898 + ], + [ + -0.27515384554862976, + -0.33650344610214233, + -0.9005863666534424 + ], + [ + 0.5861364603042603, + 0.6837999820709229, + -0.4345821440219879 + ] + ], + "translation_m": [ + -273.4744567871094, + 192.1861572265625, + 922.5557250976562 + ], + "rvec_rad": [ + 1.9264447184295097, + -0.7016308556001063, + 0.45266440822553355 + ] + }, + "camera_in_world": { + "position_m": [ + -279.4590148925781, + -743.2315063476562, + 576.491455078125 + ], + "position_mm": [ + -279459.0, + -743231.5, + 576491.4375 + ], + "orientation_deg": { + "roll": 122.43758392333984, + "pitch": -35.88331624307256, + "yaw": -19.852935791015625 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 3.9943919468012445e-06, + 1.1154473298546209e-06, + -1.118897886488766e-06, + -0.0005765194014531353, + 0.00041358722245405364, + 0.0022187093112645048 + ], + [ + 1.1154473298546145e-06, + 8.886589103748773e-07, + -2.3371494827736547e-06, + -0.0005830464121191728, + 0.00045167407920918234, + 0.0022451714145222145 + ], + [ + -1.1188978864887337e-06, + -2.337149482773653e-06, + 7.81346071908241e-06, + 0.0017024049446432569, + -0.0013917849716835104, + -0.006611198495461098 + ], + [ + -0.0005765194014531287, + -0.0005830464121191726, + 0.0017024049446432584, + 0.4034039987420133, + -0.3201198249762993, + -1.5516686677679883 + ], + [ + 0.00041358722245404654, + 0.0004516740792091824, + -0.001391784971683514, + -0.3201198249762996, + 0.264775180218034, + 1.2494317575832103 + ], + [ + 0.002218709311264482, + 0.002245171414522214, + -0.006611198495461105, + -1.5516686677679885, + 1.2494317575832097, + 6.052706569330424 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 0.11451120140577908, + 0.05401199046483257, + 0.16015641874171344 + ], + "tvec_std_m": [ + 0.6351409282529455, + 0.51456309644011, + 2.460224902184844 + ] + }, + "camera_center_std_m": [ + 2.1995968929483474, + 1.1548044194575717, + 1.510385159357917 + ], + "camera_center_std_mm": [ + 2199.5968929483474, + 1154.8044194575718, + 1510.385159357917 + ], + "orientation_std_deg": { + "roll": 0.08832300327411201, + "pitch": 0.13890967443140134, + "yaw": 0.020881373905939325 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 210, + "observed_center_px": [ + 166.25, + 674.75 + ], + "projected_center_px": [ + 166.26881408691406, + 674.7455444335938 + ], + "reprojection_error_px": 0.019334475384928378, + "confidence": 0.23718801109435655 + }, + { + "marker_id": 205, + "observed_center_px": [ + 1127.0, + 378.25 + ], + "projected_center_px": [ + 1127.124267578125, + 378.265380859375 + ], + "reprojection_error_px": 0.12521582091799144, + "confidence": 0.19676029488014599 + }, + { + "marker_id": 206, + "observed_center_px": [ + 953.25, + 379.0 + ], + "projected_center_px": [ + 953.086181640625, + 379.0089416503906 + ], + "reprojection_error_px": 0.1640622076531485, + "confidence": 0.23511362818048806 + }, + { + "marker_id": 207, + "observed_center_px": [ + 1039.5, + 347.75 + ], + "projected_center_px": [ + 1039.5140380859375, + 347.731201171875 + ], + "reprojection_error_px": 0.023461964872148418, + "confidence": 0.18076863774153512 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/pipeline/render_3b.png b/pipeline/render_3b.png new file mode 100644 index 0000000..0000e32 Binary files /dev/null and b/pipeline/render_3b.png differ diff --git a/pipeline/render_3b_aruco_detection.json b/pipeline/render_3b_aruco_detection.json new file mode 100644 index 0000000..b19655b --- /dev/null +++ b/pipeline/render_3b_aruco_detection.json @@ -0,0 +1,15562 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-29T05:34:15Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3b.png", + "image_sha256": "9425c80c6905004685cbb7dbcdadf7a9d0f7effd08f73a88fd0c28bd40899819", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 9, + "num_rejected_candidates": 601 + }, + "detections": [ + { + "observation_id": "1be932ff-7263-4ced-83b8-58349f38889f", + "type": "aruco", + "marker_id": 243, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 378.0, + 525.0 + ], + [ + 440.0, + 531.0 + ], + [ + 443.0, + 584.0 + ], + [ + 382.0, + 578.0 + ] + ], + "center_px": [ + 410.75, + 554.5 + ], + "quality": { + "area_px": 3238.5, + "perimeter_px": 229.81958770751953, + "sharpness": { + "laplacian_var": 1396.2847486094263 + }, + "contrast": { + "p05": 30.0, + "p95": 187.0, + "dynamic_range": 157.0, + "mean_gray": 80.26582278481013, + "std_gray": 69.57711222955201 + }, + "geometry": { + "distance_to_center_norm": 0.4094257950782776, + "distance_to_border_px": 136.0 + }, + "edge_ratio": 1.1733980450524408, + "edge_lengths_px": [ + 62.28964614868164, + 53.0848388671875, + 61.29437255859375, + 53.15073013305664 + ] + }, + "confidence": 0.8522257252911212 + }, + { + "observation_id": "66a033df-340c-4cab-b2db-1766eaeecbd5", + "type": "aruco", + "marker_id": 122, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 523.0, + 553.0 + ], + [ + 603.0, + 548.0 + ], + [ + 588.0, + 567.0 + ], + [ + 504.0, + 573.0 + ] + ], + "center_px": [ + 554.5, + 560.25 + ], + "quality": { + "area_px": 1505.5, + "perimeter_px": 216.16377639770508, + "sharpness": { + "laplacian_var": 1947.7761385329877 + }, + "contrast": { + "p05": 29.0, + "p95": 163.0, + "dynamic_range": 134.0, + "mean_gray": 67.94202898550725, + "std_gray": 53.710284927510195 + }, + "geometry": { + "distance_to_center_norm": 0.29652512073516846, + "distance_to_border_px": 147.0 + }, + "edge_ratio": 3.4788486841249955, + "edge_lengths_px": [ + 80.15609741210938, + 24.20743751525879, + 84.2140121459961, + 27.58622932434082 + ] + }, + "confidence": 0.2874514216623714 + }, + { + "observation_id": "9189022c-4502-4196-adb3-e3beb9778552", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 411.0, + 412.0 + ], + [ + 470.0, + 418.0 + ], + [ + 454.0, + 448.0 + ], + [ + 393.0, + 442.0 + ] + ], + "center_px": [ + 432.0, + 430.0 + ], + "quality": { + "area_px": 1902.0, + "perimeter_px": 189.58438110351562, + "sharpness": { + "laplacian_var": 1898.1972109292008 + }, + "contrast": { + "p05": 14.0, + "p95": 174.0, + "dynamic_range": 160.0, + "mean_gray": 59.73708558211257, + "std_gray": 66.85063931639831 + }, + "geometry": { + "distance_to_center_norm": 0.29887276887893677, + "distance_to_border_px": 272.0 + }, + "edge_ratio": 1.8027756634880514, + "edge_lengths_px": [ + 59.304298400878906, + 34.0, + 61.29437255859375, + 34.98571014404297 + ] + }, + "confidence": 0.5547001883002887 + }, + { + "observation_id": "81a8944e-c517-4f33-a9af-826ccb1e4500", + "type": "aruco", + "marker_id": 208, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 967.0, + 617.0 + ], + [ + 1024.0, + 623.0 + ], + [ + 1025.0, + 659.0 + ], + [ + 966.0, + 653.0 + ] + ], + "center_px": [ + 995.5, + 638.0 + ], + "quality": { + "area_px": 2088.0, + "perimeter_px": 188.64698791503906, + "sharpness": { + "laplacian_var": 1679.1474065102575 + }, + "contrast": { + "p05": 9.0, + "p95": 156.0, + "dynamic_range": 147.0, + "mean_gray": 56.92226148409894, + "std_gray": 63.99353682450844 + }, + "geometry": { + "distance_to_center_norm": 0.6145856976509094, + "distance_to_border_px": 61.0 + }, + "edge_ratio": 1.6467064739264285, + "edge_lengths_px": [ + 57.314918518066406, + 36.013885498046875, + 59.304298400878906, + 36.013885498046875 + ] + }, + "confidence": 0.6072727689079809 + }, + { + "observation_id": "e8e63ed2-0a0d-4619-88bd-512e3b6462af", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 740.0, + 592.0 + ], + [ + 795.0, + 598.0 + ], + [ + 790.0, + 633.0 + ], + [ + 733.0, + 627.0 + ] + ], + "center_px": [ + 764.5, + 612.5 + ], + "quality": { + "area_px": 1996.0, + "perimeter_px": 183.68970108032227, + "sharpness": { + "laplacian_var": 561.5252898487581 + }, + "contrast": { + "p05": 6.0, + "p95": 103.0, + "dynamic_range": 97.0, + "mean_gray": 39.58893871449925, + "std_gray": 42.205950284075996 + }, + "geometry": { + "distance_to_center_norm": 0.38339152932167053, + "distance_to_border_px": 87.0 + }, + "edge_ratio": 1.6211107023054123, + "edge_lengths_px": [ + 55.3263053894043, + 35.35533905029297, + 57.314918518066406, + 35.693138122558594 + ] + }, + "confidence": 0.6168610191628993 + }, + { + "observation_id": "79675f29-63c3-45bc-8e37-779d5a97d76a", + "type": "aruco", + "marker_id": 214, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 970.0, + 510.0 + ], + [ + 1022.0, + 515.0 + ], + [ + 1023.0, + 546.0 + ], + [ + 969.0, + 540.0 + ] + ], + "center_px": [ + 996.0, + 527.75 + ], + "quality": { + "area_px": 1616.5, + "perimeter_px": 167.60492706298828, + "sharpness": { + "laplacian_var": 2052.8436051251074 + }, + "contrast": { + "p05": 11.0, + "p95": 163.0, + "dynamic_range": 152.0, + "mean_gray": 81.60164083865087, + "std_gray": 69.22495082566255 + }, + "geometry": { + "distance_to_center_norm": 0.5359413027763367, + "distance_to_border_px": 174.0 + }, + "edge_ratio": 1.8100716409139617, + "edge_lengths_px": [ + 52.239830017089844, + 31.016124725341797, + 54.33230972290039, + 30.01666259765625 + ] + }, + "confidence": 0.5524643209674667 + }, + { + "observation_id": "8e7e7d7d-531f-4f28-a777-882aa927f15e", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 760.0, + 489.0 + ], + [ + 811.0, + 494.0 + ], + [ + 806.0, + 524.0 + ], + [ + 755.0, + 518.0 + ] + ], + "center_px": [ + 783.0, + 506.25 + ], + "quality": { + "area_px": 1532.0, + "perimeter_px": 162.43792724609375, + "sharpness": { + "laplacian_var": 1423.7480445764772 + }, + "contrast": { + "p05": 8.0, + "p95": 149.0, + "dynamic_range": 141.0, + "mean_gray": 60.47378455672069, + "std_gray": 62.970172619491905 + }, + "geometry": { + "distance_to_center_norm": 0.2785549461841583, + "distance_to_border_px": 196.0 + }, + "edge_ratio": 1.7450027328969038, + "edge_lengths_px": [ + 51.244510650634766, + 30.4138126373291, + 51.35172653198242, + 29.42787742614746 + ] + }, + "confidence": 0.5730650050844824 + }, + { + "observation_id": "19153e12-9f50-48c7-8069-2ea0f9214e36", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 468.0, + 316.0 + ], + [ + 521.0, + 321.0 + ], + [ + 509.0, + 344.0 + ], + [ + 454.0, + 340.0 + ] + ], + "center_px": [ + 488.0, + 330.25 + ], + "quality": { + "area_px": 1327.5, + "perimeter_px": 162.10771942138672, + "sharpness": { + "laplacian_var": 3303.753294477139 + }, + "contrast": { + "p05": 14.0, + "p95": 173.0, + "dynamic_range": 159.0, + "mean_gray": 77.05531914893616, + "std_gray": 68.90473784318877 + }, + "geometry": { + "distance_to_center_norm": 0.21092678606510162, + "distance_to_border_px": 316.0 + }, + "edge_ratio": 2.125693697625512, + "edge_lengths_px": [ + 53.23532485961914, + 25.942243576049805, + 55.145263671875, + 27.784887313842773 + ] + }, + "confidence": 0.4163346774695628 + }, + { + "observation_id": "df22043b-b438-4a0e-a53f-4aa96262911c", + "type": "aruco", + "marker_id": 210, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 298.0, + 455.0 + ], + [ + 341.0, + 459.0 + ], + [ + 330.0, + 487.0 + ], + [ + 282.0, + 482.0 + ] + ], + "center_px": [ + 312.75, + 470.75 + ], + "quality": { + "area_px": 1312.0, + "perimeter_px": 152.91328620910645, + "sharpness": { + "laplacian_var": 2803.032092568423 + }, + "contrast": { + "p05": 22.0, + "p95": 182.0, + "dynamic_range": 160.0, + "mean_gray": 83.8172531214529, + "std_gray": 68.60422593278913 + }, + "geometry": { + "distance_to_center_norm": 0.4704907238483429, + "distance_to_border_px": 233.0 + }, + "edge_ratio": 1.6042071306159482, + "edge_lengths_px": [ + 43.185646057128906, + 30.08321762084961, + 48.25971221923828, + 31.38471031188965 + ] + }, + "confidence": 0.5452330001368535 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 518.0, + 419.0 + ], + [ + 497.0, + 550.0 + ], + [ + 483.0, + 563.0 + ], + [ + 491.0, + 475.0 + ] + ], + "center_px": [ + 497.25, + 501.75 + ], + "area_px": 1744.5 + }, + { + "image_points_px": [ + [ + 506.0, + 350.0 + ], + [ + 471.0, + 415.0 + ], + [ + 428.0, + 411.0 + ], + [ + 457.0, + 346.0 + ] + ], + "center_px": [ + 465.5, + 380.5 + ], + "area_px": 3118.0 + }, + { + "image_points_px": [ + [ + 172.0, + 702.0 + ], + [ + 190.0, + 673.0 + ], + [ + 231.0, + 678.0 + ], + [ + 214.0, + 707.0 + ] + ], + "center_px": [ + 201.75, + 690.0 + ], + "area_px": 1291.0 + }, + { + "image_points_px": [ + [ + 86.0, + 691.0 + ], + [ + 104.0, + 663.0 + ], + [ + 145.0, + 668.0 + ], + [ + 127.0, + 696.0 + ] + ], + "center_px": [ + 115.5, + 679.5 + ], + "area_px": 1238.0 + }, + { + "image_points_px": [ + [ + 147.0, + 667.0 + ], + [ + 164.0, + 639.0 + ], + [ + 205.0, + 644.0 + ], + [ + 189.0, + 671.0 + ] + ], + "center_px": [ + 176.25, + 655.25 + ], + "area_px": 1215.5 + }, + { + "image_points_px": [ + [ + 319.0, + 687.0 + ], + [ + 333.0, + 659.0 + ], + [ + 375.0, + 664.0 + ], + [ + 359.0, + 692.0 + ] + ], + "center_px": [ + 346.5, + 675.5 + ], + "area_px": 1223.0 + }, + { + "image_points_px": [ + [ + 248.0, + 649.0 + ], + [ + 289.0, + 654.0 + ], + [ + 274.0, + 682.0 + ], + [ + 233.0, + 677.0 + ] + ], + "center_px": [ + 261.0, + 665.5 + ], + "area_px": 1223.0 + }, + { + "image_points_px": [ + [ + 63.0, + 657.0 + ], + [ + 81.0, + 630.0 + ], + [ + 121.0, + 634.0 + ], + [ + 104.0, + 661.0 + ] + ], + "center_px": [ + 92.25, + 645.5 + ], + "area_px": 1163.5 + }, + { + "image_points_px": [ + [ + 124.0, + 633.0 + ], + [ + 141.0, + 607.0 + ], + [ + 180.0, + 611.0 + ], + [ + 164.0, + 637.0 + ] + ], + "center_px": [ + 152.25, + 622.0 + ], + "area_px": 1093.0 + }, + { + "image_points_px": [ + [ + 42.0, + 623.0 + ], + [ + 60.0, + 598.0 + ], + [ + 99.0, + 602.0 + ], + [ + 81.0, + 628.0 + ] + ], + "center_px": [ + 70.5, + 612.75 + ], + "area_px": 1075.5 + }, + { + "image_points_px": [ + [ + 21.0, + 592.0 + ], + [ + 40.0, + 567.0 + ], + [ + 78.0, + 571.0 + ], + [ + 59.0, + 596.0 + ] + ], + "center_px": [ + 49.5, + 581.5 + ], + "area_px": 1026.0 + }, + { + "image_points_px": [ + [ + 101.0, + 601.0 + ], + [ + 118.0, + 576.0 + ], + [ + 156.0, + 580.0 + ], + [ + 140.0, + 605.0 + ] + ], + "center_px": [ + 128.75, + 590.5 + ], + "area_px": 1028.5 + }, + { + "image_points_px": [ + [ + 80.0, + 570.0 + ], + [ + 97.0, + 547.0 + ], + [ + 134.0, + 550.0 + ], + [ + 118.0, + 574.0 + ] + ], + "center_px": [ + 107.25, + 560.25 + ], + "area_px": 939.0 + }, + { + "image_points_px": [ + [ + 159.0, + 579.0 + ], + [ + 175.0, + 555.0 + ], + [ + 212.0, + 559.0 + ], + [ + 197.0, + 583.0 + ] + ], + "center_px": [ + 185.75, + 569.0 + ], + "area_px": 962.0 + }, + { + "image_points_px": [ + [ + 59.0, + 541.0 + ], + [ + 76.0, + 519.0 + ], + [ + 113.0, + 522.0 + ], + [ + 96.0, + 545.0 + ] + ], + "center_px": [ + 86.0, + 531.75 + ], + "area_px": 892.0 + }, + { + "image_points_px": [ + [ + 136.0, + 549.0 + ], + [ + 152.0, + 527.0 + ], + [ + 189.0, + 530.0 + ], + [ + 174.0, + 553.0 + ] + ], + "center_px": [ + 162.75, + 539.75 + ], + "area_px": 898.0 + }, + { + "image_points_px": [ + [ + 39.0, + 513.0 + ], + [ + 56.0, + 492.0 + ], + [ + 92.0, + 495.0 + ], + [ + 76.0, + 516.0 + ] + ], + "center_px": [ + 65.75, + 504.0 + ], + "area_px": 816.0 + }, + { + "image_points_px": [ + [ + 191.0, + 529.0 + ], + [ + 205.0, + 507.0 + ], + [ + 242.0, + 511.0 + ], + [ + 228.0, + 533.0 + ] + ], + "center_px": [ + 216.5, + 520.0 + ], + "area_px": 870.0 + }, + { + "image_points_px": [ + [ + 115.0, + 521.0 + ], + [ + 131.0, + 499.0 + ], + [ + 166.0, + 503.0 + ], + [ + 151.0, + 525.0 + ] + ], + "center_px": [ + 140.75, + 512.0 + ], + "area_px": 843.0 + }, + { + "image_points_px": [ + [ + 94.0, + 494.0 + ], + [ + 110.0, + 473.0 + ], + [ + 145.0, + 477.0 + ], + [ + 130.0, + 497.0 + ] + ], + "center_px": [ + 119.75, + 485.25 + ], + "area_px": 782.0 + }, + { + "image_points_px": [ + [ + 169.0, + 502.0 + ], + [ + 183.0, + 481.0 + ], + [ + 219.0, + 484.0 + ], + [ + 205.0, + 505.0 + ] + ], + "center_px": [ + 194.0, + 493.0 + ], + "area_px": 798.0 + }, + { + "image_points_px": [ + [ + 735.0, + 688.0 + ], + [ + 779.0, + 693.0 + ], + [ + 777.0, + 709.0 + ], + [ + 733.0, + 705.0 + ] + ], + "center_px": [ + 756.0, + 698.75 + ], + "area_px": 735.0 + }, + { + "image_points_px": [ + [ + 21.0, + 486.0 + ], + [ + 38.0, + 466.0 + ], + [ + 72.0, + 469.0 + ], + [ + 54.0, + 490.0 + ] + ], + "center_px": [ + 46.25, + 477.75 + ], + "area_px": 748.0 + }, + { + "image_points_px": [ + [ + 3.0, + 461.0 + ], + [ + 20.0, + 441.0 + ], + [ + 54.0, + 444.0 + ], + [ + 37.0, + 464.0 + ] + ], + "center_px": [ + 28.5, + 452.5 + ], + "area_px": 731.0 + }, + { + "image_points_px": [ + [ + 75.0, + 468.0 + ], + [ + 90.0, + 448.0 + ], + [ + 125.0, + 451.0 + ], + [ + 110.0, + 471.0 + ] + ], + "center_px": [ + 100.0, + 459.5 + ], + "area_px": 745.0 + }, + { + "image_points_px": [ + [ + 221.0, + 483.0 + ], + [ + 234.0, + 463.0 + ], + [ + 269.0, + 466.0 + ], + [ + 256.0, + 487.0 + ] + ], + "center_px": [ + 245.0, + 474.75 + ], + "area_px": 763.0 + }, + { + "image_points_px": [ + [ + 147.0, + 475.0 + ], + [ + 162.0, + 456.0 + ], + [ + 196.0, + 459.0 + ], + [ + 182.0, + 479.0 + ] + ], + "center_px": [ + 171.75, + 467.25 + ], + "area_px": 723.5 + }, + { + "image_points_px": [ + [ + 198.0, + 458.0 + ], + [ + 212.0, + 438.0 + ], + [ + 246.0, + 441.0 + ], + [ + 233.0, + 461.0 + ] + ], + "center_px": [ + 222.25, + 449.5 + ], + "area_px": 730.5 + }, + { + "image_points_px": [ + [ + 56.0, + 443.0 + ], + [ + 72.0, + 424.0 + ], + [ + 105.0, + 427.0 + ], + [ + 90.0, + 446.0 + ] + ], + "center_px": [ + 80.75, + 435.0 + ], + "area_px": 683.0 + }, + { + "image_points_px": [ + [ + 127.0, + 450.0 + ], + [ + 142.0, + 431.0 + ], + [ + 175.0, + 434.0 + ], + [ + 161.0, + 454.0 + ] + ], + "center_px": [ + 151.25, + 442.25 + ], + "area_px": 704.0 + }, + { + "image_points_px": [ + [ + 292.0, + 653.0 + ], + [ + 298.0, + 638.0 + ], + [ + 340.0, + 642.0 + ], + [ + 332.0, + 657.0 + ] + ], + "center_px": [ + 315.5, + 647.5 + ], + "area_px": 643.0 + }, + { + "image_points_px": [ + [ + 107.0, + 426.0 + ], + [ + 122.0, + 408.0 + ], + [ + 155.0, + 411.0 + ], + [ + 141.0, + 429.0 + ] + ], + "center_px": [ + 131.25, + 418.5 + ], + "area_px": 646.5 + }, + { + "image_points_px": [ + [ + 38.0, + 419.0 + ], + [ + 54.0, + 401.0 + ], + [ + 86.0, + 404.0 + ], + [ + 71.0, + 422.0 + ] + ], + "center_px": [ + 62.25, + 411.5 + ], + "area_px": 631.5 + }, + { + "image_points_px": [ + [ + 20.0, + 397.0 + ], + [ + 36.0, + 379.0 + ], + [ + 68.0, + 382.0 + ], + [ + 53.0, + 399.0 + ] + ], + "center_px": [ + 44.25, + 389.25 + ], + "area_px": 607.5 + }, + { + "image_points_px": [ + [ + 178.0, + 433.0 + ], + [ + 191.0, + 415.0 + ], + [ + 224.0, + 418.0 + ], + [ + 212.0, + 436.0 + ] + ], + "center_px": [ + 201.25, + 425.5 + ], + "area_px": 640.5 + }, + { + "image_points_px": [ + [ + 226.0, + 417.0 + ], + [ + 239.0, + 399.0 + ], + [ + 272.0, + 402.0 + ], + [ + 259.0, + 420.0 + ] + ], + "center_px": [ + 249.0, + 409.5 + ], + "area_px": 633.0 + }, + { + "image_points_px": [ + [ + 88.0, + 403.0 + ], + [ + 103.0, + 386.0 + ], + [ + 135.0, + 388.0 + ], + [ + 121.0, + 406.0 + ] + ], + "center_px": [ + 111.75, + 395.75 + ], + "area_px": 605.0 + }, + { + "image_points_px": [ + [ + 157.0, + 410.0 + ], + [ + 171.0, + 392.0 + ], + [ + 203.0, + 395.0 + ], + [ + 190.0, + 413.0 + ] + ], + "center_px": [ + 180.25, + 402.5 + ], + "area_px": 625.5 + }, + { + "image_points_px": [ + [ + 205.0, + 394.0 + ], + [ + 218.0, + 377.0 + ], + [ + 251.0, + 379.0 + ], + [ + 238.0, + 397.0 + ] + ], + "center_px": [ + 228.0, + 386.75 + ], + "area_px": 610.0 + }, + { + "image_points_px": [ + [ + 1229.0, + 392.0 + ], + [ + 1265.0, + 396.0 + ], + [ + 1269.0, + 413.0 + ], + [ + 1233.0, + 410.0 + ] + ], + "center_px": [ + 1249.0, + 402.75 + ], + "area_px": 616.0 + }, + { + "image_points_px": [ + [ + 70.0, + 381.0 + ], + [ + 85.0, + 364.0 + ], + [ + 116.0, + 367.0 + ], + [ + 102.0, + 384.0 + ] + ], + "center_px": [ + 93.25, + 374.0 + ], + "area_px": 579.0 + }, + { + "image_points_px": [ + [ + 4.0, + 375.0 + ], + [ + 19.0, + 358.0 + ], + [ + 50.0, + 360.0 + ], + [ + 36.0, + 377.0 + ] + ], + "center_px": [ + 27.25, + 367.5 + ], + "area_px": 564.5 + }, + { + "image_points_px": [ + [ + 52.0, + 360.0 + ], + [ + 67.0, + 344.0 + ], + [ + 98.0, + 346.0 + ], + [ + 85.0, + 362.0 + ] + ], + "center_px": [ + 75.5, + 353.0 + ], + "area_px": 540.0 + }, + { + "image_points_px": [ + [ + 185.0, + 372.0 + ], + [ + 198.0, + 356.0 + ], + [ + 230.0, + 358.0 + ], + [ + 217.0, + 375.0 + ] + ], + "center_px": [ + 207.5, + 365.25 + ], + "area_px": 560.5 + }, + { + "image_points_px": [ + [ + 1155.0, + 386.0 + ], + [ + 1190.0, + 389.0 + ], + [ + 1193.0, + 407.0 + ], + [ + 1158.0, + 403.0 + ] + ], + "center_px": [ + 1174.0, + 396.25 + ], + "area_px": 602.0 + }, + { + "image_points_px": [ + [ + 1189.0, + 371.0 + ], + [ + 1224.0, + 374.0 + ], + [ + 1227.0, + 391.0 + ], + [ + 1192.0, + 388.0 + ] + ], + "center_px": [ + 1208.0, + 381.0 + ], + "area_px": 586.0 + }, + { + "image_points_px": [ + [ + 100.0, + 345.0 + ], + [ + 114.0, + 329.0 + ], + [ + 145.0, + 332.0 + ], + [ + 130.0, + 348.0 + ] + ], + "center_px": [ + 122.25, + 338.5 + ], + "area_px": 531.5 + }, + { + "image_points_px": [ + [ + 36.0, + 339.0 + ], + [ + 50.0, + 324.0 + ], + [ + 81.0, + 326.0 + ], + [ + 67.0, + 342.0 + ] + ], + "center_px": [ + 58.5, + 332.75 + ], + "area_px": 515.5 + }, + { + "image_points_px": [ + [ + 1010.0, + 373.0 + ], + [ + 1044.0, + 376.0 + ], + [ + 1045.0, + 393.0 + ], + [ + 1010.0, + 390.0 + ] + ], + "center_px": [ + 1027.25, + 383.0 + ], + "area_px": 585.0 + }, + { + "image_points_px": [ + [ + 1221.0, + 356.0 + ], + [ + 1256.0, + 359.0 + ], + [ + 1260.0, + 375.0 + ], + [ + 1225.0, + 372.0 + ] + ], + "center_px": [ + 1240.5, + 365.5 + ], + "area_px": 548.0 + }, + { + "image_points_px": [ + [ + 1150.0, + 349.0 + ], + [ + 1183.0, + 352.0 + ], + [ + 1187.0, + 369.0 + ], + [ + 1152.0, + 366.0 + ] + ], + "center_px": [ + 1168.0, + 359.0 + ], + "area_px": 569.0 + }, + { + "image_points_px": [ + [ + 1045.0, + 358.0 + ], + [ + 1079.0, + 361.0 + ], + [ + 1080.0, + 378.0 + ], + [ + 1046.0, + 375.0 + ] + ], + "center_px": [ + 1062.5, + 368.0 + ], + "area_px": 575.0 + }, + { + "image_points_px": [ + [ + 938.0, + 367.0 + ], + [ + 972.0, + 370.0 + ], + [ + 972.0, + 387.0 + ], + [ + 938.0, + 384.0 + ] + ], + "center_px": [ + 955.0, + 377.0 + ], + "area_px": 578.0 + }, + { + "image_points_px": [ + [ + 166.0, + 351.0 + ], + [ + 179.0, + 335.0 + ], + [ + 209.0, + 338.0 + ], + [ + 196.0, + 354.0 + ] + ], + "center_px": [ + 187.5, + 344.5 + ], + "area_px": 519.0 + }, + { + "image_points_px": [ + [ + 83.0, + 325.0 + ], + [ + 97.0, + 310.0 + ], + [ + 127.0, + 312.0 + ], + [ + 114.0, + 327.0 + ] + ], + "center_px": [ + 105.25, + 318.5 + ], + "area_px": 484.5 + }, + { + "image_points_px": [ + [ + 20.0, + 319.0 + ], + [ + 35.0, + 304.0 + ], + [ + 64.0, + 307.0 + ], + [ + 50.0, + 322.0 + ] + ], + "center_px": [ + 42.25, + 313.0 + ], + "area_px": 486.0 + }, + { + "image_points_px": [ + [ + 1183.0, + 335.0 + ], + [ + 1216.0, + 338.0 + ], + [ + 1220.0, + 354.0 + ], + [ + 1185.0, + 351.0 + ] + ], + "center_px": [ + 1201.0, + 344.5 + ], + "area_px": 535.0 + }, + { + "image_points_px": [ + [ + 147.0, + 331.0 + ], + [ + 159.0, + 316.0 + ], + [ + 190.0, + 318.0 + ], + [ + 178.0, + 333.0 + ] + ], + "center_px": [ + 168.5, + 324.5 + ], + "area_px": 489.0 + }, + { + "image_points_px": [ + [ + 868.0, + 361.0 + ], + [ + 901.0, + 363.0 + ], + [ + 900.0, + 380.0 + ], + [ + 866.0, + 377.0 + ] + ], + "center_px": [ + 883.75, + 370.25 + ], + "area_px": 556.5 + }, + { + "image_points_px": [ + [ + 904.0, + 346.0 + ], + [ + 938.0, + 349.0 + ], + [ + 937.0, + 365.0 + ], + [ + 903.0, + 362.0 + ] + ], + "center_px": [ + 920.5, + 355.5 + ], + "area_px": 547.0 + }, + { + "image_points_px": [ + [ + 974.0, + 352.0 + ], + [ + 1008.0, + 355.0 + ], + [ + 1008.0, + 371.0 + ], + [ + 975.0, + 369.0 + ] + ], + "center_px": [ + 991.25, + 361.75 + ], + "area_px": 551.5 + }, + { + "image_points_px": [ + [ + 212.0, + 337.0 + ], + [ + 224.0, + 321.0 + ], + [ + 254.0, + 324.0 + ], + [ + 243.0, + 339.0 + ] + ], + "center_px": [ + 233.25, + 330.25 + ], + "area_px": 501.5 + }, + { + "image_points_px": [ + [ + 139.0, + 386.0 + ], + [ + 151.0, + 371.0 + ], + [ + 181.0, + 374.0 + ], + [ + 169.0, + 390.0 + ] + ], + "center_px": [ + 160.0, + 380.25 + ], + "area_px": 507.0 + }, + { + "image_points_px": [ + [ + 1082.0, + 381.0 + ], + [ + 1115.0, + 382.0 + ], + [ + 1118.0, + 399.0 + ], + [ + 1085.0, + 397.0 + ] + ], + "center_px": [ + 1100.0, + 389.75 + ], + "area_px": 540.0 + }, + { + "image_points_px": [ + [ + 129.0, + 311.0 + ], + [ + 141.0, + 297.0 + ], + [ + 172.0, + 299.0 + ], + [ + 159.0, + 314.0 + ] + ], + "center_px": [ + 150.25, + 305.25 + ], + "area_px": 473.5 + }, + { + "image_points_px": [ + [ + 4.0, + 300.0 + ], + [ + 19.0, + 286.0 + ], + [ + 48.0, + 288.0 + ], + [ + 34.0, + 302.0 + ] + ], + "center_px": [ + 26.25, + 294.0 + ], + "area_px": 442.0 + }, + { + "image_points_px": [ + [ + 835.0, + 340.0 + ], + [ + 868.0, + 343.0 + ], + [ + 867.0, + 359.0 + ], + [ + 833.0, + 356.0 + ] + ], + "center_px": [ + 850.75, + 349.5 + ], + "area_px": 540.5 + }, + { + "image_points_px": [ + [ + 1009.0, + 338.0 + ], + [ + 1042.0, + 340.0 + ], + [ + 1044.0, + 356.0 + ], + [ + 1010.0, + 354.0 + ] + ], + "center_px": [ + 1026.25, + 347.0 + ], + "area_px": 533.0 + }, + { + "image_points_px": [ + [ + 66.0, + 306.0 + ], + [ + 80.0, + 291.0 + ], + [ + 109.0, + 294.0 + ], + [ + 96.0, + 308.0 + ] + ], + "center_px": [ + 87.75, + 299.75 + ], + "area_px": 461.5 + }, + { + "image_points_px": [ + [ + 767.0, + 334.0 + ], + [ + 800.0, + 337.0 + ], + [ + 797.0, + 353.0 + ], + [ + 764.0, + 350.0 + ] + ], + "center_px": [ + 782.0, + 343.5 + ], + "area_px": 537.0 + }, + { + "image_points_px": [ + [ + 1117.0, + 366.0 + ], + [ + 1150.0, + 367.0 + ], + [ + 1153.0, + 383.0 + ], + [ + 1119.0, + 381.0 + ] + ], + "center_px": [ + 1134.75, + 374.25 + ], + "area_px": 515.5 + }, + { + "image_points_px": [ + [ + 1043.0, + 324.0 + ], + [ + 1076.0, + 326.0 + ], + [ + 1078.0, + 342.0 + ], + [ + 1044.0, + 339.0 + ] + ], + "center_px": [ + 1060.25, + 332.75 + ], + "area_px": 515.5 + }, + { + "image_points_px": [ + [ + 111.0, + 293.0 + ], + [ + 124.0, + 279.0 + ], + [ + 154.0, + 281.0 + ], + [ + 141.0, + 295.0 + ] + ], + "center_px": [ + 132.5, + 287.0 + ], + "area_px": 446.0 + }, + { + "image_points_px": [ + [ + 192.0, + 317.0 + ], + [ + 204.0, + 302.0 + ], + [ + 234.0, + 305.0 + ], + [ + 223.0, + 319.0 + ] + ], + "center_px": [ + 213.25, + 310.75 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 50.0, + 287.0 + ], + [ + 64.0, + 273.0 + ], + [ + 93.0, + 275.0 + ], + [ + 80.0, + 289.0 + ] + ], + "center_px": [ + 71.75, + 281.0 + ], + "area_px": 440.0 + }, + { + "image_points_px": [ + [ + 872.0, + 326.0 + ], + [ + 905.0, + 329.0 + ], + [ + 903.0, + 344.0 + ], + [ + 870.0, + 342.0 + ] + ], + "center_px": [ + 887.5, + 335.25 + ], + "area_px": 516.5 + }, + { + "image_points_px": [ + [ + 940.0, + 332.0 + ], + [ + 973.0, + 335.0 + ], + [ + 973.0, + 350.0 + ], + [ + 940.0, + 348.0 + ] + ], + "center_px": [ + 956.5, + 341.25 + ], + "area_px": 511.5 + }, + { + "image_points_px": [ + [ + 121.0, + 365.0 + ], + [ + 132.0, + 350.0 + ], + [ + 162.0, + 353.0 + ], + [ + 150.0, + 368.0 + ] + ], + "center_px": [ + 141.25, + 359.0 + ], + "area_px": 477.0 + }, + { + "image_points_px": [ + [ + 232.0, + 357.0 + ], + [ + 244.0, + 341.0 + ], + [ + 271.0, + 344.0 + ], + [ + 264.0, + 360.0 + ] + ], + "center_px": [ + 252.75, + 350.5 + ], + "area_px": 500.5 + }, + { + "image_points_px": [ + [ + 975.0, + 318.0 + ], + [ + 1008.0, + 321.0 + ], + [ + 1008.0, + 336.0 + ], + [ + 975.0, + 333.0 + ] + ], + "center_px": [ + 991.5, + 327.0 + ], + "area_px": 495.0 + }, + { + "image_points_px": [ + [ + 798.0, + 356.0 + ], + [ + 830.0, + 357.0 + ], + [ + 829.0, + 373.0 + ], + [ + 796.0, + 371.0 + ] + ], + "center_px": [ + 813.25, + 364.25 + ], + "area_px": 506.0 + }, + { + "image_points_px": [ + [ + 174.0, + 298.0 + ], + [ + 185.0, + 284.0 + ], + [ + 215.0, + 286.0 + ], + [ + 204.0, + 300.0 + ] + ], + "center_px": [ + 194.5, + 292.0 + ], + "area_px": 442.0 + }, + { + "image_points_px": [ + [ + 656.0, + 357.0 + ], + [ + 662.0, + 342.0 + ], + [ + 693.0, + 346.0 + ], + [ + 688.0, + 361.0 + ] + ], + "center_px": [ + 674.75, + 351.5 + ], + "area_px": 494.5 + }, + { + "image_points_px": [ + [ + 1077.0, + 310.0 + ], + [ + 1109.0, + 313.0 + ], + [ + 1111.0, + 328.0 + ], + [ + 1078.0, + 325.0 + ] + ], + "center_px": [ + 1093.75, + 319.0 + ], + "area_px": 483.0 + }, + { + "image_points_px": [ + [ + 198.0, + 585.0 + ], + [ + 207.0, + 586.0 + ], + [ + 211.0, + 613.0 + ], + [ + 182.0, + 610.0 + ] + ], + "center_px": [ + 199.5, + 598.5 + ], + "area_px": 506.0 + }, + { + "image_points_px": [ + [ + 907.0, + 313.0 + ], + [ + 940.0, + 315.0 + ], + [ + 939.0, + 330.0 + ], + [ + 907.0, + 328.0 + ] + ], + "center_px": [ + 923.25, + 321.5 + ], + "area_px": 488.5 + }, + { + "image_points_px": [ + [ + 156.0, + 280.0 + ], + [ + 168.0, + 266.0 + ], + [ + 197.0, + 268.0 + ], + [ + 185.0, + 282.0 + ] + ], + "center_px": [ + 176.5, + 274.0 + ], + "area_px": 430.0 + }, + { + "image_points_px": [ + [ + 35.0, + 269.0 + ], + [ + 48.0, + 256.0 + ], + [ + 77.0, + 258.0 + ], + [ + 64.0, + 271.0 + ] + ], + "center_px": [ + 56.0, + 263.5 + ], + "area_px": 403.0 + }, + { + "image_points_px": [ + [ + 725.0, + 363.0 + ], + [ + 730.0, + 349.0 + ], + [ + 761.0, + 352.0 + ], + [ + 758.0, + 367.0 + ] + ], + "center_px": [ + 743.5, + 357.75 + ], + "area_px": 478.0 + }, + { + "image_points_px": [ + [ + 1113.0, + 331.0 + ], + [ + 1145.0, + 332.0 + ], + [ + 1148.0, + 347.0 + ], + [ + 1115.0, + 345.0 + ] + ], + "center_px": [ + 1130.25, + 338.75 + ], + "area_px": 467.5 + }, + { + "image_points_px": [ + [ + 95.0, + 275.0 + ], + [ + 108.0, + 261.0 + ], + [ + 136.0, + 263.0 + ], + [ + 123.0, + 277.0 + ] + ], + "center_px": [ + 115.5, + 269.0 + ], + "area_px": 418.0 + }, + { + "image_points_px": [ + [ + 1109.0, + 297.0 + ], + [ + 1140.0, + 299.0 + ], + [ + 1144.0, + 314.0 + ], + [ + 1112.0, + 312.0 + ] + ], + "center_px": [ + 1126.25, + 305.5 + ], + "area_px": 465.5 + }, + { + "image_points_px": [ + [ + 217.0, + 285.0 + ], + [ + 229.0, + 271.0 + ], + [ + 257.0, + 273.0 + ], + [ + 247.0, + 287.0 + ] + ], + "center_px": [ + 237.5, + 279.0 + ], + "area_px": 428.0 + }, + { + "image_points_px": [ + [ + 737.0, + 316.0 + ], + [ + 769.0, + 317.0 + ], + [ + 766.0, + 332.0 + ], + [ + 734.0, + 330.0 + ] + ], + "center_px": [ + 751.5, + 323.75 + ], + "area_px": 468.5 + }, + { + "image_points_px": [ + [ + 138.0, + 262.0 + ], + [ + 150.0, + 249.0 + ], + [ + 179.0, + 251.0 + ], + [ + 167.0, + 264.0 + ] + ], + "center_px": [ + 158.5, + 256.5 + ], + "area_px": 401.0 + }, + { + "image_points_px": [ + [ + 942.0, + 299.0 + ], + [ + 974.0, + 302.0 + ], + [ + 974.0, + 316.0 + ], + [ + 942.0, + 314.0 + ] + ], + "center_px": [ + 958.0, + 307.75 + ], + "area_px": 464.0 + }, + { + "image_points_px": [ + [ + 709.0, + 296.0 + ], + [ + 740.0, + 298.0 + ], + [ + 737.0, + 313.0 + ], + [ + 705.0, + 310.0 + ] + ], + "center_px": [ + 722.75, + 304.25 + ], + "area_px": 465.5 + }, + { + "image_points_px": [ + [ + 79.0, + 257.0 + ], + [ + 92.0, + 244.0 + ], + [ + 120.0, + 246.0 + ], + [ + 107.0, + 259.0 + ] + ], + "center_px": [ + 99.5, + 251.5 + ], + "area_px": 390.0 + }, + { + "image_points_px": [ + [ + 20.0, + 252.0 + ], + [ + 33.0, + 239.0 + ], + [ + 61.0, + 241.0 + ], + [ + 48.0, + 254.0 + ] + ], + "center_px": [ + 40.5, + 246.5 + ], + "area_px": 390.0 + }, + { + "image_points_px": [ + [ + 1080.0, + 345.0 + ], + [ + 1110.0, + 346.0 + ], + [ + 1114.0, + 361.0 + ], + [ + 1082.0, + 360.0 + ] + ], + "center_px": [ + 1096.5, + 353.0 + ], + "area_px": 462.0 + }, + { + "image_points_px": [ + [ + 1141.0, + 284.0 + ], + [ + 1173.0, + 287.0 + ], + [ + 1175.0, + 301.0 + ], + [ + 1143.0, + 298.0 + ] + ], + "center_px": [ + 1158.0, + 292.5 + ], + "area_px": 442.0 + }, + { + "image_points_px": [ + [ + 1215.0, + 323.0 + ], + [ + 1246.0, + 324.0 + ], + [ + 1251.0, + 338.0 + ], + [ + 1219.0, + 337.0 + ] + ], + "center_px": [ + 1232.75, + 330.5 + ], + "area_px": 436.5 + }, + { + "image_points_px": [ + [ + 810.0, + 289.0 + ], + [ + 842.0, + 291.0 + ], + [ + 840.0, + 305.0 + ], + [ + 808.0, + 303.0 + ] + ], + "center_px": [ + 825.0, + 297.0 + ], + "area_px": 452.0 + }, + { + "image_points_px": [ + [ + 976.0, + 286.0 + ], + [ + 1008.0, + 289.0 + ], + [ + 1008.0, + 303.0 + ], + [ + 976.0, + 300.0 + ] + ], + "center_px": [ + 992.0, + 294.5 + ], + "area_px": 448.0 + }, + { + "image_points_px": [ + [ + 199.0, + 267.0 + ], + [ + 210.0, + 254.0 + ], + [ + 239.0, + 256.0 + ], + [ + 228.0, + 269.0 + ] + ], + "center_px": [ + 219.0, + 261.5 + ], + "area_px": 399.0 + }, + { + "image_points_px": [ + [ + 639.0, + 304.0 + ], + [ + 645.0, + 290.0 + ], + [ + 675.0, + 293.0 + ], + [ + 671.0, + 307.0 + ] + ], + "center_px": [ + 657.5, + 298.5 + ], + "area_px": 449.0 + }, + { + "image_points_px": [ + [ + 5.0, + 235.0 + ], + [ + 19.0, + 223.0 + ], + [ + 46.0, + 225.0 + ], + [ + 33.0, + 237.0 + ] + ], + "center_px": [ + 25.75, + 230.0 + ], + "area_px": 357.0 + }, + { + "image_points_px": [ + [ + 681.0, + 278.0 + ], + [ + 712.0, + 280.0 + ], + [ + 708.0, + 294.0 + ], + [ + 677.0, + 292.0 + ] + ], + "center_px": [ + 694.5, + 286.0 + ], + "area_px": 442.0 + }, + { + "image_points_px": [ + [ + 700.0, + 329.0 + ], + [ + 731.0, + 332.0 + ], + [ + 727.0, + 346.0 + ], + [ + 697.0, + 344.0 + ] + ], + "center_px": [ + 713.75, + 337.75 + ], + "area_px": 451.0 + }, + { + "image_points_px": [ + [ + 105.0, + 229.0 + ], + [ + 117.0, + 217.0 + ], + [ + 145.0, + 218.0 + ], + [ + 133.0, + 231.0 + ] + ], + "center_px": [ + 125.0, + 223.75 + ], + "area_px": 368.0 + }, + { + "image_points_px": [ + [ + 1146.0, + 317.0 + ], + [ + 1177.0, + 319.0 + ], + [ + 1180.0, + 332.0 + ], + [ + 1148.0, + 331.0 + ] + ], + "center_px": [ + 1162.75, + 324.75 + ], + "area_px": 421.5 + }, + { + "image_points_px": [ + [ + 1009.0, + 306.0 + ], + [ + 1040.0, + 307.0 + ], + [ + 1042.0, + 321.0 + ], + [ + 1010.0, + 319.0 + ] + ], + "center_px": [ + 1025.25, + 313.25 + ], + "area_px": 423.0 + }, + { + "image_points_px": [ + [ + 718.0, + 265.0 + ], + [ + 748.0, + 267.0 + ], + [ + 745.0, + 281.0 + ], + [ + 714.0, + 279.0 + ] + ], + "center_px": [ + 731.25, + 273.0 + ], + "area_px": 434.0 + }, + { + "image_points_px": [ + [ + 1177.0, + 304.0 + ], + [ + 1208.0, + 305.0 + ], + [ + 1212.0, + 318.0 + ], + [ + 1180.0, + 317.0 + ] + ], + "center_px": [ + 1194.25, + 311.0 + ], + "area_px": 406.0 + }, + { + "image_points_px": [ + [ + 667.0, + 322.0 + ], + [ + 672.0, + 309.0 + ], + [ + 702.0, + 312.0 + ], + [ + 698.0, + 326.0 + ] + ], + "center_px": [ + 684.75, + 317.25 + ], + "area_px": 427.5 + }, + { + "image_points_px": [ + [ + 181.0, + 250.0 + ], + [ + 193.0, + 237.0 + ], + [ + 220.0, + 239.0 + ], + [ + 209.0, + 252.0 + ] + ], + "center_px": [ + 200.75, + 244.5 + ], + "area_px": 380.5 + }, + { + "image_points_px": [ + [ + 650.0, + 274.0 + ], + [ + 655.0, + 260.0 + ], + [ + 685.0, + 262.0 + ], + [ + 680.0, + 276.0 + ] + ], + "center_px": [ + 667.5, + 268.0 + ], + "area_px": 430.0 + }, + { + "image_points_px": [ + [ + 63.0, + 240.0 + ], + [ + 76.0, + 228.0 + ], + [ + 103.0, + 230.0 + ], + [ + 91.0, + 242.0 + ] + ], + "center_px": [ + 83.25, + 235.0 + ], + "area_px": 355.0 + }, + { + "image_points_px": [ + [ + 48.0, + 224.0 + ], + [ + 61.0, + 212.0 + ], + [ + 88.0, + 214.0 + ], + [ + 75.0, + 226.0 + ] + ], + "center_px": [ + 68.0, + 219.0 + ], + "area_px": 350.0 + }, + { + "image_points_px": [ + [ + 122.0, + 245.0 + ], + [ + 133.0, + 233.0 + ], + [ + 161.0, + 234.0 + ], + [ + 150.0, + 247.0 + ] + ], + "center_px": [ + 141.5, + 239.75 + ], + "area_px": 366.5 + }, + { + "image_points_px": [ + [ + 1041.0, + 261.0 + ], + [ + 1071.0, + 263.0 + ], + [ + 1073.0, + 277.0 + ], + [ + 1042.0, + 275.0 + ] + ], + "center_px": [ + 1056.75, + 269.0 + ], + "area_px": 424.0 + }, + { + "image_points_px": [ + [ + 1208.0, + 291.0 + ], + [ + 1239.0, + 292.0 + ], + [ + 1243.0, + 305.0 + ], + [ + 1212.0, + 304.0 + ] + ], + "center_px": [ + 1225.5, + 298.0 + ], + "area_px": 399.0 + }, + { + "image_points_px": [ + [ + 33.0, + 208.0 + ], + [ + 45.0, + 197.0 + ], + [ + 73.0, + 198.0 + ], + [ + 60.0, + 210.0 + ] + ], + "center_px": [ + 52.75, + 203.25 + ], + "area_px": 335.0 + }, + { + "image_points_px": [ + [ + 804.0, + 322.0 + ], + [ + 835.0, + 323.0 + ], + [ + 835.0, + 336.0 + ], + [ + 804.0, + 336.0 + ] + ], + "center_px": [ + 819.5, + 329.25 + ], + "area_px": 418.5 + }, + { + "image_points_px": [ + [ + 840.0, + 309.0 + ], + [ + 871.0, + 309.0 + ], + [ + 871.0, + 323.0 + ], + [ + 840.0, + 322.0 + ] + ], + "center_px": [ + 855.5, + 315.75 + ], + "area_px": 418.5 + }, + { + "image_points_px": [ + [ + 1231.0, + 247.0 + ], + [ + 1262.0, + 250.0 + ], + [ + 1265.0, + 263.0 + ], + [ + 1234.0, + 260.0 + ] + ], + "center_px": [ + 1248.0, + 255.0 + ], + "area_px": 394.0 + }, + { + "image_points_px": [ + [ + 164.0, + 233.0 + ], + [ + 175.0, + 221.0 + ], + [ + 203.0, + 223.0 + ], + [ + 192.0, + 235.0 + ] + ], + "center_px": [ + 183.5, + 228.0 + ], + "area_px": 358.0 + }, + { + "image_points_px": [ + [ + 1238.0, + 278.0 + ], + [ + 1269.0, + 279.0 + ], + [ + 1273.0, + 292.0 + ], + [ + 1243.0, + 291.0 + ] + ], + "center_px": [ + 1255.75, + 285.0 + ], + "area_px": 392.0 + }, + { + "image_points_px": [ + [ + 587.0, + 268.0 + ], + [ + 593.0, + 255.0 + ], + [ + 622.0, + 257.0 + ], + [ + 617.0, + 271.0 + ] + ], + "center_px": [ + 604.75, + 262.75 + ], + "area_px": 412.0 + }, + { + "image_points_px": [ + [ + 1072.0, + 249.0 + ], + [ + 1102.0, + 251.0 + ], + [ + 1104.0, + 265.0 + ], + [ + 1073.0, + 262.0 + ] + ], + "center_px": [ + 1087.75, + 256.75 + ], + "area_px": 408.0 + }, + { + "image_points_px": [ + [ + 1042.0, + 293.0 + ], + [ + 1073.0, + 294.0 + ], + [ + 1075.0, + 307.0 + ], + [ + 1044.0, + 306.0 + ] + ], + "center_px": [ + 1058.5, + 300.0 + ], + "area_px": 401.0 + }, + { + "image_points_px": [ + [ + 977.0, + 256.0 + ], + [ + 1007.0, + 258.0 + ], + [ + 1007.0, + 272.0 + ], + [ + 976.0, + 269.0 + ] + ], + "center_px": [ + 991.75, + 263.75 + ], + "area_px": 413.0 + }, + { + "image_points_px": [ + [ + 624.0, + 256.0 + ], + [ + 629.0, + 243.0 + ], + [ + 659.0, + 245.0 + ], + [ + 654.0, + 258.0 + ] + ], + "center_px": [ + 641.5, + 250.5 + ], + "area_px": 400.0 + }, + { + "image_points_px": [ + [ + 816.0, + 258.0 + ], + [ + 846.0, + 260.0 + ], + [ + 844.0, + 274.0 + ], + [ + 814.0, + 271.0 + ] + ], + "center_px": [ + 830.0, + 265.75 + ], + "area_px": 410.0 + }, + { + "image_points_px": [ + [ + 1103.0, + 237.0 + ], + [ + 1133.0, + 240.0 + ], + [ + 1135.0, + 253.0 + ], + [ + 1104.0, + 250.0 + ] + ], + "center_px": [ + 1118.75, + 245.0 + ], + "area_px": 392.0 + }, + { + "image_points_px": [ + [ + 850.0, + 246.0 + ], + [ + 880.0, + 248.0 + ], + [ + 879.0, + 261.0 + ], + [ + 848.0, + 259.0 + ] + ], + "center_px": [ + 864.25, + 253.5 + ], + "area_px": 399.5 + }, + { + "image_points_px": [ + [ + 1137.0, + 254.0 + ], + [ + 1166.0, + 256.0 + ], + [ + 1170.0, + 270.0 + ], + [ + 1141.0, + 268.0 + ] + ], + "center_px": [ + 1153.5, + 262.0 + ], + "area_px": 398.0 + }, + { + "image_points_px": [ + [ + 913.0, + 251.0 + ], + [ + 943.0, + 253.0 + ], + [ + 943.0, + 266.0 + ], + [ + 912.0, + 264.0 + ] + ], + "center_px": [ + 927.75, + 258.5 + ], + "area_px": 397.5 + }, + { + "image_points_px": [ + [ + 774.0, + 303.0 + ], + [ + 805.0, + 304.0 + ], + [ + 804.0, + 316.0 + ], + [ + 773.0, + 316.0 + ] + ], + "center_px": [ + 789.0, + 309.75 + ], + "area_px": 388.0 + }, + { + "image_points_px": [ + [ + 90.0, + 213.0 + ], + [ + 102.0, + 201.0 + ], + [ + 128.0, + 203.0 + ], + [ + 117.0, + 215.0 + ] + ], + "center_px": [ + 109.25, + 208.0 + ], + "area_px": 341.0 + }, + { + "image_points_px": [ + [ + 19.0, + 193.0 + ], + [ + 32.0, + 182.0 + ], + [ + 58.0, + 183.0 + ], + [ + 46.0, + 194.0 + ] + ], + "center_px": [ + 38.75, + 188.0 + ], + "area_px": 304.0 + }, + { + "image_points_px": [ + [ + 1075.0, + 280.0 + ], + [ + 1105.0, + 281.0 + ], + [ + 1107.0, + 294.0 + ], + [ + 1077.0, + 293.0 + ] + ], + "center_px": [ + 1091.0, + 287.0 + ], + "area_px": 388.0 + }, + { + "image_points_px": [ + [ + 1009.0, + 244.0 + ], + [ + 1038.0, + 246.0 + ], + [ + 1040.0, + 259.0 + ], + [ + 1009.0, + 257.0 + ] + ], + "center_px": [ + 1024.0, + 251.5 + ], + "area_px": 388.0 + }, + { + "image_points_px": [ + [ + 147.0, + 217.0 + ], + [ + 158.0, + 206.0 + ], + [ + 185.0, + 207.0 + ], + [ + 175.0, + 219.0 + ] + ], + "center_px": [ + 166.25, + 212.25 + ], + "area_px": 332.0 + }, + { + "image_points_px": [ + [ + 910.0, + 282.0 + ], + [ + 940.0, + 283.0 + ], + [ + 941.0, + 296.0 + ], + [ + 911.0, + 295.0 + ] + ], + "center_px": [ + 925.5, + 289.0 + ], + "area_px": 389.0 + }, + { + "image_points_px": [ + [ + 131.0, + 202.0 + ], + [ + 143.0, + 190.0 + ], + [ + 169.0, + 192.0 + ], + [ + 157.0, + 204.0 + ] + ], + "center_px": [ + 150.0, + 197.0 + ], + "area_px": 336.0 + }, + { + "image_points_px": [ + [ + 876.0, + 295.0 + ], + [ + 906.0, + 296.0 + ], + [ + 906.0, + 309.0 + ], + [ + 876.0, + 308.0 + ] + ], + "center_px": [ + 891.0, + 302.0 + ], + "area_px": 390.0 + }, + { + "image_points_px": [ + [ + 788.0, + 241.0 + ], + [ + 817.0, + 243.0 + ], + [ + 815.0, + 256.0 + ], + [ + 785.0, + 254.0 + ] + ], + "center_px": [ + 801.25, + 248.5 + ], + "area_px": 388.5 + }, + { + "image_points_px": [ + [ + 1133.0, + 226.0 + ], + [ + 1162.0, + 228.0 + ], + [ + 1165.0, + 241.0 + ], + [ + 1134.0, + 238.0 + ] + ], + "center_px": [ + 1148.5, + 233.25 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 205.0, + 222.0 + ], + [ + 215.0, + 210.0 + ], + [ + 242.0, + 212.0 + ], + [ + 232.0, + 224.0 + ] + ], + "center_px": [ + 223.5, + 217.0 + ], + "area_px": 344.0 + }, + { + "image_points_px": [ + [ + 977.0, + 228.0 + ], + [ + 1007.0, + 230.0 + ], + [ + 1007.0, + 243.0 + ], + [ + 977.0, + 240.0 + ] + ], + "center_px": [ + 992.0, + 235.25 + ], + "area_px": 375.0 + }, + { + "image_points_px": [ + [ + 687.0, + 260.0 + ], + [ + 691.0, + 248.0 + ], + [ + 720.0, + 250.0 + ], + [ + 717.0, + 263.0 + ] + ], + "center_px": [ + 703.75, + 255.25 + ], + "area_px": 377.5 + }, + { + "image_points_px": [ + [ + 945.0, + 240.0 + ], + [ + 976.0, + 242.0 + ], + [ + 975.0, + 254.0 + ], + [ + 945.0, + 252.0 + ] + ], + "center_px": [ + 960.25, + 247.0 + ], + "area_px": 367.0 + }, + { + "image_points_px": [ + [ + 1040.0, + 233.0 + ], + [ + 1070.0, + 235.0 + ], + [ + 1071.0, + 247.0 + ], + [ + 1040.0, + 245.0 + ] + ], + "center_px": [ + 1055.25, + 240.0 + ], + "area_px": 365.0 + }, + { + "image_points_px": [ + [ + 115.0, + 187.0 + ], + [ + 126.0, + 176.0 + ], + [ + 153.0, + 177.0 + ], + [ + 142.0, + 188.0 + ] + ], + "center_px": [ + 134.0, + 182.0 + ], + "area_px": 308.0 + }, + { + "image_points_px": [ + [ + 745.0, + 284.0 + ], + [ + 774.0, + 285.0 + ], + [ + 774.0, + 298.0 + ], + [ + 744.0, + 297.0 + ] + ], + "center_px": [ + 759.25, + 291.0 + ], + "area_px": 384.0 + }, + { + "image_points_px": [ + [ + 75.0, + 197.0 + ], + [ + 87.0, + 186.0 + ], + [ + 113.0, + 188.0 + ], + [ + 102.0, + 199.0 + ] + ], + "center_px": [ + 94.25, + 192.5 + ], + "area_px": 314.5 + }, + { + "image_points_px": [ + [ + 1172.0, + 273.0 + ], + [ + 1202.0, + 274.0 + ], + [ + 1205.0, + 286.0 + ], + [ + 1175.0, + 285.0 + ] + ], + "center_px": [ + 1188.5, + 279.5 + ], + "area_px": 357.0 + }, + { + "image_points_px": [ + [ + 1106.0, + 268.0 + ], + [ + 1136.0, + 269.0 + ], + [ + 1139.0, + 281.0 + ], + [ + 1109.0, + 280.0 + ] + ], + "center_px": [ + 1122.5, + 274.5 + ], + "area_px": 357.0 + }, + { + "image_points_px": [ + [ + 821.0, + 230.0 + ], + [ + 851.0, + 232.0 + ], + [ + 849.0, + 244.0 + ], + [ + 819.0, + 242.0 + ] + ], + "center_px": [ + 835.0, + 237.0 + ], + "area_px": 364.0 + }, + { + "image_points_px": [ + [ + 599.0, + 239.0 + ], + [ + 605.0, + 227.0 + ], + [ + 633.0, + 229.0 + ], + [ + 629.0, + 241.0 + ] + ], + "center_px": [ + 616.5, + 234.0 + ], + "area_px": 358.0 + }, + { + "image_points_px": [ + [ + 915.0, + 224.0 + ], + [ + 945.0, + 225.0 + ], + [ + 944.0, + 238.0 + ], + [ + 915.0, + 236.0 + ] + ], + "center_px": [ + 929.75, + 230.75 + ], + "area_px": 369.5 + }, + { + "image_points_px": [ + [ + 1009.0, + 275.0 + ], + [ + 1039.0, + 276.0 + ], + [ + 1040.0, + 288.0 + ], + [ + 1010.0, + 287.0 + ] + ], + "center_px": [ + 1024.5, + 281.5 + ], + "area_px": 359.0 + }, + { + "image_points_px": [ + [ + 6.0, + 178.0 + ], + [ + 18.0, + 168.0 + ], + [ + 44.0, + 169.0 + ], + [ + 31.0, + 180.0 + ] + ], + "center_px": [ + 24.75, + 173.75 + ], + "area_px": 286.5 + }, + { + "image_points_px": [ + [ + 1162.0, + 215.0 + ], + [ + 1191.0, + 217.0 + ], + [ + 1194.0, + 229.0 + ], + [ + 1164.0, + 227.0 + ] + ], + "center_px": [ + 1177.75, + 222.0 + ], + "area_px": 349.0 + }, + { + "image_points_px": [ + [ + 760.0, + 225.0 + ], + [ + 789.0, + 227.0 + ], + [ + 787.0, + 239.0 + ], + [ + 757.0, + 237.0 + ] + ], + "center_px": [ + 773.25, + 232.0 + ], + "area_px": 359.0 + }, + { + "image_points_px": [ + [ + 1202.0, + 261.0 + ], + [ + 1230.0, + 261.0 + ], + [ + 1235.0, + 274.0 + ], + [ + 1206.0, + 273.0 + ] + ], + "center_px": [ + 1218.25, + 267.25 + ], + "area_px": 354.0 + }, + { + "image_points_px": [ + [ + 188.0, + 206.0 + ], + [ + 198.0, + 195.0 + ], + [ + 225.0, + 197.0 + ], + [ + 214.0, + 208.0 + ] + ], + "center_px": [ + 206.25, + 201.5 + ], + "area_px": 312.5 + }, + { + "image_points_px": [ + [ + 575.0, + 223.0 + ], + [ + 581.0, + 211.0 + ], + [ + 609.0, + 213.0 + ], + [ + 604.0, + 225.0 + ] + ], + "center_px": [ + 592.25, + 218.0 + ], + "area_px": 353.0 + }, + { + "image_points_px": [ + [ + 661.0, + 244.0 + ], + [ + 665.0, + 232.0 + ], + [ + 694.0, + 234.0 + ], + [ + 690.0, + 246.0 + ] + ], + "center_px": [ + 677.5, + 239.0 + ], + "area_px": 356.0 + }, + { + "image_points_px": [ + [ + 1100.0, + 210.0 + ], + [ + 1129.0, + 212.0 + ], + [ + 1131.0, + 224.0 + ], + [ + 1101.0, + 222.0 + ] + ], + "center_px": [ + 1115.25, + 217.0 + ], + "area_px": 351.0 + }, + { + "image_points_px": [ + [ + 171.0, + 191.0 + ], + [ + 182.0, + 180.0 + ], + [ + 208.0, + 182.0 + ], + [ + 197.0, + 193.0 + ] + ], + "center_px": [ + 189.5, + 186.5 + ], + "area_px": 308.0 + }, + { + "image_points_px": [ + [ + 880.0, + 264.0 + ], + [ + 910.0, + 267.0 + ], + [ + 909.0, + 278.0 + ], + [ + 880.0, + 277.0 + ] + ], + "center_px": [ + 894.75, + 271.5 + ], + "area_px": 355.0 + }, + { + "image_points_px": [ + [ + 1008.0, + 217.0 + ], + [ + 1038.0, + 219.0 + ], + [ + 1038.0, + 231.0 + ], + [ + 1009.0, + 229.0 + ] + ], + "center_px": [ + 1023.25, + 224.0 + ], + "area_px": 353.0 + }, + { + "image_points_px": [ + [ + 944.0, + 270.0 + ], + [ + 974.0, + 271.0 + ], + [ + 974.0, + 283.0 + ], + [ + 945.0, + 282.0 + ] + ], + "center_px": [ + 959.25, + 276.5 + ], + "area_px": 353.5 + }, + { + "image_points_px": [ + [ + 1190.0, + 204.0 + ], + [ + 1219.0, + 206.0 + ], + [ + 1222.0, + 218.0 + ], + [ + 1193.0, + 216.0 + ] + ], + "center_px": [ + 1206.0, + 211.0 + ], + "area_px": 342.0 + }, + { + "image_points_px": [ + [ + 61.0, + 183.0 + ], + [ + 72.0, + 172.0 + ], + [ + 98.0, + 173.0 + ], + [ + 86.0, + 184.0 + ] + ], + "center_px": [ + 79.25, + 178.0 + ], + "area_px": 292.0 + }, + { + "image_points_px": [ + [ + 635.0, + 228.0 + ], + [ + 640.0, + 216.0 + ], + [ + 668.0, + 218.0 + ], + [ + 664.0, + 230.0 + ] + ], + "center_px": [ + 651.75, + 223.0 + ], + "area_px": 351.0 + }, + { + "image_points_px": [ + [ + 750.0, + 265.0 + ], + [ + 754.0, + 253.0 + ], + [ + 783.0, + 257.0 + ], + [ + 779.0, + 268.0 + ] + ], + "center_px": [ + 766.5, + 260.75 + ], + "area_px": 347.5 + }, + { + "image_points_px": [ + [ + 1048.0, + 411.0 + ], + [ + 1052.0, + 400.0 + ], + [ + 1077.0, + 402.0 + ], + [ + 1081.0, + 414.0 + ] + ], + "center_px": [ + 1064.5, + 406.75 + ], + "area_px": 333.5 + }, + { + "image_points_px": [ + [ + 100.0, + 172.0 + ], + [ + 111.0, + 162.0 + ], + [ + 137.0, + 163.0 + ], + [ + 126.0, + 174.0 + ] + ], + "center_px": [ + 118.5, + 167.75 + ], + "area_px": 289.5 + }, + { + "image_points_px": [ + [ + 46.0, + 168.0 + ], + [ + 57.0, + 158.0 + ], + [ + 83.0, + 159.0 + ], + [ + 72.0, + 170.0 + ] + ], + "center_px": [ + 64.5, + 163.75 + ], + "area_px": 289.5 + }, + { + "image_points_px": [ + [ + 222.0, + 238.0 + ], + [ + 233.0, + 226.0 + ], + [ + 257.0, + 228.0 + ], + [ + 250.0, + 240.0 + ] + ], + "center_px": [ + 240.5, + 233.0 + ], + "area_px": 330.0 + }, + { + "image_points_px": [ + [ + 1218.0, + 193.0 + ], + [ + 1246.0, + 195.0 + ], + [ + 1250.0, + 207.0 + ], + [ + 1221.0, + 205.0 + ] + ], + "center_px": [ + 1233.75, + 200.0 + ], + "area_px": 335.0 + }, + { + "image_points_px": [ + [ + 730.0, + 221.0 + ], + [ + 734.0, + 209.0 + ], + [ + 762.0, + 211.0 + ], + [ + 759.0, + 223.0 + ] + ], + "center_px": [ + 746.25, + 216.0 + ], + "area_px": 349.0 + }, + { + "image_points_px": [ + [ + 947.0, + 212.0 + ], + [ + 976.0, + 214.0 + ], + [ + 976.0, + 226.0 + ], + [ + 947.0, + 224.0 + ] + ], + "center_px": [ + 961.5, + 219.0 + ], + "area_px": 348.0 + }, + { + "image_points_px": [ + [ + 781.0, + 272.0 + ], + [ + 810.0, + 273.0 + ], + [ + 810.0, + 284.0 + ], + [ + 780.0, + 284.0 + ] + ], + "center_px": [ + 795.25, + 278.25 + ], + "area_px": 339.5 + }, + { + "image_points_px": [ + [ + 32.0, + 154.0 + ], + [ + 44.0, + 144.0 + ], + [ + 69.0, + 145.0 + ], + [ + 57.0, + 156.0 + ] + ], + "center_px": [ + 50.5, + 149.75 + ], + "area_px": 280.5 + }, + { + "image_points_px": [ + [ + 791.0, + 225.0 + ], + [ + 794.0, + 214.0 + ], + [ + 823.0, + 216.0 + ], + [ + 820.0, + 228.0 + ] + ], + "center_px": [ + 807.0, + 220.75 + ], + "area_px": 341.0 + }, + { + "image_points_px": [ + [ + 71.0, + 145.0 + ], + [ + 82.0, + 135.0 + ], + [ + 108.0, + 136.0 + ], + [ + 97.0, + 146.0 + ] + ], + "center_px": [ + 89.5, + 140.5 + ], + "area_px": 271.0 + }, + { + "image_points_px": [ + [ + 155.0, + 177.0 + ], + [ + 165.0, + 166.0 + ], + [ + 191.0, + 167.0 + ], + [ + 181.0, + 178.0 + ] + ], + "center_px": [ + 173.0, + 172.0 + ], + "area_px": 296.0 + }, + { + "image_points_px": [ + [ + 1129.0, + 199.0 + ], + [ + 1157.0, + 201.0 + ], + [ + 1160.0, + 213.0 + ], + [ + 1131.0, + 211.0 + ] + ], + "center_px": [ + 1144.25, + 206.0 + ], + "area_px": 337.0 + }, + { + "image_points_px": [ + [ + 210.0, + 181.0 + ], + [ + 220.0, + 170.0 + ], + [ + 246.0, + 172.0 + ], + [ + 237.0, + 182.0 + ] + ], + "center_px": [ + 228.25, + 176.25 + ], + "area_px": 292.5 + }, + { + "image_points_px": [ + [ + 530.0, + 613.0 + ], + [ + 533.0, + 609.0 + ], + [ + 566.0, + 608.0 + ], + [ + 569.0, + 611.0 + ] + ], + "center_px": [ + 549.5, + 610.25 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 19.0, + 141.0 + ], + [ + 31.0, + 131.0 + ], + [ + 56.0, + 132.0 + ], + [ + 44.0, + 142.0 + ] + ], + "center_px": [ + 37.5, + 136.5 + ], + "area_px": 262.0 + }, + { + "image_points_px": [ + [ + 886.0, + 208.0 + ], + [ + 915.0, + 209.0 + ], + [ + 914.0, + 221.0 + ], + [ + 885.0, + 219.0 + ] + ], + "center_px": [ + 900.0, + 214.25 + ], + "area_px": 335.0 + }, + { + "image_points_px": [ + [ + 764.0, + 210.0 + ], + [ + 768.0, + 198.0 + ], + [ + 795.0, + 200.0 + ], + [ + 793.0, + 212.0 + ] + ], + "center_px": [ + 780.0, + 205.0 + ], + "area_px": 342.0 + }, + { + "image_points_px": [ + [ + 1167.0, + 244.0 + ], + [ + 1196.0, + 245.0 + ], + [ + 1199.0, + 256.0 + ], + [ + 1170.0, + 255.0 + ] + ], + "center_px": [ + 1183.0, + 250.0 + ], + "area_px": 316.0 + }, + { + "image_points_px": [ + [ + 1196.0, + 232.0 + ], + [ + 1225.0, + 233.0 + ], + [ + 1228.0, + 244.0 + ], + [ + 1199.0, + 243.0 + ] + ], + "center_px": [ + 1212.0, + 238.0 + ], + "area_px": 316.0 + }, + { + "image_points_px": [ + [ + 139.0, + 162.0 + ], + [ + 150.0, + 152.0 + ], + [ + 175.0, + 153.0 + ], + [ + 165.0, + 164.0 + ] + ], + "center_px": [ + 157.25, + 157.75 + ], + "area_px": 283.5 + }, + { + "image_points_px": [ + [ + 1068.0, + 195.0 + ], + [ + 1097.0, + 197.0 + ], + [ + 1098.0, + 209.0 + ], + [ + 1071.0, + 207.0 + ] + ], + "center_px": [ + 1083.5, + 202.0 + ], + "area_px": 332.0 + }, + { + "image_points_px": [ + [ + 86.0, + 158.0 + ], + [ + 97.0, + 148.0 + ], + [ + 122.0, + 149.0 + ], + [ + 111.0, + 160.0 + ] + ], + "center_px": [ + 104.0, + 153.75 + ], + "area_px": 279.0 + }, + { + "image_points_px": [ + [ + 1157.0, + 189.0 + ], + [ + 1186.0, + 191.0 + ], + [ + 1188.0, + 202.0 + ], + [ + 1159.0, + 200.0 + ] + ], + "center_px": [ + 1172.5, + 195.5 + ], + "area_px": 315.0 + }, + { + "image_points_px": [ + [ + 177.0, + 153.0 + ], + [ + 187.0, + 143.0 + ], + [ + 213.0, + 144.0 + ], + [ + 203.0, + 154.0 + ] + ], + "center_px": [ + 195.0, + 148.5 + ], + "area_px": 270.0 + }, + { + "image_points_px": [ + [ + 826.0, + 204.0 + ], + [ + 855.0, + 205.0 + ], + [ + 853.0, + 217.0 + ], + [ + 825.0, + 215.0 + ] + ], + "center_px": [ + 839.75, + 210.25 + ], + "area_px": 330.0 + }, + { + "image_points_px": [ + [ + 705.0, + 206.0 + ], + [ + 708.0, + 194.0 + ], + [ + 736.0, + 196.0 + ], + [ + 732.0, + 208.0 + ] + ], + "center_px": [ + 720.25, + 201.0 + ], + "area_px": 337.0 + }, + { + "image_points_px": [ + [ + 1185.0, + 178.0 + ], + [ + 1212.0, + 180.0 + ], + [ + 1216.0, + 192.0 + ], + [ + 1188.0, + 190.0 + ] + ], + "center_px": [ + 1200.25, + 185.0 + ], + "area_px": 323.0 + }, + { + "image_points_px": [ + [ + 124.0, + 149.0 + ], + [ + 134.0, + 139.0 + ], + [ + 160.0, + 140.0 + ], + [ + 149.0, + 150.0 + ] + ], + "center_px": [ + 141.75, + 144.5 + ], + "area_px": 265.5 + }, + { + "image_points_px": [ + [ + 883.0, + 236.0 + ], + [ + 912.0, + 237.0 + ], + [ + 912.0, + 248.0 + ], + [ + 883.0, + 247.0 + ] + ], + "center_px": [ + 897.5, + 242.0 + ], + "area_px": 319.0 + }, + { + "image_points_px": [ + [ + 1070.0, + 223.0 + ], + [ + 1098.0, + 223.0 + ], + [ + 1101.0, + 235.0 + ], + [ + 1073.0, + 234.0 + ] + ], + "center_px": [ + 1085.5, + 228.75 + ], + "area_px": 320.5 + }, + { + "image_points_px": [ + [ + 552.0, + 207.0 + ], + [ + 558.0, + 196.0 + ], + [ + 585.0, + 198.0 + ], + [ + 580.0, + 209.0 + ] + ], + "center_px": [ + 568.75, + 202.5 + ], + "area_px": 313.5 + }, + { + "image_points_px": [ + [ + 529.0, + 192.0 + ], + [ + 535.0, + 181.0 + ], + [ + 562.0, + 183.0 + ], + [ + 557.0, + 194.0 + ] + ], + "center_px": [ + 545.75, + 187.5 + ], + "area_px": 313.5 + }, + { + "image_points_px": [ + [ + 587.0, + 196.0 + ], + [ + 593.0, + 185.0 + ], + [ + 620.0, + 187.0 + ], + [ + 615.0, + 198.0 + ] + ], + "center_px": [ + 603.75, + 191.5 + ], + "area_px": 313.5 + }, + { + "image_points_px": [ + [ + 723.0, + 248.0 + ], + [ + 727.0, + 237.0 + ], + [ + 755.0, + 240.0 + ], + [ + 751.0, + 251.0 + ] + ], + "center_px": [ + 739.0, + 244.0 + ], + "area_px": 320.0 + }, + { + "image_points_px": [ + [ + 1225.0, + 221.0 + ], + [ + 1253.0, + 222.0 + ], + [ + 1257.0, + 233.0 + ], + [ + 1229.0, + 232.0 + ] + ], + "center_px": [ + 1241.0, + 227.0 + ], + "area_px": 304.0 + }, + { + "image_points_px": [ + [ + 285.0, + 161.0 + ], + [ + 294.0, + 151.0 + ], + [ + 320.0, + 152.0 + ], + [ + 312.0, + 162.0 + ] + ], + "center_px": [ + 302.75, + 156.5 + ], + "area_px": 273.5 + }, + { + "image_points_px": [ + [ + 918.0, + 197.0 + ], + [ + 946.0, + 199.0 + ], + [ + 946.0, + 210.0 + ], + [ + 917.0, + 208.0 + ] + ], + "center_px": [ + 931.75, + 203.5 + ], + "area_px": 314.5 + }, + { + "image_points_px": [ + [ + 858.0, + 193.0 + ], + [ + 886.0, + 194.0 + ], + [ + 885.0, + 206.0 + ], + [ + 857.0, + 204.0 + ] + ], + "center_px": [ + 871.5, + 199.25 + ], + "area_px": 323.5 + }, + { + "image_points_px": [ + [ + 194.0, + 167.0 + ], + [ + 204.0, + 156.0 + ], + [ + 229.0, + 158.0 + ], + [ + 219.0, + 168.0 + ] + ], + "center_px": [ + 211.5, + 162.25 + ], + "area_px": 277.5 + }, + { + "image_points_px": [ + [ + 1238.0, + 159.0 + ], + [ + 1267.0, + 161.0 + ], + [ + 1270.0, + 171.0 + ], + [ + 1241.0, + 169.0 + ] + ], + "center_px": [ + 1254.0, + 165.0 + ], + "area_px": 284.0 + }, + { + "image_points_px": [ + [ + 697.0, + 232.0 + ], + [ + 701.0, + 220.0 + ], + [ + 728.0, + 223.0 + ], + [ + 723.0, + 235.0 + ] + ], + "center_px": [ + 712.25, + 227.5 + ], + "area_px": 331.5 + }, + { + "image_points_px": [ + [ + 740.0, + 186.0 + ], + [ + 769.0, + 185.0 + ], + [ + 766.0, + 197.0 + ], + [ + 738.0, + 195.0 + ] + ], + "center_px": [ + 753.25, + 190.75 + ], + "area_px": 300.5 + }, + { + "image_points_px": [ + [ + 564.0, + 182.0 + ], + [ + 569.0, + 171.0 + ], + [ + 596.0, + 173.0 + ], + [ + 591.0, + 184.0 + ] + ], + "center_px": [ + 580.0, + 177.5 + ], + "area_px": 307.0 + }, + { + "image_points_px": [ + [ + 1212.0, + 168.0 + ], + [ + 1239.0, + 170.0 + ], + [ + 1243.0, + 181.0 + ], + [ + 1215.0, + 179.0 + ] + ], + "center_px": [ + 1227.25, + 174.5 + ], + "area_px": 295.5 + }, + { + "image_points_px": [ + [ + 162.0, + 139.0 + ], + [ + 173.0, + 129.0 + ], + [ + 197.0, + 131.0 + ], + [ + 187.0, + 141.0 + ] + ], + "center_px": [ + 179.75, + 135.0 + ], + "area_px": 266.0 + }, + { + "image_points_px": [ + [ + 540.0, + 233.0 + ], + [ + 546.0, + 222.0 + ], + [ + 572.0, + 225.0 + ], + [ + 567.0, + 236.0 + ] + ], + "center_px": [ + 556.25, + 229.0 + ], + "area_px": 308.0 + }, + { + "image_points_px": [ + [ + 304.0, + 138.0 + ], + [ + 312.0, + 128.0 + ], + [ + 338.0, + 129.0 + ], + [ + 330.0, + 139.0 + ] + ], + "center_px": [ + 321.0, + 133.5 + ], + "area_px": 268.0 + }, + { + "image_points_px": [ + [ + 680.0, + 190.0 + ], + [ + 684.0, + 179.0 + ], + [ + 711.0, + 181.0 + ], + [ + 707.0, + 192.0 + ] + ], + "center_px": [ + 695.5, + 185.5 + ], + "area_px": 305.0 + }, + { + "image_points_px": [ + [ + 622.0, + 186.0 + ], + [ + 626.0, + 175.0 + ], + [ + 653.0, + 177.0 + ], + [ + 649.0, + 188.0 + ] + ], + "center_px": [ + 637.5, + 181.5 + ], + "area_px": 305.0 + }, + { + "image_points_px": [ + [ + 773.0, + 174.0 + ], + [ + 801.0, + 175.0 + ], + [ + 799.0, + 186.0 + ], + [ + 771.0, + 184.0 + ] + ], + "center_px": [ + 786.0, + 179.75 + ], + "area_px": 297.0 + }, + { + "image_points_px": [ + [ + 110.0, + 135.0 + ], + [ + 120.0, + 126.0 + ], + [ + 145.0, + 127.0 + ], + [ + 134.0, + 137.0 + ] + ], + "center_px": [ + 127.25, + 131.25 + ], + "area_px": 248.5 + }, + { + "image_points_px": [ + [ + 978.0, + 202.0 + ], + [ + 1005.0, + 203.0 + ], + [ + 1007.0, + 214.0 + ], + [ + 979.0, + 213.0 + ] + ], + "center_px": [ + 992.25, + 208.0 + ], + "area_px": 301.0 + }, + { + "image_points_px": [ + [ + 58.0, + 131.0 + ], + [ + 69.0, + 122.0 + ], + [ + 93.0, + 123.0 + ], + [ + 82.0, + 133.0 + ] + ], + "center_px": [ + 75.5, + 127.25 + ], + "area_px": 244.5 + }, + { + "image_points_px": [ + [ + 1206.0, + 145.0 + ], + [ + 1234.0, + 147.0 + ], + [ + 1237.0, + 157.0 + ], + [ + 1209.0, + 155.0 + ] + ], + "center_px": [ + 1221.5, + 151.0 + ], + "area_px": 274.0 + }, + { + "image_points_px": [ + [ + 713.0, + 180.0 + ], + [ + 716.0, + 169.0 + ], + [ + 743.0, + 171.0 + ], + [ + 740.0, + 182.0 + ] + ], + "center_px": [ + 728.0, + 175.5 + ], + "area_px": 303.0 + }, + { + "image_points_px": [ + [ + 44.0, + 119.0 + ], + [ + 56.0, + 109.0 + ], + [ + 79.0, + 111.0 + ], + [ + 68.0, + 120.0 + ] + ], + "center_px": [ + 61.75, + 114.75 + ], + "area_px": 240.5 + }, + { + "image_points_px": [ + [ + 655.0, + 176.0 + ], + [ + 660.0, + 165.0 + ], + [ + 686.0, + 167.0 + ], + [ + 682.0, + 178.0 + ] + ], + "center_px": [ + 670.75, + 171.5 + ], + "area_px": 300.5 + }, + { + "image_points_px": [ + [ + 268.0, + 147.0 + ], + [ + 277.0, + 137.0 + ], + [ + 302.0, + 139.0 + ], + [ + 292.0, + 149.0 + ] + ], + "center_px": [ + 284.75, + 143.0 + ], + "area_px": 264.0 + }, + { + "image_points_px": [ + [ + 599.0, + 172.0 + ], + [ + 603.0, + 161.0 + ], + [ + 630.0, + 163.0 + ], + [ + 626.0, + 173.0 + ] + ], + "center_px": [ + 614.5, + 167.25 + ], + "area_px": 289.5 + }, + { + "image_points_px": [ + [ + 612.0, + 211.0 + ], + [ + 617.0, + 200.0 + ], + [ + 643.0, + 203.0 + ], + [ + 638.0, + 214.0 + ] + ], + "center_px": [ + 627.5, + 207.0 + ], + "area_px": 301.0 + }, + { + "image_points_px": [ + [ + 542.0, + 167.0 + ], + [ + 547.0, + 157.0 + ], + [ + 574.0, + 159.0 + ], + [ + 569.0, + 169.0 + ] + ], + "center_px": [ + 558.0, + 163.0 + ], + "area_px": 280.0 + }, + { + "image_points_px": [ + [ + 243.0, + 89.0 + ], + [ + 252.0, + 113.0 + ], + [ + 247.0, + 124.0 + ], + [ + 237.0, + 107.0 + ] + ], + "center_px": [ + 244.75, + 108.25 + ], + "area_px": 250.5 + }, + { + "image_points_px": [ + [ + 862.0, + 168.0 + ], + [ + 889.0, + 169.0 + ], + [ + 889.0, + 180.0 + ], + [ + 861.0, + 178.0 + ] + ], + "center_px": [ + 875.25, + 173.75 + ], + "area_px": 289.5 + }, + { + "image_points_px": [ + [ + 1039.0, + 207.0 + ], + [ + 1067.0, + 208.0 + ], + [ + 1068.0, + 218.0 + ], + [ + 1040.0, + 217.0 + ] + ], + "center_px": [ + 1053.5, + 212.5 + ], + "area_px": 279.0 + }, + { + "image_points_px": [ + [ + 199.0, + 130.0 + ], + [ + 209.0, + 120.0 + ], + [ + 233.0, + 122.0 + ], + [ + 224.0, + 131.0 + ] + ], + "center_px": [ + 216.25, + 125.75 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 671.0, + 215.0 + ], + [ + 675.0, + 205.0 + ], + [ + 702.0, + 208.0 + ], + [ + 698.0, + 218.0 + ] + ], + "center_px": [ + 686.5, + 211.5 + ], + "area_px": 282.0 + }, + { + "image_points_px": [ + [ + 1097.0, + 186.0 + ], + [ + 1125.0, + 187.0 + ], + [ + 1127.0, + 197.0 + ], + [ + 1100.0, + 196.0 + ] + ], + "center_px": [ + 1112.25, + 191.5 + ], + "area_px": 272.5 + }, + { + "image_points_px": [ + [ + 1122.0, + 151.0 + ], + [ + 1149.0, + 152.0 + ], + [ + 1151.0, + 163.0 + ], + [ + 1124.0, + 161.0 + ] + ], + "center_px": [ + 1136.5, + 156.75 + ], + "area_px": 280.5 + }, + { + "image_points_px": [ + [ + 96.0, + 122.0 + ], + [ + 106.0, + 113.0 + ], + [ + 130.0, + 114.0 + ], + [ + 119.0, + 124.0 + ] + ], + "center_px": [ + 112.75, + 118.25 + ], + "area_px": 239.0 + }, + { + "image_points_px": [ + [ + 183.0, + 117.0 + ], + [ + 193.0, + 108.0 + ], + [ + 217.0, + 109.0 + ], + [ + 206.0, + 119.0 + ] + ], + "center_px": [ + 199.75, + 113.25 + ], + "area_px": 239.0 + }, + { + "image_points_px": [ + [ + 509.0, + 177.0 + ], + [ + 513.0, + 167.0 + ], + [ + 540.0, + 168.0 + ], + [ + 534.0, + 179.0 + ] + ], + "center_px": [ + 524.0, + 172.75 + ], + "area_px": 280.5 + }, + { + "image_points_px": [ + [ + 576.0, + 158.0 + ], + [ + 581.0, + 147.0 + ], + [ + 607.0, + 149.0 + ], + [ + 602.0, + 159.0 + ] + ], + "center_px": [ + 591.5, + 153.25 + ], + "area_px": 280.5 + }, + { + "image_points_px": [ + [ + 1008.0, + 192.0 + ], + [ + 1036.0, + 193.0 + ], + [ + 1037.0, + 203.0 + ], + [ + 1010.0, + 202.0 + ] + ], + "center_px": [ + 1022.75, + 197.5 + ], + "area_px": 273.5 + }, + { + "image_points_px": [ + [ + 147.0, + 126.0 + ], + [ + 157.0, + 117.0 + ], + [ + 181.0, + 118.0 + ], + [ + 172.0, + 127.0 + ] + ], + "center_px": [ + 164.25, + 122.0 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 168.0, + 105.0 + ], + [ + 178.0, + 96.0 + ], + [ + 202.0, + 97.0 + ], + [ + 193.0, + 106.0 + ] + ], + "center_px": [ + 185.25, + 101.0 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 82.0, + 110.0 + ], + [ + 92.0, + 101.0 + ], + [ + 116.0, + 102.0 + ], + [ + 106.0, + 111.0 + ] + ], + "center_px": [ + 99.0, + 106.0 + ], + "area_px": 226.0 + }, + { + "image_points_px": [ + [ + 32.0, + 106.0 + ], + [ + 43.0, + 97.0 + ], + [ + 66.0, + 98.0 + ], + [ + 56.0, + 107.0 + ] + ], + "center_px": [ + 49.25, + 102.0 + ], + "area_px": 222.0 + }, + { + "image_points_px": [ + [ + 646.0, + 200.0 + ], + [ + 651.0, + 190.0 + ], + [ + 677.0, + 193.0 + ], + [ + 672.0, + 203.0 + ] + ], + "center_px": [ + 661.5, + 196.5 + ], + "area_px": 275.0 + }, + { + "image_points_px": [ + [ + 287.0, + 125.0 + ], + [ + 296.0, + 115.0 + ], + [ + 320.0, + 117.0 + ], + [ + 312.0, + 126.0 + ] + ], + "center_px": [ + 303.75, + 120.75 + ], + "area_px": 245.5 + }, + { + "image_points_px": [ + [ + 1149.0, + 141.0 + ], + [ + 1176.0, + 143.0 + ], + [ + 1178.0, + 153.0 + ], + [ + 1151.0, + 151.0 + ] + ], + "center_px": [ + 1163.5, + 147.0 + ], + "area_px": 266.0 + }, + { + "image_points_px": [ + [ + 554.0, + 144.0 + ], + [ + 559.0, + 134.0 + ], + [ + 585.0, + 135.0 + ], + [ + 580.0, + 145.0 + ] + ], + "center_px": [ + 569.5, + 139.5 + ], + "area_px": 265.0 + }, + { + "image_points_px": [ + [ + 950.0, + 162.0 + ], + [ + 975.0, + 163.0 + ], + [ + 977.0, + 174.0 + ], + [ + 949.0, + 172.0 + ] + ], + "center_px": [ + 962.75, + 167.75 + ], + "area_px": 277.5 + }, + { + "image_points_px": [ + [ + 55.0, + 86.0 + ], + [ + 67.0, + 77.0 + ], + [ + 89.0, + 78.0 + ], + [ + 78.0, + 87.0 + ] + ], + "center_px": [ + 72.25, + 82.0 + ], + "area_px": 214.0 + }, + { + "image_points_px": [ + [ + 1092.0, + 137.0 + ], + [ + 1119.0, + 139.0 + ], + [ + 1120.0, + 149.0 + ], + [ + 1093.0, + 147.0 + ] + ], + "center_px": [ + 1106.0, + 143.0 + ], + "area_px": 268.0 + }, + { + "image_points_px": [ + [ + 133.0, + 114.0 + ], + [ + 142.0, + 104.0 + ], + [ + 166.0, + 106.0 + ], + [ + 156.0, + 115.0 + ] + ], + "center_px": [ + 149.25, + 109.75 + ], + "area_px": 237.5 + }, + { + "image_points_px": [ + [ + 270.0, + 112.0 + ], + [ + 279.0, + 103.0 + ], + [ + 303.0, + 104.0 + ], + [ + 295.0, + 113.0 + ] + ], + "center_px": [ + 286.75, + 108.0 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 1232.0, + 136.0 + ], + [ + 1259.0, + 137.0 + ], + [ + 1262.0, + 147.0 + ], + [ + 1237.0, + 146.0 + ] + ], + "center_px": [ + 1247.5, + 141.5 + ], + "area_px": 256.0 + }, + { + "image_points_px": [ + [ + 19.0, + 94.0 + ], + [ + 29.0, + 86.0 + ], + [ + 53.0, + 87.0 + ], + [ + 43.0, + 95.0 + ] + ], + "center_px": [ + 36.0, + 90.5 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 104.0, + 89.0 + ], + [ + 114.0, + 81.0 + ], + [ + 138.0, + 82.0 + ], + [ + 128.0, + 90.0 + ] + ], + "center_px": [ + 121.0, + 85.5 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 696.0, + 142.0 + ], + [ + 700.0, + 133.0 + ], + [ + 726.0, + 134.0 + ], + [ + 723.0, + 144.0 + ] + ], + "center_px": [ + 711.25, + 138.25 + ], + "area_px": 257.0 + }, + { + "image_points_px": [ + [ + 835.0, + 156.0 + ], + [ + 863.0, + 156.0 + ], + [ + 861.0, + 166.0 + ], + [ + 834.0, + 164.0 + ] + ], + "center_px": [ + 848.25, + 160.5 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 1038.0, + 181.0 + ], + [ + 1064.0, + 182.0 + ], + [ + 1066.0, + 192.0 + ], + [ + 1039.0, + 191.0 + ] + ], + "center_px": [ + 1051.75, + 186.5 + ], + "area_px": 263.5 + }, + { + "image_points_px": [ + [ + 1067.0, + 171.0 + ], + [ + 1093.0, + 172.0 + ], + [ + 1095.0, + 182.0 + ], + [ + 1068.0, + 181.0 + ] + ], + "center_px": [ + 1080.75, + 176.5 + ], + "area_px": 263.5 + }, + { + "image_points_px": [ + [ + 7.0, + 82.0 + ], + [ + 18.0, + 74.0 + ], + [ + 41.0, + 75.0 + ], + [ + 30.0, + 83.0 + ] + ], + "center_px": [ + 24.0, + 78.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 892.0, + 160.0 + ], + [ + 918.0, + 159.0 + ], + [ + 919.0, + 170.0 + ], + [ + 891.0, + 168.0 + ] + ], + "center_px": [ + 905.0, + 164.25 + ], + "area_px": 256.5 + }, + { + "image_points_px": [ + [ + 1226.0, + 114.0 + ], + [ + 1253.0, + 116.0 + ], + [ + 1256.0, + 125.0 + ], + [ + 1229.0, + 123.0 + ] + ], + "center_px": [ + 1241.0, + 119.5 + ], + "area_px": 237.0 + }, + { + "image_points_px": [ + [ + 533.0, + 131.0 + ], + [ + 539.0, + 121.0 + ], + [ + 564.0, + 123.0 + ], + [ + 559.0, + 132.0 + ] + ], + "center_px": [ + 548.75, + 126.75 + ], + "area_px": 250.5 + }, + { + "image_points_px": [ + [ + 1175.0, + 132.0 + ], + [ + 1200.0, + 133.0 + ], + [ + 1205.0, + 143.0 + ], + [ + 1179.0, + 142.0 + ] + ], + "center_px": [ + 1189.75, + 137.5 + ], + "area_px": 250.5 + }, + { + "image_points_px": [ + [ + 118.0, + 101.0 + ], + [ + 129.0, + 92.0 + ], + [ + 151.0, + 93.0 + ], + [ + 142.0, + 102.0 + ] + ], + "center_px": [ + 135.0, + 97.0 + ], + "area_px": 217.0 + }, + { + "image_points_px": [ + [ + 1153.0, + 166.0 + ], + [ + 1180.0, + 166.0 + ], + [ + 1183.0, + 175.0 + ], + [ + 1156.0, + 175.0 + ] + ], + "center_px": [ + 1168.0, + 170.5 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 69.0, + 98.0 + ], + [ + 79.0, + 89.0 + ], + [ + 102.0, + 90.0 + ], + [ + 92.0, + 99.0 + ] + ], + "center_px": [ + 85.5, + 94.0 + ], + "area_px": 217.0 + }, + { + "image_points_px": [ + [ + 154.0, + 93.0 + ], + [ + 164.0, + 84.0 + ], + [ + 187.0, + 85.0 + ], + [ + 177.0, + 94.0 + ] + ], + "center_px": [ + 170.5, + 89.0 + ], + "area_px": 217.0 + }, + { + "image_points_px": [ + [ + 1201.0, + 123.0 + ], + [ + 1227.0, + 124.0 + ], + [ + 1230.0, + 134.0 + ], + [ + 1203.0, + 132.0 + ] + ], + "center_px": [ + 1215.25, + 128.25 + ], + "area_px": 248.0 + }, + { + "image_points_px": [ + [ + 1126.0, + 176.0 + ], + [ + 1152.0, + 176.0 + ], + [ + 1155.0, + 186.0 + ], + [ + 1128.0, + 185.0 + ] + ], + "center_px": [ + 1140.25, + 180.75 + ], + "area_px": 250.5 + }, + { + "image_points_px": [ + [ + 1063.0, + 124.0 + ], + [ + 1089.0, + 126.0 + ], + [ + 1091.0, + 135.0 + ], + [ + 1064.0, + 134.0 + ] + ], + "center_px": [ + 1076.75, + 129.75 + ], + "area_px": 249.5 + }, + { + "image_points_px": [ + [ + 979.0, + 177.0 + ], + [ + 1005.0, + 178.0 + ], + [ + 1007.0, + 187.0 + ], + [ + 980.0, + 187.0 + ] + ], + "center_px": [ + 992.75, + 182.25 + ], + "area_px": 251.0 + }, + { + "image_points_px": [ + [ + 619.0, + 125.0 + ], + [ + 624.0, + 116.0 + ], + [ + 649.0, + 117.0 + ], + [ + 645.0, + 127.0 + ] + ], + "center_px": [ + 634.25, + 121.25 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 587.0, + 135.0 + ], + [ + 592.0, + 125.0 + ], + [ + 617.0, + 127.0 + ], + [ + 613.0, + 136.0 + ] + ], + "center_px": [ + 602.25, + 130.75 + ], + "area_px": 249.0 + }, + { + "image_points_px": [ + [ + 1145.0, + 119.0 + ], + [ + 1172.0, + 121.0 + ], + [ + 1174.0, + 130.0 + ], + [ + 1149.0, + 129.0 + ] + ], + "center_px": [ + 1160.0, + 124.75 + ], + "area_px": 242.5 + }, + { + "image_points_px": [ + [ + 949.0, + 188.0 + ], + [ + 975.0, + 188.0 + ], + [ + 976.0, + 198.0 + ], + [ + 949.0, + 197.0 + ] + ], + "center_px": [ + 962.25, + 192.75 + ], + "area_px": 251.5 + }, + { + "image_points_px": [ + [ + 920.0, + 173.0 + ], + [ + 947.0, + 174.0 + ], + [ + 947.0, + 183.0 + ], + [ + 921.0, + 183.0 + ] + ], + "center_px": [ + 933.75, + 178.25 + ], + "area_px": 251.5 + }, + { + "image_points_px": [ + [ + 799.0, + 190.0 + ], + [ + 826.0, + 190.0 + ], + [ + 826.0, + 199.0 + ], + [ + 799.0, + 199.0 + ] + ], + "center_px": [ + 812.5, + 194.5 + ], + "area_px": 243.0 + }, + { + "image_points_px": [ + [ + 305.0, + 103.0 + ], + [ + 314.0, + 94.0 + ], + [ + 337.0, + 96.0 + ], + [ + 329.0, + 105.0 + ] + ], + "center_px": [ + 321.25, + 99.5 + ], + "area_px": 228.5 + }, + { + "image_points_px": [ + [ + 91.0, + 78.0 + ], + [ + 103.0, + 69.0 + ], + [ + 124.0, + 71.0 + ], + [ + 114.0, + 79.0 + ] + ], + "center_px": [ + 108.0, + 74.25 + ], + "area_px": 203.5 + }, + { + "image_points_px": [ + [ + 1180.0, + 156.0 + ], + [ + 1205.0, + 156.0 + ], + [ + 1210.0, + 165.0 + ], + [ + 1183.0, + 165.0 + ] + ], + "center_px": [ + 1194.5, + 160.5 + ], + "area_px": 234.0 + }, + { + "image_points_px": [ + [ + 441.0, + 102.0 + ], + [ + 447.0, + 93.0 + ], + [ + 472.0, + 94.0 + ], + [ + 466.0, + 103.0 + ] + ], + "center_px": [ + 456.5, + 98.0 + ], + "area_px": 231.0 + }, + { + "image_points_px": [ + [ + 43.0, + 74.0 + ], + [ + 53.0, + 66.0 + ], + [ + 76.0, + 67.0 + ], + [ + 66.0, + 75.0 + ] + ], + "center_px": [ + 59.5, + 70.5 + ], + "area_px": 194.0 + }, + { + "image_points_px": [ + [ + 1119.0, + 128.0 + ], + [ + 1145.0, + 130.0 + ], + [ + 1147.0, + 139.0 + ], + [ + 1121.0, + 138.0 + ] + ], + "center_px": [ + 1133.0, + 133.75 + ], + "area_px": 244.0 + }, + { + "image_points_px": [ + [ + 815.0, + 118.0 + ], + [ + 841.0, + 120.0 + ], + [ + 839.0, + 129.0 + ], + [ + 813.0, + 128.0 + ] + ], + "center_px": [ + 827.0, + 123.75 + ], + "area_px": 250.0 + }, + { + "image_points_px": [ + [ + 30.0, + 63.0 + ], + [ + 42.0, + 55.0 + ], + [ + 63.0, + 56.0 + ], + [ + 54.0, + 64.0 + ] + ], + "center_px": [ + 47.25, + 59.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 255.0, + 99.0 + ], + [ + 262.0, + 91.0 + ], + [ + 287.0, + 92.0 + ], + [ + 278.0, + 101.0 + ] + ], + "center_px": [ + 270.5, + 95.75 + ], + "area_px": 216.0 + }, + { + "image_points_px": [ + [ + 832.0, + 178.0 + ], + [ + 858.0, + 181.0 + ], + [ + 856.0, + 190.0 + ], + [ + 831.0, + 189.0 + ] + ], + "center_px": [ + 844.25, + 184.5 + ], + "area_px": 258.0 + }, + { + "image_points_px": [ + [ + 1008.0, + 167.0 + ], + [ + 1034.0, + 168.0 + ], + [ + 1036.0, + 177.0 + ], + [ + 1010.0, + 177.0 + ] + ], + "center_px": [ + 1022.0, + 172.25 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 1095.0, + 161.0 + ], + [ + 1121.0, + 162.0 + ], + [ + 1123.0, + 171.0 + ], + [ + 1097.0, + 171.0 + ] + ], + "center_px": [ + 1109.0, + 166.25 + ], + "area_px": 246.0 + }, + { + "image_points_px": [ + [ + 642.0, + 138.0 + ], + [ + 646.0, + 129.0 + ], + [ + 671.0, + 130.0 + ], + [ + 668.0, + 140.0 + ] + ], + "center_px": [ + 656.75, + 134.25 + ], + "area_px": 247.5 + }, + { + "image_points_px": [ + [ + 673.0, + 129.0 + ], + [ + 677.0, + 120.0 + ], + [ + 702.0, + 121.0 + ], + [ + 699.0, + 131.0 + ] + ], + "center_px": [ + 687.75, + 125.25 + ], + "area_px": 247.5 + }, + { + "image_points_px": [ + [ + 840.0, + 131.0 + ], + [ + 864.0, + 132.0 + ], + [ + 865.0, + 142.0 + ], + [ + 838.0, + 141.0 + ] + ], + "center_px": [ + 851.75, + 136.5 + ], + "area_px": 255.5 + }, + { + "image_points_px": [ + [ + 924.0, + 126.0 + ], + [ + 950.0, + 127.0 + ], + [ + 950.0, + 137.0 + ], + [ + 924.0, + 135.0 + ] + ], + "center_px": [ + 937.0, + 131.25 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 952.0, + 117.0 + ], + [ + 978.0, + 118.0 + ], + [ + 978.0, + 128.0 + ], + [ + 952.0, + 126.0 + ] + ], + "center_px": [ + 965.0, + 122.25 + ], + "area_px": 247.0 + }, + { + "image_points_px": [ + [ + 869.0, + 122.0 + ], + [ + 895.0, + 123.0 + ], + [ + 894.0, + 133.0 + ], + [ + 869.0, + 132.0 + ] + ], + "center_px": [ + 881.75, + 127.5 + ], + "area_px": 255.5 + }, + { + "image_points_px": [ + [ + 189.0, + 84.0 + ], + [ + 198.0, + 76.0 + ], + [ + 221.0, + 77.0 + ], + [ + 212.0, + 86.0 + ] + ], + "center_px": [ + 205.0, + 80.75 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 339.0, + 95.0 + ], + [ + 346.0, + 86.0 + ], + [ + 370.0, + 87.0 + ], + [ + 363.0, + 96.0 + ] + ], + "center_px": [ + 354.5, + 91.0 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 372.0, + 87.0 + ], + [ + 379.0, + 78.0 + ], + [ + 403.0, + 79.0 + ], + [ + 396.0, + 88.0 + ] + ], + "center_px": [ + 387.5, + 83.0 + ], + "area_px": 223.0 + }, + { + "image_points_px": [ + [ + 651.0, + 117.0 + ], + [ + 655.0, + 107.0 + ], + [ + 680.0, + 109.0 + ], + [ + 676.0, + 118.0 + ] + ], + "center_px": [ + 665.5, + 112.75 + ], + "area_px": 243.5 + }, + { + "image_points_px": [ + [ + 777.0, + 159.0 + ], + [ + 780.0, + 150.0 + ], + [ + 806.0, + 153.0 + ], + [ + 802.0, + 162.0 + ] + ], + "center_px": [ + 791.25, + 156.0 + ], + "area_px": 240.0 + }, + { + "image_points_px": [ + [ + 513.0, + 118.0 + ], + [ + 518.0, + 109.0 + ], + [ + 543.0, + 110.0 + ], + [ + 538.0, + 119.0 + ] + ], + "center_px": [ + 528.0, + 114.0 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 493.0, + 106.0 + ], + [ + 498.0, + 97.0 + ], + [ + 523.0, + 98.0 + ], + [ + 518.0, + 107.0 + ] + ], + "center_px": [ + 508.0, + 102.0 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 1171.0, + 110.0 + ], + [ + 1197.0, + 112.0 + ], + [ + 1199.0, + 121.0 + ], + [ + 1173.0, + 119.0 + ] + ], + "center_px": [ + 1185.0, + 115.5 + ], + "area_px": 230.0 + }, + { + "image_points_px": [ + [ + 803.0, + 172.0 + ], + [ + 806.0, + 164.0 + ], + [ + 832.0, + 167.0 + ], + [ + 829.0, + 176.0 + ] + ], + "center_px": [ + 817.5, + 169.75 + ], + "area_px": 231.5 + }, + { + "image_points_px": [ + [ + 390.0, + 98.0 + ], + [ + 396.0, + 90.0 + ], + [ + 421.0, + 91.0 + ], + [ + 414.0, + 100.0 + ] + ], + "center_px": [ + 405.25, + 94.75 + ], + "area_px": 218.0 + }, + { + "image_points_px": [ + [ + 174.0, + 73.0 + ], + [ + 183.0, + 65.0 + ], + [ + 206.0, + 66.0 + ], + [ + 198.0, + 74.0 + ] + ], + "center_px": [ + 190.25, + 69.5 + ], + "area_px": 196.5 + }, + { + "image_points_px": [ + [ + 204.0, + 96.0 + ], + [ + 213.0, + 88.0 + ], + [ + 236.0, + 89.0 + ], + [ + 228.0, + 97.0 + ] + ], + "center_px": [ + 220.25, + 92.5 + ], + "area_px": 196.5 + }, + { + "image_points_px": [ + [ + 1037.0, + 157.0 + ], + [ + 1063.0, + 158.0 + ], + [ + 1064.0, + 167.0 + ], + [ + 1039.0, + 167.0 + ] + ], + "center_px": [ + 1050.75, + 162.25 + ], + "area_px": 241.5 + }, + { + "image_points_px": [ + [ + 1061.0, + 103.0 + ], + [ + 1087.0, + 105.0 + ], + [ + 1088.0, + 114.0 + ], + [ + 1062.0, + 112.0 + ] + ], + "center_px": [ + 1074.5, + 108.5 + ], + "area_px": 232.0 + }, + { + "image_points_px": [ + [ + 980.0, + 108.0 + ], + [ + 1006.0, + 110.0 + ], + [ + 1006.0, + 119.0 + ], + [ + 980.0, + 117.0 + ] + ], + "center_px": [ + 993.0, + 113.5 + ], + "area_px": 234.0 + }, + { + "image_points_px": [ + [ + 979.0, + 153.0 + ], + [ + 1005.0, + 154.0 + ], + [ + 1006.0, + 163.0 + ], + [ + 980.0, + 162.0 + ] + ], + "center_px": [ + 992.5, + 158.0 + ], + "area_px": 233.0 + }, + { + "image_points_px": [ + [ + 140.0, + 81.0 + ], + [ + 149.0, + 73.0 + ], + [ + 172.0, + 74.0 + ], + [ + 163.0, + 82.0 + ] + ], + "center_px": [ + 156.0, + 77.5 + ], + "area_px": 193.0 + }, + { + "image_points_px": [ + [ + 126.0, + 70.0 + ], + [ + 135.0, + 62.0 + ], + [ + 158.0, + 63.0 + ], + [ + 149.0, + 71.0 + ] + ], + "center_px": [ + 142.0, + 66.5 + ], + "area_px": 193.0 + }, + { + "image_points_px": [ + [ + 160.0, + 62.0 + ], + [ + 169.0, + 54.0 + ], + [ + 192.0, + 55.0 + ], + [ + 183.0, + 63.0 + ] + ], + "center_px": [ + 176.0, + 58.5 + ], + "area_px": 193.0 + }, + { + "image_points_px": [ + [ + 633.0, + 160.0 + ], + [ + 637.0, + 151.0 + ], + [ + 662.0, + 154.0 + ], + [ + 658.0, + 163.0 + ] + ], + "center_px": [ + 647.5, + 157.0 + ], + "area_px": 237.0 + }, + { + "image_points_px": [ + [ + 665.0, + 151.0 + ], + [ + 669.0, + 142.0 + ], + [ + 694.0, + 145.0 + ], + [ + 690.0, + 154.0 + ] + ], + "center_px": [ + 679.5, + 148.0 + ], + "area_px": 237.0 + }, + { + "image_points_px": [ + [ + 652.0, + 439.0 + ], + [ + 661.0, + 436.0 + ], + [ + 686.0, + 442.0 + ], + [ + 679.0, + 444.0 + ] + ], + "center_px": [ + 669.5, + 440.25 + ], + "area_px": 109.0 + }, + { + "image_points_px": [ + [ + 272.0, + 80.0 + ], + [ + 282.0, + 71.0 + ], + [ + 303.0, + 72.0 + ], + [ + 296.0, + 81.0 + ] + ], + "center_px": [ + 288.25, + 76.0 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 79.0, + 66.0 + ], + [ + 89.0, + 58.0 + ], + [ + 111.0, + 59.0 + ], + [ + 102.0, + 67.0 + ] + ], + "center_px": [ + 95.25, + 62.5 + ], + "area_px": 189.5 + }, + { + "image_points_px": [ + [ + 113.0, + 59.0 + ], + [ + 122.0, + 51.0 + ], + [ + 145.0, + 52.0 + ], + [ + 135.0, + 60.0 + ] + ], + "center_px": [ + 128.75, + 55.5 + ], + "area_px": 189.5 + }, + { + "image_points_px": [ + [ + 215.0, + 143.0 + ], + [ + 224.0, + 133.0 + ], + [ + 245.0, + 135.0 + ], + [ + 240.0, + 144.0 + ] + ], + "center_px": [ + 231.0, + 138.75 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 289.0, + 91.0 + ], + [ + 296.0, + 83.0 + ], + [ + 320.0, + 84.0 + ], + [ + 312.0, + 93.0 + ] + ], + "center_px": [ + 304.25, + 87.75 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 598.0, + 113.0 + ], + [ + 602.0, + 104.0 + ], + [ + 627.0, + 105.0 + ], + [ + 623.0, + 114.0 + ] + ], + "center_px": [ + 612.5, + 109.0 + ], + "area_px": 229.0 + }, + { + "image_points_px": [ + [ + 1065.0, + 148.0 + ], + [ + 1090.0, + 148.0 + ], + [ + 1093.0, + 157.0 + ], + [ + 1067.0, + 157.0 + ] + ], + "center_px": [ + 1078.75, + 152.5 + ], + "area_px": 229.5 + }, + { + "image_points_px": [ + [ + 53.0, + 45.0 + ], + [ + 63.0, + 37.0 + ], + [ + 85.0, + 38.0 + ], + [ + 75.0, + 46.0 + ] + ], + "center_px": [ + 69.0, + 41.5 + ], + "area_px": 186.0 + }, + { + "image_points_px": [ + [ + 1036.0, + 134.0 + ], + [ + 1061.0, + 135.0 + ], + [ + 1063.0, + 144.0 + ], + [ + 1037.0, + 143.0 + ] + ], + "center_px": [ + 1049.25, + 139.0 + ], + "area_px": 228.0 + }, + { + "image_points_px": [ + [ + 322.0, + 83.0 + ], + [ + 329.0, + 75.0 + ], + [ + 353.0, + 76.0 + ], + [ + 346.0, + 84.0 + ] + ], + "center_px": [ + 337.5, + 79.5 + ], + "area_px": 199.0 + }, + { + "image_points_px": [ + [ + 951.0, + 140.0 + ], + [ + 976.0, + 140.0 + ], + [ + 978.0, + 149.0 + ], + [ + 952.0, + 149.0 + ] + ], + "center_px": [ + 964.25, + 144.5 + ], + "area_px": 229.5 + }, + { + "image_points_px": [ + [ + 66.0, + 56.0 + ], + [ + 75.0, + 48.0 + ], + [ + 98.0, + 49.0 + ], + [ + 88.0, + 56.0 + ] + ], + "center_px": [ + 81.75, + 52.25 + ], + "area_px": 173.5 + }, + { + "image_points_px": [ + [ + 898.0, + 113.0 + ], + [ + 924.0, + 115.0 + ], + [ + 923.0, + 124.0 + ], + [ + 899.0, + 123.0 + ] + ], + "center_px": [ + 911.0, + 118.75 + ], + "area_px": 237.5 + }, + { + "image_points_px": [ + [ + 556.0, + 89.0 + ], + [ + 561.0, + 80.0 + ], + [ + 585.0, + 81.0 + ], + [ + 581.0, + 90.0 + ] + ], + "center_px": [ + 570.75, + 85.0 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 1007.0, + 100.0 + ], + [ + 1033.0, + 101.0 + ], + [ + 1033.0, + 110.0 + ], + [ + 1007.0, + 108.0 + ] + ], + "center_px": [ + 1020.0, + 104.75 + ], + "area_px": 221.0 + }, + { + "image_points_px": [ + [ + 689.0, + 164.0 + ], + [ + 693.0, + 156.0 + ], + [ + 718.0, + 158.0 + ], + [ + 714.0, + 167.0 + ] + ], + "center_px": [ + 703.5, + 161.25 + ], + "area_px": 222.5 + }, + { + "image_points_px": [ + [ + 7.0, + 42.0 + ], + [ + 18.0, + 34.0 + ], + [ + 39.0, + 35.0 + ], + [ + 30.0, + 42.0 + ] + ], + "center_px": [ + 23.5, + 38.25 + ], + "area_px": 170.0 + }, + { + "image_points_px": [ + [ + 682.0, + 108.0 + ], + [ + 685.0, + 99.0 + ], + [ + 710.0, + 100.0 + ], + [ + 707.0, + 109.0 + ] + ], + "center_px": [ + 696.0, + 104.0 + ], + "area_px": 228.0 + }, + { + "image_points_px": [ + [ + 209.0, + 65.0 + ], + [ + 217.0, + 57.0 + ], + [ + 240.0, + 58.0 + ], + [ + 232.0, + 66.0 + ] + ], + "center_px": [ + 224.5, + 61.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 474.0, + 94.0 + ], + [ + 479.0, + 85.0 + ], + [ + 503.0, + 86.0 + ], + [ + 498.0, + 95.0 + ] + ], + "center_px": [ + 488.5, + 90.0 + ], + "area_px": 221.0 + }, + { + "image_points_px": [ + [ + 721.0, + 155.0 + ], + [ + 725.0, + 146.0 + ], + [ + 749.0, + 148.0 + ], + [ + 746.0, + 157.0 + ] + ], + "center_px": [ + 735.25, + 151.5 + ], + "area_px": 227.5 + }, + { + "image_points_px": [ + [ + 19.0, + 52.0 + ], + [ + 29.0, + 45.0 + ], + [ + 51.0, + 46.0 + ], + [ + 41.0, + 53.0 + ] + ], + "center_px": [ + 35.0, + 49.0 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 1008.0, + 144.0 + ], + [ + 1033.0, + 144.0 + ], + [ + 1035.0, + 153.0 + ], + [ + 1010.0, + 153.0 + ] + ], + "center_px": [ + 1021.5, + 148.5 + ], + "area_px": 225.0 + }, + { + "image_points_px": [ + [ + 227.0, + 47.0 + ], + [ + 235.0, + 39.0 + ], + [ + 258.0, + 40.0 + ], + [ + 249.0, + 48.0 + ] + ], + "center_px": [ + 242.25, + 43.5 + ], + "area_px": 188.5 + }, + { + "image_points_px": [ + [ + 577.0, + 100.0 + ], + [ + 581.0, + 92.0 + ], + [ + 606.0, + 93.0 + ], + [ + 601.0, + 102.0 + ] + ], + "center_px": [ + 591.25, + 96.75 + ], + "area_px": 215.0 + }, + { + "image_points_px": [ + [ + 1215.0, + 73.0 + ], + [ + 1240.0, + 75.0 + ], + [ + 1243.0, + 83.0 + ], + [ + 1218.0, + 82.0 + ] + ], + "center_px": [ + 1229.0, + 78.25 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 147.0, + 51.0 + ], + [ + 156.0, + 43.0 + ], + [ + 178.0, + 44.0 + ], + [ + 169.0, + 52.0 + ] + ], + "center_px": [ + 162.5, + 47.5 + ], + "area_px": 185.0 + }, + { + "image_points_px": [ + [ + 180.0, + 44.0 + ], + [ + 189.0, + 36.0 + ], + [ + 211.0, + 37.0 + ], + [ + 202.0, + 45.0 + ] + ], + "center_px": [ + 195.5, + 40.5 + ], + "area_px": 185.0 + }, + { + "image_points_px": [ + [ + 922.0, + 150.0 + ], + [ + 948.0, + 150.0 + ], + [ + 949.0, + 158.0 + ], + [ + 923.0, + 158.0 + ] + ], + "center_px": [ + 935.5, + 154.0 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 257.0, + 68.0 + ], + [ + 265.0, + 60.0 + ], + [ + 288.0, + 62.0 + ], + [ + 280.0, + 69.0 + ] + ], + "center_px": [ + 272.5, + 64.75 + ], + "area_px": 184.5 + }, + { + "image_points_px": [ + [ + 522.0, + 152.0 + ], + [ + 527.0, + 144.0 + ], + [ + 551.0, + 146.0 + ], + [ + 546.0, + 155.0 + ] + ], + "center_px": [ + 536.5, + 149.25 + ], + "area_px": 216.5 + }, + { + "image_points_px": [ + [ + 525.0, + 97.0 + ], + [ + 530.0, + 88.0 + ], + [ + 554.0, + 90.0 + ], + [ + 549.0, + 98.0 + ] + ], + "center_px": [ + 539.5, + 93.25 + ], + "area_px": 211.5 + }, + { + "image_points_px": [ + [ + 256.0, + 133.0 + ], + [ + 260.0, + 124.0 + ], + [ + 285.0, + 126.0 + ], + [ + 276.0, + 135.0 + ] + ], + "center_px": [ + 269.25, + 129.5 + ], + "area_px": 215.5 + }, + { + "image_points_px": [ + [ + 355.0, + 75.0 + ], + [ + 362.0, + 67.0 + ], + [ + 385.0, + 68.0 + ], + [ + 379.0, + 76.0 + ] + ], + "center_px": [ + 370.25, + 71.5 + ], + "area_px": 194.5 + }, + { + "image_points_px": [ + [ + 387.0, + 67.0 + ], + [ + 394.0, + 59.0 + ], + [ + 417.0, + 60.0 + ], + [ + 411.0, + 68.0 + ] + ], + "center_px": [ + 402.25, + 63.5 + ], + "area_px": 194.5 + }, + { + "image_points_px": [ + [ + 100.0, + 48.0 + ], + [ + 110.0, + 40.0 + ], + [ + 131.0, + 41.0 + ], + [ + 121.0, + 49.0 + ] + ], + "center_px": [ + 115.5, + 44.5 + ], + "area_px": 178.0 + }, + { + "image_points_px": [ + [ + 610.0, + 147.0 + ], + [ + 614.0, + 138.0 + ], + [ + 638.0, + 141.0 + ], + [ + 635.0, + 149.0 + ] + ], + "center_px": [ + 624.25, + 143.75 + ], + "area_px": 217.0 + }, + { + "image_points_px": [ + [ + 1245.0, + 85.0 + ], + [ + 1268.0, + 86.0 + ], + [ + 1273.0, + 95.0 + ], + [ + 1247.0, + 93.0 + ] + ], + "center_px": [ + 1258.25, + 89.75 + ], + "area_px": 203.0 + }, + { + "image_points_px": [ + [ + 659.0, + 95.0 + ], + [ + 663.0, + 87.0 + ], + [ + 687.0, + 88.0 + ], + [ + 684.0, + 97.0 + ] + ], + "center_px": [ + 673.25, + 91.75 + ], + "area_px": 213.5 + }, + { + "image_points_px": [ + [ + 783.0, + 135.0 + ], + [ + 786.0, + 127.0 + ], + [ + 811.0, + 130.0 + ], + [ + 808.0, + 138.0 + ] + ], + "center_px": [ + 797.0, + 132.5 + ], + "area_px": 209.0 + }, + { + "image_points_px": [ + [ + 505.0, + 85.0 + ], + [ + 510.0, + 77.0 + ], + [ + 534.0, + 78.0 + ], + [ + 530.0, + 86.0 + ] + ], + "center_px": [ + 519.75, + 81.5 + ], + "area_px": 200.5 + }, + { + "image_points_px": [ + [ + 536.0, + 77.0 + ], + [ + 541.0, + 69.0 + ], + [ + 565.0, + 70.0 + ], + [ + 561.0, + 78.0 + ] + ], + "center_px": [ + 550.75, + 73.5 + ], + "area_px": 200.5 + }, + { + "image_points_px": [ + [ + 9.0, + 127.0 + ], + [ + 19.0, + 118.0 + ], + [ + 39.0, + 120.0 + ], + [ + 30.0, + 129.0 + ] + ], + "center_px": [ + 24.25, + 123.5 + ], + "area_px": 203.5 + }, + { + "image_points_px": [ + [ + 423.0, + 90.0 + ], + [ + 429.0, + 81.0 + ], + [ + 452.0, + 83.0 + ], + [ + 447.0, + 91.0 + ] + ], + "center_px": [ + 437.75, + 86.25 + ], + "area_px": 208.0 + }, + { + "image_points_px": [ + [ + 306.0, + 72.0 + ], + [ + 313.0, + 64.0 + ], + [ + 336.0, + 65.0 + ], + [ + 329.0, + 73.0 + ] + ], + "center_px": [ + 321.0, + 68.5 + ], + "area_px": 191.0 + }, + { + "image_points_px": [ + [ + 338.0, + 64.0 + ], + [ + 345.0, + 56.0 + ], + [ + 368.0, + 57.0 + ], + [ + 361.0, + 65.0 + ] + ], + "center_px": [ + 353.0, + 60.5 + ], + "area_px": 191.0 + }, + { + "image_points_px": [ + [ + 194.0, + 54.0 + ], + [ + 202.0, + 47.0 + ], + [ + 225.0, + 48.0 + ], + [ + 217.0, + 55.0 + ] + ], + "center_px": [ + 209.5, + 51.0 + ], + "area_px": 169.0 + }, + { + "image_points_px": [ + [ + 1034.0, + 91.0 + ], + [ + 1059.0, + 93.0 + ], + [ + 1060.0, + 101.0 + ], + [ + 1035.0, + 100.0 + ] + ], + "center_px": [ + 1047.0, + 96.25 + ], + "area_px": 211.0 + }, + { + "image_points_px": [ + [ + 895.0, + 136.0 + ], + [ + 920.0, + 137.0 + ], + [ + 921.0, + 145.0 + ], + [ + 896.0, + 145.0 + ] + ], + "center_px": [ + 908.0, + 140.75 + ], + "area_px": 212.0 + }, + { + "image_points_px": [ + [ + 980.0, + 131.0 + ], + [ + 1005.0, + 131.0 + ], + [ + 1006.0, + 140.0 + ], + [ + 981.0, + 139.0 + ] + ], + "center_px": [ + 993.0, + 135.25 + ], + "area_px": 212.0 + }, + { + "image_points_px": [ + [ + 1138.0, + 78.0 + ], + [ + 1161.0, + 79.0 + ], + [ + 1165.0, + 88.0 + ], + [ + 1140.0, + 87.0 + ] + ], + "center_px": [ + 1151.0, + 83.0 + ], + "area_px": 213.0 + }, + { + "image_points_px": [ + [ + 872.0, + 103.0 + ], + [ + 898.0, + 102.0 + ], + [ + 897.0, + 111.0 + ], + [ + 872.0, + 110.0 + ] + ], + "center_px": [ + 884.75, + 106.5 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 322.0, + 53.0 + ], + [ + 330.0, + 45.0 + ], + [ + 352.0, + 46.0 + ], + [ + 345.0, + 54.0 + ] + ], + "center_px": [ + 337.25, + 49.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 274.0, + 50.0 + ], + [ + 282.0, + 42.0 + ], + [ + 304.0, + 43.0 + ], + [ + 297.0, + 51.0 + ] + ], + "center_px": [ + 289.25, + 46.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 290.0, + 61.0 + ], + [ + 297.0, + 53.0 + ], + [ + 320.0, + 54.0 + ], + [ + 312.0, + 62.0 + ] + ], + "center_px": [ + 304.75, + 57.5 + ], + "area_px": 187.5 + }, + { + "image_points_px": [ + [ + 75.0, + 27.0 + ], + [ + 84.0, + 20.0 + ], + [ + 106.0, + 21.0 + ], + [ + 97.0, + 28.0 + ] + ], + "center_px": [ + 90.5, + 24.0 + ], + "area_px": 163.0 + }, + { + "image_points_px": [ + [ + 42.0, + 34.0 + ], + [ + 52.0, + 27.0 + ], + [ + 73.0, + 28.0 + ], + [ + 64.0, + 35.0 + ] + ], + "center_px": [ + 57.75, + 31.0 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 846.0, + 97.0 + ], + [ + 848.0, + 89.0 + ], + [ + 873.0, + 91.0 + ], + [ + 871.0, + 99.0 + ] + ], + "center_px": [ + 859.5, + 94.0 + ], + "area_px": 204.0 + }, + { + "image_points_px": [ + [ + 1090.0, + 117.0 + ], + [ + 1115.0, + 117.0 + ], + [ + 1117.0, + 125.0 + ], + [ + 1092.0, + 125.0 + ] + ], + "center_px": [ + 1103.5, + 121.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 30.0, + 24.0 + ], + [ + 41.0, + 17.0 + ], + [ + 61.0, + 18.0 + ], + [ + 52.0, + 25.0 + ] + ], + "center_px": [ + 46.0, + 21.0 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 405.0, + 78.0 + ], + [ + 411.0, + 70.0 + ], + [ + 434.0, + 71.0 + ], + [ + 429.0, + 79.0 + ] + ], + "center_px": [ + 419.75, + 74.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 874.0, + 89.0 + ], + [ + 876.0, + 81.0 + ], + [ + 900.0, + 82.0 + ], + [ + 899.0, + 91.0 + ] + ], + "center_px": [ + 887.25, + 85.75 + ], + "area_px": 210.5 + }, + { + "image_points_px": [ + [ + 850.0, + 78.0 + ], + [ + 852.0, + 69.0 + ], + [ + 876.0, + 71.0 + ], + [ + 875.0, + 79.0 + ] + ], + "center_px": [ + 863.25, + 74.25 + ], + "area_px": 210.5 + }, + { + "image_points_px": [ + [ + 1060.0, + 83.0 + ], + [ + 1084.0, + 84.0 + ], + [ + 1086.0, + 93.0 + ], + [ + 1061.0, + 91.0 + ] + ], + "center_px": [ + 1072.75, + 87.75 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 638.0, + 84.0 + ], + [ + 643.0, + 75.0 + ], + [ + 666.0, + 77.0 + ], + [ + 662.0, + 85.0 + ] + ], + "center_px": [ + 652.25, + 80.25 + ], + "area_px": 206.5 + }, + { + "image_points_px": [ + [ + 955.0, + 76.0 + ], + [ + 980.0, + 78.0 + ], + [ + 979.0, + 86.0 + ], + [ + 954.0, + 84.0 + ] + ], + "center_px": [ + 967.0, + 81.0 + ], + "area_px": 202.0 + }, + { + "image_points_px": [ + [ + 1163.0, + 70.0 + ], + [ + 1188.0, + 72.0 + ], + [ + 1189.0, + 80.0 + ], + [ + 1164.0, + 78.0 + ] + ], + "center_px": [ + 1176.0, + 75.0 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 617.0, + 72.0 + ], + [ + 621.0, + 64.0 + ], + [ + 645.0, + 66.0 + ], + [ + 641.0, + 74.0 + ] + ], + "center_px": [ + 631.0, + 69.0 + ], + "area_px": 200.0 + }, + { + "image_points_px": [ + [ + 63.0, + 17.0 + ], + [ + 72.0, + 11.0 + ], + [ + 94.0, + 11.0 + ], + [ + 84.0, + 18.0 + ] + ], + "center_px": [ + 78.25, + 14.25 + ], + "area_px": 144.5 + }, + { + "image_points_px": [ + [ + 729.0, + 132.0 + ], + [ + 731.0, + 124.0 + ], + [ + 756.0, + 126.0 + ], + [ + 753.0, + 134.0 + ] + ], + "center_px": [ + 742.25, + 129.0 + ], + "area_px": 201.0 + }, + { + "image_points_px": [ + [ + 567.0, + 69.0 + ], + [ + 571.0, + 61.0 + ], + [ + 595.0, + 62.0 + ], + [ + 591.0, + 70.0 + ] + ], + "center_px": [ + 581.0, + 65.5 + ], + "area_px": 196.0 + }, + { + "image_points_px": [ + [ + 234.0, + 535.0 + ], + [ + 220.0, + 558.0 + ], + [ + 214.0, + 558.0 + ], + [ + 228.0, + 535.0 + ] + ], + "center_px": [ + 224.0, + 546.5 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 242.0, + 57.0 + ], + [ + 249.0, + 50.0 + ], + [ + 272.0, + 51.0 + ], + [ + 265.0, + 58.0 + ] + ], + "center_px": [ + 257.0, + 54.0 + ], + "area_px": 168.0 + }, + { + "image_points_px": [ + [ + 88.0, + 38.0 + ], + [ + 97.0, + 30.0 + ], + [ + 118.0, + 31.0 + ], + [ + 109.0, + 38.0 + ] + ], + "center_px": [ + 103.0, + 34.25 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 370.0, + 56.0 + ], + [ + 378.0, + 48.0 + ], + [ + 399.0, + 49.0 + ], + [ + 393.0, + 57.0 + ] + ], + "center_px": [ + 385.0, + 52.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 1008.0, + 122.0 + ], + [ + 1032.0, + 122.0 + ], + [ + 1034.0, + 130.0 + ], + [ + 1009.0, + 130.0 + ] + ], + "center_px": [ + 1020.75, + 126.0 + ], + "area_px": 196.0 + }, + { + "image_points_px": [ + [ + 1035.0, + 113.0 + ], + [ + 1059.0, + 113.0 + ], + [ + 1061.0, + 121.0 + ], + [ + 1036.0, + 121.0 + ] + ], + "center_px": [ + 1047.75, + 117.0 + ], + "area_px": 196.0 + }, + { + "image_points_px": [ + [ + 213.0, + 36.0 + ], + [ + 221.0, + 29.0 + ], + [ + 243.0, + 30.0 + ], + [ + 235.0, + 37.0 + ] + ], + "center_px": [ + 228.0, + 33.0 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 199.0, + 26.0 + ], + [ + 207.0, + 19.0 + ], + [ + 229.0, + 20.0 + ], + [ + 221.0, + 27.0 + ] + ], + "center_px": [ + 214.0, + 23.0 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 567.0, + 120.0 + ], + [ + 572.0, + 112.0 + ], + [ + 595.0, + 115.0 + ], + [ + 590.0, + 123.0 + ] + ], + "center_px": [ + 581.0, + 117.5 + ], + "area_px": 199.0 + }, + { + "image_points_px": [ + [ + 759.0, + 123.0 + ], + [ + 762.0, + 115.0 + ], + [ + 786.0, + 117.0 + ], + [ + 783.0, + 125.0 + ] + ], + "center_px": [ + 772.5, + 120.0 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 705.0, + 119.0 + ], + [ + 708.0, + 111.0 + ], + [ + 732.0, + 113.0 + ], + [ + 729.0, + 121.0 + ] + ], + "center_px": [ + 718.5, + 116.0 + ], + "area_px": 198.0 + }, + { + "image_points_px": [ + [ + 668.0, + 76.0 + ], + [ + 671.0, + 68.0 + ], + [ + 695.0, + 69.0 + ], + [ + 692.0, + 77.0 + ] + ], + "center_px": [ + 681.5, + 72.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 697.0, + 68.0 + ], + [ + 700.0, + 60.0 + ], + [ + 724.0, + 61.0 + ], + [ + 721.0, + 69.0 + ] + ], + "center_px": [ + 710.5, + 64.5 + ], + "area_px": 195.0 + }, + { + "image_points_px": [ + [ + 930.0, + 65.0 + ], + [ + 954.0, + 66.0 + ], + [ + 954.0, + 74.0 + ], + [ + 929.0, + 73.0 + ] + ], + "center_px": [ + 941.75, + 69.5 + ], + "area_px": 196.5 + }, + { + "image_points_px": [ + [ + 1116.0, + 108.0 + ], + [ + 1140.0, + 108.0 + ], + [ + 1143.0, + 116.0 + ], + [ + 1119.0, + 116.0 + ] + ], + "center_px": [ + 1129.5, + 112.0 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 153.0, + 23.0 + ], + [ + 162.0, + 16.0 + ], + [ + 183.0, + 17.0 + ], + [ + 175.0, + 24.0 + ] + ], + "center_px": [ + 168.25, + 20.0 + ], + "area_px": 159.0 + }, + { + "image_points_px": [ + [ + 121.0, + 30.0 + ], + [ + 130.0, + 23.0 + ], + [ + 151.0, + 24.0 + ], + [ + 143.0, + 31.0 + ] + ], + "center_px": [ + 136.25, + 27.0 + ], + "area_px": 159.0 + }, + { + "image_points_px": [ + [ + 735.0, + 110.0 + ], + [ + 739.0, + 102.0 + ], + [ + 762.0, + 105.0 + ], + [ + 759.0, + 113.0 + ] + ], + "center_px": [ + 748.75, + 107.5 + ], + "area_px": 198.5 + }, + { + "image_points_px": [ + [ + 1167.0, + 91.0 + ], + [ + 1191.0, + 91.0 + ], + [ + 1194.0, + 99.0 + ], + [ + 1169.0, + 98.0 + ] + ], + "center_px": [ + 1180.25, + 94.75 + ], + "area_px": 182.5 + }, + { + "image_points_px": [ + [ + 108.0, + 20.0 + ], + [ + 119.0, + 13.0 + ], + [ + 138.0, + 14.0 + ], + [ + 130.0, + 21.0 + ] + ], + "center_px": [ + 123.75, + 17.0 + ], + "area_px": 153.0 + }, + { + "image_points_px": [ + [ + 1187.0, + 62.0 + ], + [ + 1211.0, + 64.0 + ], + [ + 1213.0, + 72.0 + ], + [ + 1189.0, + 70.0 + ] + ], + "center_px": [ + 1200.0, + 67.0 + ], + "area_px": 188.0 + }, + { + "image_points_px": [ + [ + 354.0, + 45.0 + ], + [ + 361.0, + 38.0 + ], + [ + 383.0, + 39.0 + ], + [ + 376.0, + 47.0 + ] + ], + "center_px": [ + 368.5, + 42.25 + ], + "area_px": 175.5 + }, + { + "image_points_px": [ + [ + 748.0, + 71.0 + ], + [ + 750.0, + 63.0 + ], + [ + 774.0, + 64.0 + ], + [ + 772.0, + 72.0 + ] + ], + "center_px": [ + 761.0, + 67.5 + ], + "area_px": 194.0 + }, + { + "image_points_px": [ + [ + 1083.0, + 56.0 + ], + [ + 1107.0, + 57.0 + ], + [ + 1109.0, + 65.0 + ], + [ + 1085.0, + 64.0 + ] + ], + "center_px": [ + 1096.0, + 60.5 + ], + "area_px": 190.0 + }, + { + "image_points_px": [ + [ + 419.0, + 59.0 + ], + [ + 425.0, + 52.0 + ], + [ + 448.0, + 53.0 + ], + [ + 442.0, + 60.0 + ] + ], + "center_px": [ + 433.5, + 56.0 + ], + "area_px": 167.0 + }, + { + "image_points_px": [ + [ + 450.0, + 52.0 + ], + [ + 456.0, + 44.0 + ], + [ + 478.0, + 45.0 + ], + [ + 473.0, + 53.0 + ] + ], + "center_px": [ + 464.25, + 48.5 + ], + "area_px": 185.5 + }, + { + "image_points_px": [ + [ + 1088.0, + 96.0 + ], + [ + 1112.0, + 96.0 + ], + [ + 1114.0, + 104.0 + ], + [ + 1089.0, + 103.0 + ] + ], + "center_px": [ + 1100.75, + 99.75 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 19.0, + 15.0 + ], + [ + 28.0, + 8.0 + ], + [ + 49.0, + 9.0 + ], + [ + 40.0, + 15.0 + ] + ], + "center_px": [ + 34.0, + 11.75 + ], + "area_px": 141.0 + }, + { + "image_points_px": [ + [ + 878.0, + 70.0 + ], + [ + 879.0, + 62.0 + ], + [ + 903.0, + 63.0 + ], + [ + 902.0, + 71.0 + ] + ], + "center_px": [ + 890.5, + 66.5 + ], + "area_px": 193.0 + }, + { + "image_points_px": [ + [ + 1032.0, + 53.0 + ], + [ + 1056.0, + 54.0 + ], + [ + 1057.0, + 62.0 + ], + [ + 1033.0, + 61.0 + ] + ], + "center_px": [ + 1044.5, + 57.5 + ], + "area_px": 191.0 + }, + { + "image_points_px": [ + [ + 307.0, + 42.0 + ], + [ + 313.0, + 35.0 + ], + [ + 336.0, + 36.0 + ], + [ + 329.0, + 43.0 + ] + ], + "center_px": [ + 321.25, + 39.0 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 291.0, + 32.0 + ], + [ + 298.0, + 25.0 + ], + [ + 320.0, + 26.0 + ], + [ + 314.0, + 33.0 + ] + ], + "center_px": [ + 305.75, + 29.0 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 647.0, + 64.0 + ], + [ + 651.0, + 56.0 + ], + [ + 674.0, + 58.0 + ], + [ + 670.0, + 66.0 + ] + ], + "center_px": [ + 660.5, + 61.0 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 905.0, + 54.0 + ], + [ + 929.0, + 55.0 + ], + [ + 929.0, + 63.0 + ], + [ + 905.0, + 62.0 + ] + ], + "center_px": [ + 917.0, + 58.5 + ], + "area_px": 192.0 + }, + { + "image_points_px": [ + [ + 789.0, + 114.0 + ], + [ + 792.0, + 106.0 + ], + [ + 815.0, + 108.0 + ], + [ + 813.0, + 116.0 + ] + ], + "center_px": [ + 802.25, + 111.0 + ], + "area_px": 193.0 + }, + { + "image_points_px": [ + [ + 826.0, + 66.0 + ], + [ + 829.0, + 58.0 + ], + [ + 852.0, + 60.0 + ], + [ + 850.0, + 68.0 + ] + ], + "center_px": [ + 839.25, + 63.0 + ], + "area_px": 193.0 + }, + { + "image_points_px": [ + [ + 260.0, + 39.0 + ], + [ + 267.0, + 32.0 + ], + [ + 289.0, + 33.0 + ], + [ + 282.0, + 40.0 + ] + ], + "center_px": [ + 274.5, + 36.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 245.0, + 29.0 + ], + [ + 252.0, + 22.0 + ], + [ + 274.0, + 23.0 + ], + [ + 267.0, + 30.0 + ] + ], + "center_px": [ + 259.5, + 26.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 322.0, + 25.0 + ], + [ + 329.0, + 18.0 + ], + [ + 351.0, + 19.0 + ], + [ + 344.0, + 26.0 + ] + ], + "center_px": [ + 336.5, + 22.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 338.0, + 35.0 + ], + [ + 345.0, + 28.0 + ], + [ + 367.0, + 29.0 + ], + [ + 360.0, + 36.0 + ] + ], + "center_px": [ + 352.5, + 32.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 276.0, + 22.0 + ], + [ + 283.0, + 15.0 + ], + [ + 305.0, + 16.0 + ], + [ + 298.0, + 23.0 + ] + ], + "center_px": [ + 290.5, + 19.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 726.0, + 60.0 + ], + [ + 728.0, + 52.0 + ], + [ + 752.0, + 53.0 + ], + [ + 749.0, + 61.0 + ] + ], + "center_px": [ + 738.75, + 56.5 + ], + "area_px": 190.5 + }, + { + "image_points_px": [ + [ + 546.0, + 108.0 + ], + [ + 551.0, + 100.0 + ], + [ + 573.0, + 103.0 + ], + [ + 569.0, + 111.0 + ] + ], + "center_px": [ + 559.75, + 105.5 + ], + "area_px": 193.5 + }, + { + "image_points_px": [ + [ + 712.0, + 98.0 + ], + [ + 715.0, + 91.0 + ], + [ + 739.0, + 93.0 + ], + [ + 736.0, + 100.0 + ] + ], + "center_px": [ + 725.5, + 95.5 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 804.0, + 56.0 + ], + [ + 805.0, + 48.0 + ], + [ + 829.0, + 49.0 + ], + [ + 827.0, + 57.0 + ] + ], + "center_px": [ + 816.25, + 52.5 + ], + "area_px": 189.5 + }, + { + "image_points_px": [ + [ + 231.0, + 19.0 + ], + [ + 239.0, + 12.0 + ], + [ + 260.0, + 13.0 + ], + [ + 252.0, + 20.0 + ] + ], + "center_px": [ + 245.5, + 16.0 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 630.0, + 103.0 + ], + [ + 634.0, + 95.0 + ], + [ + 657.0, + 98.0 + ], + [ + 653.0, + 105.0 + ] + ], + "center_px": [ + 643.5, + 100.25 + ], + "area_px": 182.5 + }, + { + "image_points_px": [ + [ + 1057.0, + 45.0 + ], + [ + 1081.0, + 47.0 + ], + [ + 1082.0, + 54.0 + ], + [ + 1058.0, + 53.0 + ] + ], + "center_px": [ + 1069.5, + 49.75 + ], + "area_px": 178.5 + }, + { + "image_points_px": [ + [ + 676.0, + 57.0 + ], + [ + 679.0, + 49.0 + ], + [ + 702.0, + 50.0 + ], + [ + 699.0, + 58.0 + ] + ], + "center_px": [ + 689.0, + 53.5 + ], + "area_px": 187.0 + }, + { + "image_points_px": [ + [ + 626.0, + 53.0 + ], + [ + 630.0, + 46.0 + ], + [ + 653.0, + 47.0 + ], + [ + 649.0, + 55.0 + ] + ], + "center_px": [ + 639.5, + 50.25 + ], + "area_px": 178.5 + }, + { + "image_points_px": [ + [ + 186.0, + 16.0 + ], + [ + 196.0, + 9.0 + ], + [ + 215.0, + 10.0 + ], + [ + 207.0, + 17.0 + ] + ], + "center_px": [ + 201.0, + 13.0 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 415.0, + 31.0 + ], + [ + 421.0, + 24.0 + ], + [ + 443.0, + 25.0 + ], + [ + 438.0, + 32.0 + ] + ], + "center_px": [ + 429.25, + 28.0 + ], + "area_px": 163.0 + }, + { + "image_points_px": [ + [ + 445.0, + 24.0 + ], + [ + 451.0, + 17.0 + ], + [ + 473.0, + 18.0 + ], + [ + 468.0, + 25.0 + ] + ], + "center_px": [ + 459.25, + 21.0 + ], + "area_px": 163.0 + }, + { + "image_points_px": [ + [ + 141.0, + 13.0 + ], + [ + 149.0, + 7.0 + ], + [ + 170.0, + 7.0 + ], + [ + 162.0, + 14.0 + ] + ], + "center_px": [ + 155.5, + 10.25 + ], + "area_px": 140.5 + }, + { + "image_points_px": [ + [ + 1113.0, + 88.0 + ], + [ + 1137.0, + 88.0 + ], + [ + 1139.0, + 95.0 + ], + [ + 1115.0, + 95.0 + ] + ], + "center_px": [ + 1126.0, + 91.5 + ], + "area_px": 168.0 + }, + { + "image_points_px": [ + [ + 385.0, + 38.0 + ], + [ + 391.0, + 31.0 + ], + [ + 413.0, + 32.0 + ], + [ + 407.0, + 39.0 + ] + ], + "center_px": [ + 399.0, + 35.0 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 353.0, + 18.0 + ], + [ + 359.0, + 11.0 + ], + [ + 381.0, + 12.0 + ], + [ + 375.0, + 19.0 + ] + ], + "center_px": [ + 367.0, + 15.0 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 428.0, + 14.0 + ], + [ + 434.0, + 7.0 + ], + [ + 456.0, + 8.0 + ], + [ + 450.0, + 15.0 + ] + ], + "center_px": [ + 442.0, + 11.0 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 369.0, + 28.0 + ], + [ + 375.0, + 21.0 + ], + [ + 397.0, + 22.0 + ], + [ + 391.0, + 29.0 + ] + ], + "center_px": [ + 383.0, + 25.0 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 399.0, + 21.0 + ], + [ + 405.0, + 14.0 + ], + [ + 427.0, + 15.0 + ], + [ + 421.0, + 22.0 + ] + ], + "center_px": [ + 413.0, + 18.0 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 96.0, + 11.0 + ], + [ + 105.0, + 4.0 + ], + [ + 125.0, + 5.0 + ], + [ + 117.0, + 11.0 + ] + ], + "center_px": [ + 110.75, + 7.75 + ], + "area_px": 137.5 + }, + { + "image_points_px": [ + [ + 1105.0, + 31.0 + ], + [ + 1128.0, + 32.0 + ], + [ + 1130.0, + 40.0 + ], + [ + 1106.0, + 38.0 + ] + ], + "center_px": [ + 1117.25, + 35.25 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 1081.0, + 38.0 + ], + [ + 1104.0, + 39.0 + ], + [ + 1106.0, + 47.0 + ], + [ + 1082.0, + 45.0 + ] + ], + "center_px": [ + 1093.25, + 42.25 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 1007.0, + 42.0 + ], + [ + 1029.0, + 43.0 + ], + [ + 1031.0, + 51.0 + ], + [ + 1007.0, + 50.0 + ] + ], + "center_px": [ + 1018.5, + 46.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 1250.0, + 22.0 + ], + [ + 1273.0, + 24.0 + ], + [ + 1276.0, + 31.0 + ], + [ + 1253.0, + 30.0 + ] + ], + "center_px": [ + 1263.0, + 26.75 + ], + "area_px": 168.0 + }, + { + "image_points_px": [ + [ + 529.0, + 47.0 + ], + [ + 533.0, + 40.0 + ], + [ + 556.0, + 41.0 + ], + [ + 552.0, + 48.0 + ] + ], + "center_px": [ + 542.5, + 44.0 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 606.0, + 43.0 + ], + [ + 610.0, + 36.0 + ], + [ + 633.0, + 37.0 + ], + [ + 629.0, + 44.0 + ] + ], + "center_px": [ + 619.5, + 40.0 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 558.0, + 40.0 + ], + [ + 562.0, + 33.0 + ], + [ + 585.0, + 34.0 + ], + [ + 581.0, + 41.0 + ] + ], + "center_px": [ + 571.5, + 37.0 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 307.0, + 15.0 + ], + [ + 314.0, + 8.0 + ], + [ + 335.0, + 9.0 + ], + [ + 329.0, + 16.0 + ] + ], + "center_px": [ + 321.25, + 12.0 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 794.0, + 93.0 + ], + [ + 797.0, + 86.0 + ], + [ + 820.0, + 88.0 + ], + [ + 818.0, + 95.0 + ] + ], + "center_px": [ + 807.25, + 90.5 + ], + "area_px": 169.5 + }, + { + "image_points_px": [ + [ + 957.0, + 39.0 + ], + [ + 980.0, + 40.0 + ], + [ + 980.0, + 48.0 + ], + [ + 957.0, + 47.0 + ] + ], + "center_px": [ + 968.5, + 43.5 + ], + "area_px": 184.0 + }, + { + "image_points_px": [ + [ + 931.0, + 47.0 + ], + [ + 955.0, + 48.0 + ], + [ + 955.0, + 55.0 + ], + [ + 931.0, + 54.0 + ] + ], + "center_px": [ + 943.0, + 51.0 + ], + "area_px": 168.0 + }, + { + "image_points_px": [ + [ + 1222.0, + 95.0 + ], + [ + 1245.0, + 95.0 + ], + [ + 1248.0, + 102.0 + ], + [ + 1224.0, + 102.0 + ] + ], + "center_px": [ + 1234.75, + 98.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 1192.0, + 83.0 + ], + [ + 1215.0, + 83.0 + ], + [ + 1218.0, + 90.0 + ], + [ + 1194.0, + 90.0 + ] + ], + "center_px": [ + 1204.75, + 86.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 1132.0, + 41.0 + ], + [ + 1155.0, + 42.0 + ], + [ + 1157.0, + 50.0 + ], + [ + 1135.0, + 49.0 + ] + ], + "center_px": [ + 1144.75, + 45.5 + ], + "area_px": 177.5 + }, + { + "image_points_px": [ + [ + 510.0, + 37.0 + ], + [ + 515.0, + 30.0 + ], + [ + 537.0, + 31.0 + ], + [ + 533.0, + 38.0 + ] + ], + "center_px": [ + 523.75, + 34.0 + ], + "area_px": 162.0 + }, + { + "image_points_px": [ + [ + 742.0, + 89.0 + ], + [ + 745.0, + 82.0 + ], + [ + 768.0, + 85.0 + ], + [ + 765.0, + 92.0 + ] + ], + "center_px": [ + 755.0, + 87.0 + ], + "area_px": 170.0 + }, + { + "image_points_px": [ + [ + 456.0, + 81.0 + ], + [ + 461.0, + 74.0 + ], + [ + 483.0, + 76.0 + ], + [ + 478.0, + 83.0 + ] + ], + "center_px": [ + 469.5, + 78.5 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 981.0, + 89.0 + ], + [ + 1004.0, + 89.0 + ], + [ + 1006.0, + 96.0 + ], + [ + 982.0, + 96.0 + ] + ], + "center_px": [ + 993.25, + 92.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 1007.0, + 81.0 + ], + [ + 1031.0, + 81.0 + ], + [ + 1032.0, + 88.0 + ], + [ + 1009.0, + 88.0 + ] + ], + "center_px": [ + 1019.75, + 84.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 1086.0, + 76.0 + ], + [ + 1109.0, + 76.0 + ], + [ + 1111.0, + 83.0 + ], + [ + 1087.0, + 83.0 + ] + ], + "center_px": [ + 1098.25, + 79.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 588.0, + 79.0 + ], + [ + 592.0, + 72.0 + ], + [ + 614.0, + 74.0 + ], + [ + 610.0, + 82.0 + ] + ], + "center_px": [ + 601.0, + 76.75 + ], + "area_px": 175.0 + }, + { + "image_points_px": [ + [ + 655.0, + 46.0 + ], + [ + 658.0, + 39.0 + ], + [ + 681.0, + 40.0 + ], + [ + 678.0, + 47.0 + ] + ], + "center_px": [ + 668.0, + 43.0 + ], + "area_px": 164.0 + }, + { + "image_points_px": [ + [ + 463.0, + 34.0 + ], + [ + 468.0, + 27.0 + ], + [ + 490.0, + 28.0 + ], + [ + 485.0, + 35.0 + ] + ], + "center_px": [ + 476.5, + 31.0 + ], + "area_px": 159.0 + }, + { + "image_points_px": [ + [ + 492.0, + 27.0 + ], + [ + 497.0, + 20.0 + ], + [ + 519.0, + 21.0 + ], + [ + 514.0, + 28.0 + ] + ], + "center_px": [ + 505.5, + 24.0 + ], + "area_px": 159.0 + }, + { + "image_points_px": [ + [ + 433.0, + 41.0 + ], + [ + 438.0, + 34.0 + ], + [ + 460.0, + 35.0 + ], + [ + 455.0, + 42.0 + ] + ], + "center_px": [ + 446.5, + 38.0 + ], + "area_px": 159.0 + }, + { + "image_points_px": [ + [ + 884.0, + 26.0 + ], + [ + 907.0, + 27.0 + ], + [ + 906.0, + 35.0 + ], + [ + 883.0, + 33.0 + ] + ], + "center_px": [ + 895.0, + 30.25 + ], + "area_px": 174.0 + }, + { + "image_points_px": [ + [ + 1031.0, + 35.0 + ], + [ + 1054.0, + 36.0 + ], + [ + 1055.0, + 44.0 + ], + [ + 1032.0, + 42.0 + ] + ], + "center_px": [ + 1043.0, + 39.25 + ], + "area_px": 171.0 + }, + { + "image_points_px": [ + [ + 262.0, + 12.0 + ], + [ + 269.0, + 6.0 + ], + [ + 290.0, + 6.0 + ], + [ + 283.0, + 13.0 + ] + ], + "center_px": [ + 276.0, + 9.25 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 635.0, + 36.0 + ], + [ + 639.0, + 28.0 + ], + [ + 661.0, + 30.0 + ], + [ + 657.0, + 37.0 + ] + ], + "center_px": [ + 648.0, + 32.75 + ], + "area_px": 171.0 + }, + { + "image_points_px": [ + [ + 933.0, + 29.0 + ], + [ + 956.0, + 30.0 + ], + [ + 956.0, + 37.0 + ], + [ + 932.0, + 36.0 + ] + ], + "center_px": [ + 944.25, + 33.0 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 982.0, + 32.0 + ], + [ + 1005.0, + 33.0 + ], + [ + 1005.0, + 41.0 + ], + [ + 982.0, + 39.0 + ] + ], + "center_px": [ + 993.5, + 36.25 + ], + "area_px": 172.5 + }, + { + "image_points_px": [ + [ + 907.0, + 37.0 + ], + [ + 930.0, + 37.0 + ], + [ + 930.0, + 45.0 + ], + [ + 907.0, + 44.0 + ] + ], + "center_px": [ + 918.5, + 40.75 + ], + "area_px": 172.5 + }, + { + "image_points_px": [ + [ + 858.0, + 33.0 + ], + [ + 881.0, + 34.0 + ], + [ + 881.0, + 41.0 + ], + [ + 858.0, + 41.0 + ] + ], + "center_px": [ + 869.5, + 37.25 + ], + "area_px": 172.5 + }, + { + "image_points_px": [ + [ + 732.0, + 42.0 + ], + [ + 735.0, + 34.0 + ], + [ + 757.0, + 36.0 + ], + [ + 755.0, + 43.0 + ] + ], + "center_px": [ + 744.75, + 38.75 + ], + "area_px": 172.5 + }, + { + "image_points_px": [ + [ + 609.0, + 91.0 + ], + [ + 612.0, + 84.0 + ], + [ + 635.0, + 86.0 + ], + [ + 631.0, + 93.0 + ] + ], + "center_px": [ + 621.75, + 88.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 690.0, + 86.0 + ], + [ + 694.0, + 79.0 + ], + [ + 716.0, + 81.0 + ], + [ + 713.0, + 88.0 + ] + ], + "center_px": [ + 703.25, + 83.5 + ], + "area_px": 164.5 + }, + { + "image_points_px": [ + [ + 322.0, + 115.0 + ], + [ + 329.0, + 107.0 + ], + [ + 345.0, + 107.0 + ], + [ + 346.0, + 117.0 + ] + ], + "center_px": [ + 335.5, + 111.5 + ], + "area_px": 183.0 + }, + { + "image_points_px": [ + [ + 217.0, + 9.0 + ], + [ + 224.0, + 3.0 + ], + [ + 245.0, + 4.0 + ], + [ + 239.0, + 10.0 + ] + ], + "center_px": [ + 231.25, + 6.5 + ], + "area_px": 135.5 + }, + { + "image_points_px": [ + [ + 823.0, + 85.0 + ], + [ + 825.0, + 78.0 + ], + [ + 848.0, + 80.0 + ], + [ + 846.0, + 87.0 + ] + ], + "center_px": [ + 835.5, + 82.5 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 643.0, + 19.0 + ], + [ + 646.0, + 12.0 + ], + [ + 669.0, + 13.0 + ], + [ + 665.0, + 20.0 + ] + ], + "center_px": [ + 655.75, + 16.0 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 1111.0, + 68.0 + ], + [ + 1133.0, + 68.0 + ], + [ + 1136.0, + 75.0 + ], + [ + 1112.0, + 75.0 + ] + ], + "center_px": [ + 1123.0, + 71.5 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 1033.0, + 73.0 + ], + [ + 1056.0, + 73.0 + ], + [ + 1058.0, + 80.0 + ], + [ + 1035.0, + 80.0 + ] + ], + "center_px": [ + 1045.5, + 76.5 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 831.0, + 48.0 + ], + [ + 833.0, + 40.0 + ], + [ + 855.0, + 42.0 + ], + [ + 854.0, + 49.0 + ] + ], + "center_px": [ + 843.25, + 44.75 + ], + "area_px": 171.0 + }, + { + "image_points_px": [ + [ + 799.0, + 73.0 + ], + [ + 802.0, + 66.0 + ], + [ + 824.0, + 69.0 + ], + [ + 822.0, + 76.0 + ] + ], + "center_px": [ + 811.75, + 71.0 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 587.0, + 33.0 + ], + [ + 593.0, + 25.0 + ], + [ + 613.0, + 27.0 + ], + [ + 609.0, + 34.0 + ] + ], + "center_px": [ + 600.5, + 29.75 + ], + "area_px": 165.0 + }, + { + "image_points_px": [ + [ + 615.0, + 26.0 + ], + [ + 619.0, + 19.0 + ], + [ + 641.0, + 20.0 + ], + [ + 637.0, + 27.0 + ] + ], + "center_px": [ + 628.0, + 23.0 + ], + "area_px": 158.0 + }, + { + "image_points_px": [ + [ + 568.0, + 23.0 + ], + [ + 572.0, + 16.0 + ], + [ + 594.0, + 17.0 + ], + [ + 590.0, + 24.0 + ] + ], + "center_px": [ + 581.0, + 20.0 + ], + "area_px": 158.0 + }, + { + "image_points_px": [ + [ + 550.0, + 13.0 + ], + [ + 554.0, + 6.0 + ], + [ + 576.0, + 7.0 + ], + [ + 572.0, + 14.0 + ] + ], + "center_px": [ + 563.0, + 10.0 + ], + "area_px": 158.0 + }, + { + "image_points_px": [ + [ + 903.0, + 74.0 + ], + [ + 926.0, + 74.0 + ], + [ + 927.0, + 81.0 + ], + [ + 904.0, + 81.0 + ] + ], + "center_px": [ + 915.0, + 77.5 + ], + "area_px": 161.0 + }, + { + "image_points_px": [ + [ + 1174.0, + 10.0 + ], + [ + 1196.0, + 11.0 + ], + [ + 1199.0, + 18.0 + ], + [ + 1176.0, + 17.0 + ] + ], + "center_px": [ + 1186.25, + 14.0 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 488.0, + 73.0 + ], + [ + 492.0, + 66.0 + ], + [ + 514.0, + 68.0 + ], + [ + 509.0, + 75.0 + ] + ], + "center_px": [ + 500.75, + 70.5 + ], + "area_px": 159.5 + }, + { + "image_points_px": [ + [ + 1135.0, + 60.0 + ], + [ + 1158.0, + 61.0 + ], + [ + 1160.0, + 67.0 + ], + [ + 1137.0, + 67.0 + ] + ], + "center_px": [ + 1147.5, + 63.75 + ], + "area_px": 148.5 + }, + { + "image_points_px": [ + [ + 1159.0, + 53.0 + ], + [ + 1182.0, + 53.0 + ], + [ + 1184.0, + 60.0 + ], + [ + 1161.0, + 59.0 + ] + ], + "center_px": [ + 1171.5, + 56.25 + ], + "area_px": 148.5 + }, + { + "image_points_px": [ + [ + 262.0, + 489.0 + ], + [ + 250.0, + 509.0 + ], + [ + 244.0, + 510.0 + ], + [ + 258.0, + 488.0 + ] + ], + "center_px": [ + 253.5, + 499.0 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 720.0, + 78.0 + ], + [ + 723.0, + 71.0 + ], + [ + 745.0, + 73.0 + ], + [ + 742.0, + 80.0 + ] + ], + "center_px": [ + 732.5, + 75.5 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 1103.0, + 14.0 + ], + [ + 1125.0, + 15.0 + ], + [ + 1127.0, + 22.0 + ], + [ + 1104.0, + 21.0 + ] + ], + "center_px": [ + 1114.75, + 18.0 + ], + "area_px": 156.0 + }, + { + "image_points_px": [ + [ + 1059.0, + 65.0 + ], + [ + 1082.0, + 65.0 + ], + [ + 1083.0, + 72.0 + ], + [ + 1061.0, + 72.0 + ] + ], + "center_px": [ + 1071.25, + 68.5 + ], + "area_px": 157.5 + }, + { + "image_points_px": [ + [ + 1126.0, + 7.0 + ], + [ + 1149.0, + 9.0 + ], + [ + 1150.0, + 15.0 + ], + [ + 1127.0, + 14.0 + ] + ], + "center_px": [ + 1138.0, + 11.25 + ], + "area_px": 148.0 + }, + { + "image_points_px": [ + [ + 438.0, + 69.0 + ], + [ + 444.0, + 62.0 + ], + [ + 464.0, + 65.0 + ], + [ + 459.0, + 72.0 + ] + ], + "center_px": [ + 451.25, + 67.0 + ], + "area_px": 160.0 + }, + { + "image_points_px": [ + [ + 1007.0, + 62.0 + ], + [ + 1030.0, + 62.0 + ], + [ + 1031.0, + 69.0 + ], + [ + 1008.0, + 68.0 + ] + ], + "center_px": [ + 1019.0, + 65.25 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 956.0, + 58.0 + ], + [ + 979.0, + 59.0 + ], + [ + 980.0, + 65.0 + ], + [ + 957.0, + 65.0 + ] + ], + "center_px": [ + 968.0, + 61.75 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 909.0, + 26.0 + ], + [ + 910.0, + 19.0 + ], + [ + 932.0, + 20.0 + ], + [ + 932.0, + 27.0 + ] + ], + "center_px": [ + 920.75, + 23.0 + ], + "area_px": 158.0 + }, + { + "image_points_px": [ + [ + 1007.0, + 25.0 + ], + [ + 1029.0, + 26.0 + ], + [ + 1030.0, + 33.0 + ], + [ + 1007.0, + 32.0 + ] + ], + "center_px": [ + 1018.25, + 29.0 + ], + "area_px": 157.0 + }, + { + "image_points_px": [ + [ + 597.0, + 16.0 + ], + [ + 600.0, + 9.0 + ], + [ + 622.0, + 10.0 + ], + [ + 618.0, + 17.0 + ] + ], + "center_px": [ + 609.25, + 13.0 + ], + "area_px": 154.0 + }, + { + "image_points_px": [ + [ + 469.0, + 61.0 + ], + [ + 474.0, + 55.0 + ], + [ + 495.0, + 57.0 + ], + [ + 490.0, + 64.0 + ] + ], + "center_px": [ + 482.0, + 59.25 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 1108.0, + 50.0 + ], + [ + 1131.0, + 50.0 + ], + [ + 1133.0, + 56.0 + ], + [ + 1110.0, + 56.0 + ] + ], + "center_px": [ + 1120.5, + 53.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 698.0, + 629.0 + ], + [ + 699.0, + 646.0 + ], + [ + 694.0, + 657.0 + ], + [ + 693.0, + 637.0 + ] + ], + "center_px": [ + 696.0, + 642.25 + ], + "area_px": 102.0 + }, + { + "image_points_px": [ + [ + 860.0, + 23.0 + ], + [ + 862.0, + 16.0 + ], + [ + 884.0, + 18.0 + ], + [ + 883.0, + 24.0 + ] + ], + "center_px": [ + 872.25, + 20.25 + ], + "area_px": 148.5 + }, + { + "image_points_px": [ + [ + 717.0, + 14.0 + ], + [ + 720.0, + 8.0 + ], + [ + 742.0, + 9.0 + ], + [ + 739.0, + 16.0 + ] + ], + "center_px": [ + 729.5, + 11.75 + ], + "area_px": 147.5 + }, + { + "image_points_px": [ + [ + 1078.0, + 4.0 + ], + [ + 1100.0, + 6.0 + ], + [ + 1101.0, + 13.0 + ], + [ + 1079.0, + 11.0 + ] + ], + "center_px": [ + 1089.5, + 8.5 + ], + "area_px": 152.0 + }, + { + "image_points_px": [ + [ + 519.0, + 65.0 + ], + [ + 523.0, + 58.0 + ], + [ + 544.0, + 60.0 + ], + [ + 540.0, + 67.0 + ] + ], + "center_px": [ + 531.5, + 62.5 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 500.0, + 54.0 + ], + [ + 504.0, + 47.0 + ], + [ + 525.0, + 49.0 + ], + [ + 521.0, + 56.0 + ] + ], + "center_px": [ + 512.5, + 51.5 + ], + "area_px": 155.0 + }, + { + "image_points_px": [ + [ + 1183.0, + 45.0 + ], + [ + 1203.0, + 45.0 + ], + [ + 1208.0, + 52.0 + ], + [ + 1186.0, + 52.0 + ] + ], + "center_px": [ + 1195.0, + 48.5 + ], + "area_px": 147.0 + }, + { + "image_points_px": [ + [ + 511.0, + 614.0 + ], + [ + 483.0, + 619.0 + ], + [ + 493.0, + 614.0 + ], + [ + 506.0, + 612.0 + ] + ], + "center_px": [ + 498.25, + 614.75 + ], + "area_px": 63.0 + }, + { + "image_points_px": [ + [ + 934.0, + 13.0 + ], + [ + 956.0, + 13.0 + ], + [ + 957.0, + 20.0 + ], + [ + 934.0, + 19.0 + ] + ], + "center_px": [ + 945.25, + 16.25 + ], + "area_px": 146.0 + }, + { + "image_points_px": [ + [ + 1206.0, + 38.0 + ], + [ + 1228.0, + 38.0 + ], + [ + 1231.0, + 44.0 + ], + [ + 1208.0, + 44.0 + ] + ], + "center_px": [ + 1218.25, + 41.0 + ], + "area_px": 135.0 + }, + { + "image_points_px": [ + [ + 1155.0, + 35.0 + ], + [ + 1178.0, + 35.0 + ], + [ + 1180.0, + 41.0 + ], + [ + 1158.0, + 41.0 + ] + ], + "center_px": [ + 1167.75, + 38.0 + ], + "area_px": 135.0 + }, + { + "image_points_px": [ + [ + 754.0, + 51.0 + ], + [ + 757.0, + 45.0 + ], + [ + 779.0, + 47.0 + ], + [ + 776.0, + 53.0 + ] + ], + "center_px": [ + 766.5, + 49.0 + ], + "area_px": 138.0 + }, + { + "image_points_px": [ + [ + 1201.0, + 21.0 + ], + [ + 1223.0, + 21.0 + ], + [ + 1226.0, + 27.0 + ], + [ + 1204.0, + 27.0 + ] + ], + "center_px": [ + 1213.5, + 24.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 195.0, + 367.0 + ], + [ + 201.0, + 360.0 + ], + [ + 220.0, + 363.0 + ], + [ + 215.0, + 370.0 + ] + ], + "center_px": [ + 207.75, + 365.0 + ], + "area_px": 153.0 + }, + { + "image_points_px": [ + [ + 361.0, + 101.0 + ], + [ + 363.0, + 98.0 + ], + [ + 388.0, + 99.0 + ], + [ + 386.0, + 102.0 + ] + ], + "center_px": [ + 374.5, + 100.0 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 777.0, + 62.0 + ], + [ + 780.0, + 55.0 + ], + [ + 801.0, + 58.0 + ], + [ + 799.0, + 64.0 + ] + ], + "center_px": [ + 789.25, + 59.75 + ], + "area_px": 146.0 + }, + { + "image_points_px": [ + [ + 982.0, + 51.0 + ], + [ + 1004.0, + 51.0 + ], + [ + 1005.0, + 58.0 + ], + [ + 983.0, + 57.0 + ] + ], + "center_px": [ + 993.5, + 54.25 + ], + "area_px": 142.5 + }, + { + "image_points_px": [ + [ + 598.0, + 60.0 + ], + [ + 602.0, + 54.0 + ], + [ + 623.0, + 56.0 + ], + [ + 620.0, + 62.0 + ] + ], + "center_px": [ + 610.75, + 58.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 578.0, + 49.0 + ], + [ + 582.0, + 43.0 + ], + [ + 603.0, + 45.0 + ], + [ + 600.0, + 51.0 + ] + ], + "center_px": [ + 590.75, + 47.0 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 838.0, + 12.0 + ], + [ + 840.0, + 7.0 + ], + [ + 862.0, + 8.0 + ], + [ + 860.0, + 15.0 + ] + ], + "center_px": [ + 850.0, + 10.5 + ], + "area_px": 136.0 + }, + { + "image_points_px": [ + [ + 404.0, + 47.0 + ], + [ + 408.0, + 41.0 + ], + [ + 429.0, + 43.0 + ], + [ + 423.0, + 50.0 + ] + ], + "center_px": [ + 416.0, + 45.25 + ], + "area_px": 142.5 + }, + { + "image_points_px": [ + [ + 1229.0, + 31.0 + ], + [ + 1251.0, + 31.0 + ], + [ + 1253.0, + 37.0 + ], + [ + 1231.0, + 37.0 + ] + ], + "center_px": [ + 1241.0, + 34.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 1179.0, + 28.0 + ], + [ + 1201.0, + 28.0 + ], + [ + 1203.0, + 34.0 + ], + [ + 1181.0, + 34.0 + ] + ], + "center_px": [ + 1191.0, + 31.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 1129.0, + 25.0 + ], + [ + 1151.0, + 25.0 + ], + [ + 1153.0, + 31.0 + ], + [ + 1131.0, + 31.0 + ] + ], + "center_px": [ + 1141.0, + 28.0 + ], + "area_px": 132.0 + }, + { + "image_points_px": [ + [ + 482.0, + 43.0 + ], + [ + 486.0, + 37.0 + ], + [ + 507.0, + 39.0 + ], + [ + 503.0, + 45.0 + ] + ], + "center_px": [ + 494.5, + 41.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 129.0, + 361.0 + ], + [ + 135.0, + 354.0 + ], + [ + 154.0, + 357.0 + ], + [ + 147.0, + 364.0 + ] + ], + "center_px": [ + 141.25, + 359.0 + ], + "area_px": 149.0 + }, + { + "image_points_px": [ + [ + 412.0, + 104.0 + ], + [ + 414.0, + 102.0 + ], + [ + 439.0, + 103.0 + ], + [ + 437.0, + 106.0 + ] + ], + "center_px": [ + 425.5, + 103.75 + ], + "area_px": 65.5 + }, + { + "image_points_px": [ + [ + 1006.0, + 9.0 + ], + [ + 1027.0, + 9.0 + ], + [ + 1029.0, + 16.0 + ], + [ + 1007.0, + 15.0 + ] + ], + "center_px": [ + 1017.25, + 12.25 + ], + "area_px": 139.0 + }, + { + "image_points_px": [ + [ + 705.0, + 48.0 + ], + [ + 708.0, + 42.0 + ], + [ + 729.0, + 44.0 + ], + [ + 727.0, + 50.0 + ] + ], + "center_px": [ + 717.25, + 46.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 782.0, + 44.0 + ], + [ + 784.0, + 38.0 + ], + [ + 806.0, + 40.0 + ], + [ + 803.0, + 46.0 + ] + ], + "center_px": [ + 793.75, + 42.0 + ], + "area_px": 134.0 + }, + { + "image_points_px": [ + [ + 1152.0, + 18.0 + ], + [ + 1173.0, + 18.0 + ], + [ + 1176.0, + 24.0 + ], + [ + 1154.0, + 24.0 + ] + ], + "center_px": [ + 1163.75, + 21.0 + ], + "area_px": 129.0 + }, + { + "image_points_px": [ + [ + 1056.0, + 29.0 + ], + [ + 1078.0, + 29.0 + ], + [ + 1079.0, + 35.0 + ], + [ + 1058.0, + 35.0 + ] + ], + "center_px": [ + 1067.75, + 32.0 + ], + "area_px": 129.0 + }, + { + "image_points_px": [ + [ + 1031.0, + 19.0 + ], + [ + 1052.0, + 19.0 + ], + [ + 1054.0, + 25.0 + ], + [ + 1032.0, + 25.0 + ] + ], + "center_px": [ + 1042.25, + 22.0 + ], + "area_px": 129.0 + }, + { + "image_points_px": [ + [ + 760.0, + 33.0 + ], + [ + 763.0, + 27.0 + ], + [ + 784.0, + 30.0 + ], + [ + 780.0, + 36.0 + ] + ], + "center_px": [ + 771.75, + 31.5 + ], + "area_px": 133.5 + }, + { + "image_points_px": [ + [ + 169.0, + 32.0 + ], + [ + 175.0, + 26.0 + ], + [ + 194.0, + 28.0 + ], + [ + 188.0, + 34.0 + ] + ], + "center_px": [ + 181.5, + 30.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 1245.0, + 7.0 + ], + [ + 1265.0, + 7.0 + ], + [ + 1269.0, + 13.0 + ], + [ + 1248.0, + 13.0 + ] + ], + "center_px": [ + 1256.75, + 10.0 + ], + "area_px": 123.0 + }, + { + "image_points_px": [ + [ + 1055.0, + 12.0 + ], + [ + 1075.0, + 12.0 + ], + [ + 1078.0, + 18.0 + ], + [ + 1056.0, + 18.0 + ] + ], + "center_px": [ + 1066.0, + 15.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 1114.0, + 303.0 + ], + [ + 1136.0, + 303.0 + ], + [ + 1138.0, + 308.0 + ], + [ + 1116.0, + 308.0 + ] + ], + "center_px": [ + 1126.0, + 305.5 + ], + "area_px": 110.0 + }, + { + "image_points_px": [ + [ + 1080.0, + 22.0 + ], + [ + 1101.0, + 22.0 + ], + [ + 1103.0, + 28.0 + ], + [ + 1082.0, + 28.0 + ] + ], + "center_px": [ + 1091.5, + 25.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 1224.0, + 14.0 + ], + [ + 1245.0, + 14.0 + ], + [ + 1247.0, + 20.0 + ], + [ + 1226.0, + 20.0 + ] + ], + "center_px": [ + 1235.5, + 17.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 288.0, + 175.0 + ], + [ + 279.0, + 186.0 + ], + [ + 266.0, + 185.0 + ], + [ + 275.0, + 174.0 + ] + ], + "center_px": [ + 277.0, + 180.0 + ], + "area_px": 152.0 + }, + { + "image_points_px": [ + [ + 64.0, + 355.0 + ], + [ + 70.0, + 348.0 + ], + [ + 88.0, + 351.0 + ], + [ + 80.0, + 358.0 + ] + ], + "center_px": [ + 75.5, + 353.0 + ], + "area_px": 140.0 + }, + { + "image_points_px": [ + [ + 691.0, + 20.0 + ], + [ + 694.0, + 15.0 + ], + [ + 715.0, + 17.0 + ], + [ + 711.0, + 23.0 + ] + ], + "center_px": [ + 702.75, + 18.75 + ], + "area_px": 121.5 + }, + { + "image_points_px": [ + [ + 672.0, + 11.0 + ], + [ + 674.0, + 5.0 + ], + [ + 695.0, + 7.0 + ], + [ + 692.0, + 13.0 + ] + ], + "center_px": [ + 683.25, + 9.0 + ], + "area_px": 128.0 + }, + { + "image_points_px": [ + [ + 983.0, + 16.0 + ], + [ + 1004.0, + 16.0 + ], + [ + 1005.0, + 22.0 + ], + [ + 984.0, + 22.0 + ] + ], + "center_px": [ + 994.0, + 19.0 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 791.0, + 9.0 + ], + [ + 794.0, + 4.0 + ], + [ + 814.0, + 6.0 + ], + [ + 812.0, + 12.0 + ] + ], + "center_px": [ + 802.75, + 7.75 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 111.0, + 340.0 + ], + [ + 117.0, + 334.0 + ], + [ + 135.0, + 337.0 + ], + [ + 129.0, + 343.0 + ] + ], + "center_px": [ + 123.0, + 338.5 + ], + "area_px": 126.0 + }, + { + "image_points_px": [ + [ + 712.0, + 30.0 + ], + [ + 715.0, + 24.0 + ], + [ + 735.0, + 27.0 + ], + [ + 733.0, + 32.0 + ] + ], + "center_px": [ + 723.75, + 28.25 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 739.0, + 23.0 + ], + [ + 742.0, + 17.0 + ], + [ + 762.0, + 20.0 + ], + [ + 760.0, + 25.0 + ] + ], + "center_px": [ + 750.75, + 21.25 + ], + "area_px": 119.0 + }, + { + "image_points_px": [ + [ + 612.0, + 458.0 + ], + [ + 613.0, + 455.0 + ], + [ + 635.0, + 453.0 + ], + [ + 637.0, + 455.0 + ] + ], + "center_px": [ + 624.25, + 455.25 + ], + "area_px": 60.0 + }, + { + "image_points_px": [ + [ + 523.0, + 19.0 + ], + [ + 526.0, + 13.0 + ], + [ + 546.0, + 15.0 + ], + [ + 542.0, + 21.0 + ] + ], + "center_px": [ + 534.25, + 17.0 + ], + "area_px": 124.0 + }, + { + "image_points_px": [ + [ + 1197.0, + 5.0 + ], + [ + 1218.0, + 5.0 + ], + [ + 1220.0, + 10.0 + ], + [ + 1199.0, + 10.0 + ] + ], + "center_px": [ + 1208.5, + 7.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 1030.0, + 3.0 + ], + [ + 1051.0, + 3.0 + ], + [ + 1053.0, + 8.0 + ], + [ + 1032.0, + 8.0 + ] + ], + "center_px": [ + 1041.5, + 5.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 505.0, + 9.0 + ], + [ + 510.0, + 3.0 + ], + [ + 528.0, + 5.0 + ], + [ + 525.0, + 11.0 + ] + ], + "center_px": [ + 517.0, + 7.0 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 477.0, + 16.0 + ], + [ + 481.0, + 10.0 + ], + [ + 500.0, + 12.0 + ], + [ + 496.0, + 18.0 + ] + ], + "center_px": [ + 488.5, + 14.0 + ], + "area_px": 122.0 + }, + { + "image_points_px": [ + [ + 765.0, + 16.0 + ], + [ + 768.0, + 11.0 + ], + [ + 788.0, + 13.0 + ], + [ + 786.0, + 18.0 + ] + ], + "center_px": [ + 776.75, + 14.5 + ], + "area_px": 107.5 + }, + { + "image_points_px": [ + [ + 385.0, + 10.0 + ], + [ + 390.0, + 4.0 + ], + [ + 408.0, + 6.0 + ], + [ + 404.0, + 12.0 + ] + ], + "center_px": [ + 396.75, + 8.0 + ], + "area_px": 120.0 + }, + { + "image_points_px": [ + [ + 959.0, + 7.0 + ], + [ + 980.0, + 7.0 + ], + [ + 981.0, + 12.0 + ], + [ + 960.0, + 12.0 + ] + ], + "center_px": [ + 970.0, + 9.5 + ], + "area_px": 105.0 + }, + { + "image_points_px": [ + [ + 1046.0, + 267.0 + ], + [ + 1066.0, + 267.0 + ], + [ + 1068.0, + 271.0 + ], + [ + 1048.0, + 271.0 + ] + ], + "center_px": [ + 1057.0, + 269.0 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 981.0, + 262.0 + ], + [ + 1001.0, + 262.0 + ], + [ + 1003.0, + 266.0 + ], + [ + 983.0, + 266.0 + ] + ], + "center_px": [ + 992.0, + 264.0 + ], + "area_px": 80.0 + }, + { + "image_points_px": [ + [ + 1142.0, + 260.0 + ], + [ + 1162.0, + 260.0 + ], + [ + 1164.0, + 264.0 + ], + [ + 1145.0, + 264.0 + ] + ], + "center_px": [ + 1153.25, + 262.0 + ], + "area_px": 78.0 + }, + { + "image_points_px": [ + [ + 414.0, + 103.0 + ], + [ + 428.0, + 102.0 + ], + [ + 437.0, + 104.0 + ], + [ + 422.0, + 105.0 + ] + ], + "center_px": [ + 425.25, + 103.5 + ], + "area_px": 37.5 + }, + { + "image_points_px": [ + [ + 1075.0, + 227.0 + ], + [ + 1094.0, + 227.0 + ], + [ + 1096.0, + 230.0 + ], + [ + 1077.0, + 230.0 + ] + ], + "center_px": [ + 1085.5, + 228.5 + ], + "area_px": 57.0 + }, + { + "image_points_px": [ + [ + 450.0, + 546.0 + ], + [ + 456.0, + 545.0 + ], + [ + 472.0, + 548.0 + ], + [ + 453.0, + 548.0 + ] + ], + "center_px": [ + 457.75, + 546.75 + ], + "area_px": 36.0 + }, + { + "image_points_px": [ + [ + 339.0, + 141.0 + ], + [ + 331.0, + 152.0 + ], + [ + 322.0, + 151.0 + ], + [ + 330.0, + 141.0 + ] + ], + "center_px": [ + 330.5, + 146.25 + ], + "area_px": 98.5 + }, + { + "image_points_px": [ + [ + 368.0, + 484.0 + ], + [ + 369.0, + 487.0 + ], + [ + 366.0, + 504.0 + ], + [ + 365.0, + 495.0 + ] + ], + "center_px": [ + 367.0, + 492.5 + ], + "area_px": 32.0 + }, + { + "image_points_px": [ + [ + 287.0, + 328.0 + ], + [ + 289.0, + 344.0 + ], + [ + 281.0, + 342.0 + ], + [ + 282.0, + 336.0 + ] + ], + "center_px": [ + 284.75, + 337.5 + ], + "area_px": 73.0 + }, + { + "image_points_px": [ + [ + 1250.0, + 644.0 + ], + [ + 1253.0, + 642.0 + ], + [ + 1269.0, + 645.0 + ], + [ + 1260.0, + 646.0 + ] + ], + "center_px": [ + 1258.0, + 644.25 + ], + "area_px": 34.5 + }, + { + "image_points_px": [ + [ + 1163.0, + 195.0 + ], + [ + 1176.0, + 194.0 + ], + [ + 1182.0, + 196.0 + ], + [ + 1166.0, + 197.0 + ] + ], + "center_px": [ + 1171.75, + 195.5 + ], + "area_px": 33.5 + }, + { + "image_points_px": [ + [ + 1103.0, + 190.0 + ], + [ + 1120.0, + 190.0 + ], + [ + 1121.0, + 192.0 + ], + [ + 1104.0, + 192.0 + ] + ], + "center_px": [ + 1112.0, + 191.0 + ], + "area_px": 34.0 + }, + { + "image_points_px": [ + [ + 583.0, + 217.0 + ], + [ + 597.0, + 216.0 + ], + [ + 601.0, + 219.0 + ], + [ + 587.0, + 220.0 + ] + ], + "center_px": [ + 592.0, + 218.0 + ], + "area_px": 46.0 + } + ] +} \ No newline at end of file diff --git a/pipeline/render_3b_camera_pose.json b/pipeline/render_3b_camera_pose.json new file mode 100644 index 0000000..5ccf3d7 --- /dev/null +++ b/pipeline/render_3b_camera_pose.json @@ -0,0 +1,400 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-29T05:34:16Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3b_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json" + }, + "camera": { + "camera_id": "cam1", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 5, + "used_marker_ids": [ + 208, + 215, + 214, + 211, + 210 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46 + ], + "rms": [ + 14.818157274424525, + 6.6429684472286725, + 3.508293175019171, + 1.9569659577739633, + 1.0760750577807272, + 0.6558111727688115, + 0.5974384941473672, + 0.45776430515731414, + 0.3406747506535104, + 0.21284192970803506, + 0.21284192970803506, + 0.21284192970803506, + 0.21284192970803506, + 0.21284192970803506, + 0.13834869751593928, + 0.13834869751593928, + 0.12196764428961278, + 0.12196764428961278, + 0.12196764428961278, + 0.11109006687857191, + 0.11109006687857191, + 0.11109006687857191, + 0.10513254832847944, + 0.10513254832847944, + 0.10009463133300968, + 0.0972011239152783, + 0.08965747726813587, + 0.07896966206278197, + 0.06848004274985553, + 0.058568387282928645, + 0.04925640249856142, + 0.040730620366500596, + 0.033135104063634416, + 0.02650247419978119, + 0.020790086792429628, + 0.015941755983382246, + 0.012075496055238399, + 0.010697420477957333, + 0.010697420477957333, + 0.010697420477957333, + 0.010249775295046573, + 0.010249775295046573, + 0.010217299105490024, + 0.003080951472807064, + 0.0029219478792723522, + 0.002921843589954249, + 0.0029218434666077736 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125, + 6.25e-05, + 3.125e-05, + 1.5625e-05, + 7.8125e-06, + 3.90625e-06, + 1.953125e-06, + 3.90625e-06, + 7.8125e-06, + 1.5625e-05, + 3.125e-05, + 1.5625e-05, + 3.125e-05, + 1.5625e-05, + 3.125e-05, + 6.25e-05, + 3.125e-05, + 6.25e-05, + 0.000125, + 6.25e-05, + 0.000125, + 6.25e-05, + 3.125e-05, + 1.5625e-05, + 7.8125e-06, + 3.90625e-06, + 1.953125e-06, + 9.765625e-07, + 4.8828125e-07, + 2.44140625e-07, + 1.220703125e-07, + 6.103515625e-08, + 3.0517578125e-08, + 1.52587890625e-08, + 7.62939453125e-09, + 1.52587890625e-08, + 3.0517578125e-08, + 1.52587890625e-08, + 3.0517578125e-08, + 1.52587890625e-08, + 7.62939453125e-09, + 3.814697265625e-09, + 1.9073486328125e-09, + 9.5367431640625e-10 + ] + }, + "residual_rms_px": 7.325988977382018, + "residual_median_px": 5.2610158050715405, + "residual_max_px": 11.95199194038243, + "sigma2_normalized": 2.1342923107320546e-05 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + -0.9725239872932434, + 0.033903129398822784, + -0.23032091557979584 + ], + [ + -0.10051494091749191, + 0.8312227725982666, + 0.5467773079872131 + ], + [ + 0.20998544991016388, + 0.5549046993255615, + -0.8049763441085815 + ] + ], + "translation_m": [ + 180.4925537109375, + -45.28935623168945, + -859.5316162109375 + ], + "rvec_rad": [ + -0.05955419353489003, + 3.226373471557783, + 0.9849571463938018 + ] + }, + "camera_in_world": { + "position_m": [ + 351.47021484375, + 508.4844055175781, + -625.5681762695312 + ], + "position_mm": [ + 351470.21875, + 508484.40625, + -625568.1875 + ], + "orientation_deg": { + "roll": 145.41983032226562, + "pitch": -12.121499395069357, + "yaw": -174.09915161132812 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 0.002350044145762458, + 0.0018448663795067805, + 0.002791262415386132, + 0.044346229182918716, + -0.07916151257588579, + -0.14927480851129382 + ], + [ + 0.0018448663795067872, + 0.0036429204877860334, + -0.001238434463788633, + 0.006197854651266595, + 0.030206644893667412, + -0.35477216802776246 + ], + [ + 0.002791262415386112, + -0.00123843446378866, + 0.015531235537186557, + 0.08030698335197134, + -0.04481294954598946, + 0.2747388184172584 + ], + [ + 0.04434622918291879, + 0.006197854651266368, + 0.08030698335197246, + 5.115947766978903, + -1.7296342108112102, + 11.501531197034321 + ], + [ + -0.07916151257588577, + 0.030206644893667495, + -0.044812949545989626, + -1.7296342108112113, + 17.275134170996235, + 15.481414615323398 + ], + [ + -0.14927480851129452, + -0.3547721680277628, + 0.2747388184172568, + 11.5015311970343, + 15.481414615323407, + 179.23527748073005 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 2.777542050899846, + 3.458179074295007, + 7.14045087126885 + ], + "tvec_std_m": [ + 2.261846097102741, + 4.156336628690731, + 13.387878005148167 + ] + }, + "camera_center_std_m": [ + 52.59102600708334, + 50.66008686135971, + 43.3784726294464 + ], + "camera_center_std_mm": [ + 52591.02600708335, + 50660.08686135971, + 43378.4726294464 + ], + "orientation_std_deg": { + "roll": 4.057851126238033, + "pitch": 3.771174837779904, + "yaw": 1.7875669447691551 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 208, + "observed_center_px": [ + 995.5, + 638.0 + ], + "projected_center_px": [ + 986.5569458007812, + 638.244384765625 + ], + "reprojection_error_px": 8.946392698950438, + "confidence": 0.6072727689079809 + }, + { + "marker_id": 215, + "observed_center_px": [ + 764.5, + 612.5 + ], + "projected_center_px": [ + 776.3766479492188, + 613.8399047851562 + ], + "reprojection_error_px": 11.95199194038243, + "confidence": 0.6168610191628993 + }, + { + "marker_id": 214, + "observed_center_px": [ + 996.0, + 527.75 + ], + "projected_center_px": [ + 999.8966064453125, + 527.873291015625 + ], + "reprojection_error_px": 3.898556459022334, + "confidence": 0.5524643209674667 + }, + { + "marker_id": 211, + "observed_center_px": [ + 783.0, + 506.25 + ], + "projected_center_px": [ + 777.8927612304688, + 504.9873046875 + ], + "reprojection_error_px": 5.2610158050715405, + "confidence": 0.5730650050844824 + }, + { + "marker_id": 210, + "observed_center_px": [ + 312.75, + 470.75 + ], + "projected_center_px": [ + 311.1917419433594, + 470.3533630371094 + ], + "reprojection_error_px": 1.6079455996446261, + "confidence": 0.5452330001368535 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/pipeline/render_3b_two_cam_annotated.jpg b/pipeline/render_3b_two_cam_annotated.jpg new file mode 100644 index 0000000..07b64c4 Binary files /dev/null and b/pipeline/render_3b_two_cam_annotated.jpg differ diff --git a/pipeline/render_3b_two_cam_overlay.png b/pipeline/render_3b_two_cam_overlay.png new file mode 100644 index 0000000..158e8bf Binary files /dev/null and b/pipeline/render_3b_two_cam_overlay.png differ diff --git a/pipeline/render_3c.png b/pipeline/render_3c.png new file mode 100644 index 0000000..fc21972 Binary files /dev/null and b/pipeline/render_3c.png differ diff --git a/pipeline/render_3c_aruco_detection.json b/pipeline/render_3c_aruco_detection.json new file mode 100644 index 0000000..b960b86 --- /dev/null +++ b/pipeline/render_3c_aruco_detection.json @@ -0,0 +1,9495 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-29T05:34:16Z", + "vision_config": { + "MarkerType": "DICT_4X4_250", + "MarkerSize": 0.025 + }, + "camera": { + "camera_id": "cam1", + "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "image": { + "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3c.png", + "image_sha256": "fd6f744cba014cfcc459a4e695fbd1e00497e6f06fb41bd39a0f3a72a525316d", + "width_px": 1280, + "height_px": 720 + }, + "aruco": { + "dictionary": "DICT_4X4_250", + "num_detected_markers": 11, + "num_rejected_candidates": 354 + }, + "detections": [ + { + "observation_id": "e3ebf6de-2232-420e-9cd2-a212da1b5cfe", + "type": "aruco", + "marker_id": 219, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 359.0, + 593.0 + ], + [ + 347.0, + 663.0 + ], + [ + 283.0, + 677.0 + ], + [ + 294.0, + 605.0 + ] + ], + "center_px": [ + 320.75, + 634.5 + ], + "quality": { + "area_px": 4430.0, + "perimeter_px": 275.4683303833008, + "sharpness": { + "laplacian_var": 356.3585822471887 + }, + "contrast": { + "p05": 16.0, + "p95": 96.0, + "dynamic_range": 80.0, + "mean_gray": 43.518468315825146, + "std_gray": 35.311177777019374 + }, + "geometry": { + "distance_to_center_norm": 0.5733814835548401, + "distance_to_border_px": 43.0 + }, + "edge_ratio": 1.111764607922681, + "edge_lengths_px": [ + 71.02112579345703, + 65.51335906982422, + 72.83543395996094, + 66.0984115600586 + ] + }, + "confidence": 0.7735450417034769 + }, + { + "observation_id": "1f6c7860-09d2-4c50-a008-e217462e0c96", + "type": "aruco", + "marker_id": 218, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 601.0, + 549.0 + ], + [ + 588.0, + 610.0 + ], + [ + 537.0, + 621.0 + ], + [ + 550.0, + 558.0 + ] + ], + "center_px": [ + 569.0, + 584.5 + ], + "quality": { + "area_px": 3032.0, + "perimeter_px": 230.6579704284668, + "sharpness": { + "laplacian_var": 369.8845947340162 + }, + "contrast": { + "p05": 17.0, + "p95": 96.0, + "dynamic_range": 79.0, + "mean_gray": 41.04750123701138, + "std_gray": 33.606517827874015 + }, + "geometry": { + "distance_to_center_norm": 0.3206576406955719, + "distance_to_border_px": 99.0 + }, + "edge_ratio": 1.2421265562756294, + "edge_lengths_px": [ + 62.36986541748047, + 52.17279052734375, + 64.32728576660156, + 51.788028717041016 + ] + }, + "confidence": 0.7950075578135153 + }, + { + "observation_id": "dbd1388b-c266-4acd-82ba-6fca6d718b34", + "type": "aruco", + "marker_id": 122, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 375.0, + 473.0 + ], + [ + 417.0, + 500.0 + ], + [ + 357.0, + 508.0 + ], + [ + 316.0, + 480.0 + ] + ], + "center_px": [ + 366.25, + 490.25 + ], + "quality": { + "area_px": 1947.5, + "perimeter_px": 219.52350234985352, + "sharpness": { + "laplacian_var": 1820.573201952319 + }, + "contrast": { + "p05": 21.0, + "p95": 164.0, + "dynamic_range": 143.0, + "mean_gray": 62.39758125472411, + "std_gray": 59.20727821046556 + }, + "geometry": { + "distance_to_center_norm": 0.4128502607345581, + "distance_to_border_px": 212.0 + }, + "edge_ratio": 1.219184047853244, + "edge_lengths_px": [ + 49.92995071411133, + 60.530982971191406, + 49.648765563964844, + 59.41380310058594 + ] + }, + "confidence": 0.8202207056111124 + }, + { + "observation_id": "2e73fbcc-3be3-4e64-af5c-16ba5290c831", + "type": "aruco", + "marker_id": 214, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 1142.0, + 648.0 + ], + [ + 1188.0, + 681.0 + ], + [ + 1153.0, + 709.0 + ], + [ + 1107.0, + 675.0 + ] + ], + "center_px": [ + 1147.5, + 678.25 + ], + "quality": { + "area_px": 2437.5, + "perimeter_px": 202.84005737304688, + "sharpness": { + "laplacian_var": 2538.891247165533 + }, + "contrast": { + "p05": 11.0, + "p95": 163.0, + "dynamic_range": 152.0, + "mean_gray": 85.00507936507937, + "std_gray": 70.6441741354474 + }, + "geometry": { + "distance_to_center_norm": 0.8157837986946106, + "distance_to_border_px": 11.0 + }, + "edge_ratio": 1.2940300653305985, + "edge_lengths_px": [ + 56.61272048950195, + 44.821868896484375, + 57.20139694213867, + 44.204071044921875 + ] + }, + "confidence": 0.1700115058329765 + }, + { + "observation_id": "28bae644-cf36-4a6d-b635-c3e6c64cd52c", + "type": "aruco", + "marker_id": 215, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 854.0, + 603.0 + ], + [ + 892.0, + 634.0 + ], + [ + 852.0, + 661.0 + ], + [ + 814.0, + 628.0 + ] + ], + "center_px": [ + 853.0, + 631.5 + ], + "quality": { + "area_px": 2268.0, + "perimeter_px": 194.79933547973633, + "sharpness": { + "laplacian_var": 751.9339295665985 + }, + "contrast": { + "p05": 5.0, + "p95": 103.0, + "dynamic_range": 98.0, + "mean_gray": 39.20957309184993, + "std_gray": 43.14622163462601 + }, + "geometry": { + "distance_to_center_norm": 0.46994471549987793, + "distance_to_border_px": 59.0 + }, + "edge_ratio": 1.0669709157264826, + "edge_lengths_px": [ + 49.04079818725586, + 48.25971221923828, + 50.32891845703125, + 47.16990661621094 + ] + }, + "confidence": 0.9372326698512834 + }, + { + "observation_id": "5920e35c-5ae1-4e37-9f48-8fd5cad739bc", + "type": "aruco", + "marker_id": 244, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 799.0, + 528.0 + ], + [ + 777.0, + 578.0 + ], + [ + 738.0, + 587.0 + ], + [ + 759.0, + 535.0 + ] + ], + "center_px": [ + 768.25, + 557.0 + ], + "quality": { + "area_px": 1842.5, + "perimeter_px": 191.33917236328125, + "sharpness": { + "laplacian_var": 597.343244010741 + }, + "contrast": { + "p05": 19.0, + "p95": 99.0, + "dynamic_range": 80.0, + "mean_gray": 53.20336269015212, + "std_gray": 35.608744190600525 + }, + "geometry": { + "distance_to_center_norm": 0.3201245367527008, + "distance_to_border_px": 133.0 + }, + "edge_ratio": 1.4011319907375992, + "edge_lengths_px": [ + 54.625999450683594, + 40.024993896484375, + 56.080299377441406, + 40.607879638671875 + ] + }, + "confidence": 0.7137086345973509 + }, + { + "observation_id": "a1acb6ff-712a-4307-a287-06156a3bfdbd", + "type": "aruco", + "marker_id": 229, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 586.0, + 313.0 + ], + [ + 621.0, + 340.0 + ], + [ + 576.0, + 359.0 + ], + [ + 542.0, + 332.0 + ] + ], + "center_px": [ + 581.25, + 336.0 + ], + "quality": { + "area_px": 1857.0, + "perimeter_px": 184.3943862915039, + "sharpness": { + "laplacian_var": 2183.6939650916856 + }, + "contrast": { + "p05": 15.0, + "p95": 176.0, + "dynamic_range": 161.0, + "mean_gray": 60.5708692247455, + "std_gray": 67.5250632800523 + }, + "geometry": { + "distance_to_center_norm": 0.08642636239528656, + "distance_to_border_px": 313.0 + }, + "edge_ratio": 1.1250699606498253, + "edge_lengths_px": [ + 44.204071044921875, + 48.84669876098633, + 43.416587829589844, + 47.92702865600586 + ] + }, + "confidence": 0.8888336147757544 + }, + { + "observation_id": "82319b49-4eec-48d1-baaa-37b81936bca1", + "type": "aruco", + "marker_id": 211, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 974.0, + 523.0 + ], + [ + 1013.0, + 552.0 + ], + [ + 977.0, + 576.0 + ], + [ + 938.0, + 547.0 + ] + ], + "center_px": [ + 975.5, + 549.5 + ], + "quality": { + "area_px": 1980.0, + "perimeter_px": 183.7340545654297, + "sharpness": { + "laplacian_var": 1839.7391439207745 + }, + "contrast": { + "p05": 9.0, + "p95": 151.0, + "dynamic_range": 142.0, + "mean_gray": 62.66211085801063, + "std_gray": 63.572525018516664 + }, + "geometry": { + "distance_to_center_norm": 0.5247411727905273, + "distance_to_border_px": 144.0 + }, + "edge_ratio": 1.1232773447983633, + "edge_lengths_px": [ + 48.60041046142578, + 43.26661682128906, + 48.60041046142578, + 43.26661682128906 + ] + }, + "confidence": 0.8902520865668376 + }, + { + "observation_id": "2e94951c-63c8-4dd0-ad23-b0136eaada51", + "type": "aruco", + "marker_id": 246, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 739.0, + 419.0 + ], + [ + 780.0, + 450.0 + ], + [ + 739.0, + 455.0 + ], + [ + 700.0, + 424.0 + ] + ], + "center_px": [ + 739.5, + 437.0 + ], + "quality": { + "area_px": 1440.0, + "perimeter_px": 181.84302520751953, + "sharpness": { + "laplacian_var": 1891.7515802967193 + }, + "contrast": { + "p05": 13.0, + "p95": 150.0, + "dynamic_range": 137.0, + "mean_gray": 52.235649546827794, + "std_gray": 55.77617529121964 + }, + "geometry": { + "distance_to_center_norm": 0.17133860290050507, + "distance_to_border_px": 265.0 + }, + "edge_ratio": 1.3072591118483667, + "edge_lengths_px": [ + 51.400390625, + 41.30375289916992, + 49.81967544555664, + 39.31920623779297 + ] + }, + "confidence": 0.7343609168978227 + }, + { + "observation_id": "e1305f93-8804-4b3f-b8be-59e0df24d437", + "type": "aruco", + "marker_id": 247, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 681.0, + 375.0 + ], + [ + 719.0, + 403.0 + ], + [ + 679.0, + 408.0 + ], + [ + 640.0, + 378.0 + ] + ], + "center_px": [ + 679.75, + 391.0 + ], + "quality": { + "area_px": 1328.5, + "perimeter_px": 177.8262481689453, + "sharpness": { + "laplacian_var": 2654.5082140349805 + }, + "contrast": { + "p05": 18.0, + "p95": 152.0, + "dynamic_range": 134.0, + "mean_gray": 81.6353591160221, + "std_gray": 58.10955236189456 + }, + "geometry": { + "distance_to_center_norm": 0.06864876300096512, + "distance_to_border_px": 312.0 + }, + "edge_ratio": 1.2205926133693537, + "edge_lengths_px": [ + 47.20169448852539, + 40.31128692626953, + 49.20365905761719, + 41.1096076965332 + ] + }, + "confidence": 0.72560382306579 + }, + { + "observation_id": "24637519-be83-4e03-b7b4-f83ee5f5da62", + "type": "aruco", + "marker_id": 198, + "marker_size_m": 0.025, + "image_points_px": [ + [ + 738.0, + 249.0 + ], + [ + 773.0, + 272.0 + ], + [ + 732.0, + 289.0 + ], + [ + 698.0, + 265.0 + ] + ], + "center_px": [ + 735.25, + 268.75 + ], + "quality": { + "area_px": 1521.0, + "perimeter_px": 170.9640884399414, + "sharpness": { + "laplacian_var": 3331.2812905293595 + }, + "contrast": { + "p05": 16.0, + "p95": 174.0, + "dynamic_range": 158.0, + "mean_gray": 78.81853281853282, + "std_gray": 69.19238947154334 + }, + "geometry": { + "distance_to_center_norm": 0.17963410913944244, + "distance_to_border_px": 249.0 + }, + "edge_ratio": 1.06649579774086, + "edge_lengths_px": [ + 41.88078308105469, + 44.384681701660156, + 41.617305755615234, + 43.08131790161133 + ] + }, + "confidence": 0.9376502018275956 + } + ], + "rejected_candidates": [ + { + "image_points_px": [ + [ + 438.0, + 647.0 + ], + [ + 377.0, + 685.0 + ], + [ + 329.0, + 688.0 + ], + [ + 371.0, + 662.0 + ] + ], + "center_px": [ + 378.75, + 670.5 + ], + "area_px": 1376.5 + }, + { + "image_points_px": [ + [ + 884.0, + 414.0 + ], + [ + 906.0, + 421.0 + ], + [ + 971.0, + 473.0 + ], + [ + 958.0, + 473.0 + ] + ], + "center_px": [ + 929.75, + 445.25 + ], + "area_px": 728.0 + }, + { + "image_points_px": [ + [ + 581.0, + 619.0 + ], + [ + 543.0, + 640.0 + ], + [ + 503.0, + 649.0 + ], + [ + 531.0, + 629.0 + ] + ], + "center_px": [ + 539.5, + 634.25 + ], + "area_px": 609.0 + }, + { + "image_points_px": [ + [ + 755.0, + 668.0 + ], + [ + 784.0, + 693.0 + ], + [ + 752.0, + 715.0 + ], + [ + 723.0, + 688.0 + ] + ], + "center_px": [ + 753.5, + 691.0 + ], + "area_px": 1441.0 + }, + { + "image_points_px": [ + [ + 571.0, + 654.0 + ], + [ + 597.0, + 679.0 + ], + [ + 563.0, + 700.0 + ], + [ + 537.0, + 674.0 + ] + ], + "center_px": [ + 567.0, + 676.75 + ], + "area_px": 1400.0 + }, + { + "image_points_px": [ + [ + 693.0, + 663.0 + ], + [ + 721.0, + 688.0 + ], + [ + 688.0, + 709.0 + ], + [ + 661.0, + 683.0 + ] + ], + "center_px": [ + 690.75, + 685.75 + ], + "area_px": 1392.5 + }, + { + "image_points_px": [ + [ + 633.0, + 659.0 + ], + [ + 659.0, + 683.0 + ], + [ + 624.0, + 704.0 + ], + [ + 599.0, + 679.0 + ] + ], + "center_px": [ + 628.75, + 681.25 + ], + "area_px": 1368.0 + }, + { + "image_points_px": [ + [ + 510.0, + 649.0 + ], + [ + 535.0, + 674.0 + ], + [ + 500.0, + 695.0 + ], + [ + 476.0, + 669.0 + ] + ], + "center_px": [ + 505.25, + 671.75 + ], + "area_px": 1382.0 + }, + { + "image_points_px": [ + [ + 698.0, + 617.0 + ], + [ + 725.0, + 641.0 + ], + [ + 693.0, + 661.0 + ], + [ + 666.0, + 637.0 + ] + ], + "center_px": [ + 695.5, + 639.0 + ], + "area_px": 1308.0 + }, + { + "image_points_px": [ + [ + 771.0, + 292.0 + ], + [ + 722.0, + 315.0 + ], + [ + 703.0, + 317.0 + ], + [ + 723.0, + 305.0 + ] + ], + "center_px": [ + 729.75, + 307.25 + ], + "area_px": 327.5 + }, + { + "image_points_px": [ + [ + 645.0, + 619.0 + ], + [ + 664.0, + 636.0 + ], + [ + 633.0, + 656.0 + ], + [ + 606.0, + 632.0 + ] + ], + "center_px": [ + 637.0, + 635.75 + ], + "area_px": 1097.0 + }, + { + "image_points_px": [ + [ + 857.0, + 305.0 + ], + [ + 796.0, + 334.0 + ], + [ + 806.0, + 323.0 + ], + [ + 847.0, + 304.0 + ] + ], + "center_px": [ + 826.5, + 316.5 + ], + "area_px": 306.0 + }, + { + "image_points_px": [ + [ + 821.0, + 539.0 + ], + [ + 846.0, + 563.0 + ], + [ + 818.0, + 579.0 + ], + [ + 792.0, + 557.0 + ] + ], + "center_px": [ + 819.25, + 559.5 + ], + "area_px": 1089.0 + }, + { + "image_points_px": [ + [ + 41.0, + 485.0 + ], + [ + 57.0, + 505.0 + ], + [ + 21.0, + 522.0 + ], + [ + 5.0, + 501.0 + ] + ], + "center_px": [ + 31.0, + 503.25 + ], + "area_px": 1002.0 + }, + { + "image_points_px": [ + [ + 1182.0, + 466.0 + ], + [ + 1206.0, + 450.0 + ], + [ + 1236.0, + 470.0 + ], + [ + 1213.0, + 486.0 + ] + ], + "center_px": [ + 1209.25, + 468.0 + ], + "area_px": 958.0 + }, + { + "image_points_px": [ + [ + 1126.0, + 462.0 + ], + [ + 1150.0, + 446.0 + ], + [ + 1180.0, + 466.0 + ], + [ + 1157.0, + 482.0 + ] + ], + "center_px": [ + 1153.25, + 464.0 + ], + "area_px": 958.0 + }, + { + "image_points_px": [ + [ + 113.0, + 451.0 + ], + [ + 130.0, + 470.0 + ], + [ + 95.0, + 487.0 + ], + [ + 78.0, + 467.0 + ] + ], + "center_px": [ + 104.0, + 468.75 + ], + "area_px": 963.0 + }, + { + "image_points_px": [ + [ + 60.0, + 447.0 + ], + [ + 76.0, + 467.0 + ], + [ + 41.0, + 483.0 + ], + [ + 25.0, + 463.0 + ] + ], + "center_px": [ + 50.5, + 465.0 + ], + "area_px": 956.0 + }, + { + "image_points_px": [ + [ + 1191.0, + 504.0 + ], + [ + 1214.0, + 488.0 + ], + [ + 1244.0, + 508.0 + ], + [ + 1220.0, + 524.0 + ] + ], + "center_px": [ + 1217.25, + 506.0 + ], + "area_px": 942.0 + }, + { + "image_points_px": [ + [ + 166.0, + 455.0 + ], + [ + 184.0, + 474.0 + ], + [ + 149.0, + 490.0 + ], + [ + 132.0, + 471.0 + ] + ], + "center_px": [ + 157.75, + 472.5 + ], + "area_px": 935.5 + }, + { + "image_points_px": [ + [ + 238.0, + 478.0 + ], + [ + 201.0, + 491.0 + ], + [ + 186.0, + 474.0 + ], + [ + 219.0, + 458.0 + ] + ], + "center_px": [ + 211.0, + 475.25 + ], + "area_px": 894.0 + }, + { + "image_points_px": [ + [ + 1175.0, + 429.0 + ], + [ + 1198.0, + 414.0 + ], + [ + 1228.0, + 433.0 + ], + [ + 1205.0, + 448.0 + ] + ], + "center_px": [ + 1201.5, + 431.0 + ], + "area_px": 887.0 + }, + { + "image_points_px": [ + [ + 339.0, + 429.0 + ], + [ + 358.0, + 448.0 + ], + [ + 327.0, + 464.0 + ], + [ + 307.0, + 445.0 + ] + ], + "center_px": [ + 332.75, + 446.5 + ], + "area_px": 910.5 + }, + { + "image_points_px": [ + [ + 287.0, + 426.0 + ], + [ + 305.0, + 444.0 + ], + [ + 273.0, + 460.0 + ], + [ + 254.0, + 441.0 + ] + ], + "center_px": [ + 279.75, + 442.75 + ], + "area_px": 888.0 + }, + { + "image_points_px": [ + [ + 1066.0, + 422.0 + ], + [ + 1090.0, + 407.0 + ], + [ + 1118.0, + 426.0 + ], + [ + 1095.0, + 441.0 + ] + ], + "center_px": [ + 1092.25, + 424.0 + ], + "area_px": 874.0 + }, + { + "image_points_px": [ + [ + 473.0, + 668.0 + ], + [ + 439.0, + 690.0 + ], + [ + 420.0, + 671.0 + ], + [ + 461.0, + 660.0 + ] + ], + "center_px": [ + 448.25, + 672.25 + ], + "area_px": 762.0 + }, + { + "image_points_px": [ + [ + 130.0, + 415.0 + ], + [ + 147.0, + 433.0 + ], + [ + 113.0, + 449.0 + ], + [ + 97.0, + 430.0 + ] + ], + "center_px": [ + 121.75, + 431.75 + ], + "area_px": 875.5 + }, + { + "image_points_px": [ + [ + 234.0, + 422.0 + ], + [ + 252.0, + 441.0 + ], + [ + 219.0, + 456.0 + ], + [ + 202.0, + 437.0 + ] + ], + "center_px": [ + 226.75, + 439.0 + ], + "area_px": 880.0 + }, + { + "image_points_px": [ + [ + 1121.0, + 425.0 + ], + [ + 1145.0, + 411.0 + ], + [ + 1173.0, + 429.0 + ], + [ + 1149.0, + 444.0 + ] + ], + "center_px": [ + 1147.0, + 427.25 + ], + "area_px": 850.0 + }, + { + "image_points_px": [ + [ + 455.0, + 401.0 + ], + [ + 475.0, + 419.0 + ], + [ + 445.0, + 434.0 + ], + [ + 424.0, + 416.0 + ] + ], + "center_px": [ + 449.75, + 417.5 + ], + "area_px": 856.5 + }, + { + "image_points_px": [ + [ + 199.0, + 437.0 + ], + [ + 165.0, + 452.0 + ], + [ + 149.0, + 434.0 + ], + [ + 182.0, + 419.0 + ] + ], + "center_px": [ + 173.75, + 435.5 + ], + "area_px": 850.5 + }, + { + "image_points_px": [ + [ + 403.0, + 398.0 + ], + [ + 422.0, + 416.0 + ], + [ + 392.0, + 431.0 + ], + [ + 372.0, + 412.0 + ] + ], + "center_px": [ + 397.25, + 414.25 + ], + "area_px": 847.0 + }, + { + "image_points_px": [ + [ + 351.0, + 394.0 + ], + [ + 370.0, + 412.0 + ], + [ + 339.0, + 427.0 + ], + [ + 320.0, + 409.0 + ] + ], + "center_px": [ + 345.0, + 410.5 + ], + "area_px": 843.0 + }, + { + "image_points_px": [ + [ + 79.0, + 412.0 + ], + [ + 94.0, + 430.0 + ], + [ + 60.0, + 445.0 + ], + [ + 45.0, + 427.0 + ] + ], + "center_px": [ + 69.5, + 428.5 + ], + "area_px": 837.0 + }, + { + "image_points_px": [ + [ + 299.0, + 391.0 + ], + [ + 318.0, + 408.0 + ], + [ + 287.0, + 424.0 + ], + [ + 268.0, + 406.0 + ] + ], + "center_px": [ + 293.0, + 407.25 + ], + "area_px": 837.0 + }, + { + "image_points_px": [ + [ + 1115.0, + 391.0 + ], + [ + 1139.0, + 377.0 + ], + [ + 1166.0, + 394.0 + ], + [ + 1144.0, + 409.0 + ] + ], + "center_px": [ + 1141.0, + 392.75 + ], + "area_px": 808.5 + }, + { + "image_points_px": [ + [ + 1062.0, + 387.0 + ], + [ + 1085.0, + 373.0 + ], + [ + 1113.0, + 391.0 + ], + [ + 1089.0, + 405.0 + ] + ], + "center_px": [ + 1087.25, + 389.0 + ], + "area_px": 808.0 + }, + { + "image_points_px": [ + [ + 1222.0, + 397.0 + ], + [ + 1243.0, + 383.0 + ], + [ + 1273.0, + 401.0 + ], + [ + 1250.0, + 415.0 + ] + ], + "center_px": [ + 1247.0, + 399.0 + ], + "area_px": 802.0 + }, + { + "image_points_px": [ + [ + 1168.0, + 394.0 + ], + [ + 1191.0, + 380.0 + ], + [ + 1219.0, + 398.0 + ], + [ + 1197.0, + 412.0 + ] + ], + "center_px": [ + 1193.75, + 396.0 + ], + "area_px": 804.0 + }, + { + "image_points_px": [ + [ + 197.0, + 384.0 + ], + [ + 214.0, + 402.0 + ], + [ + 182.0, + 417.0 + ], + [ + 165.0, + 399.0 + ] + ], + "center_px": [ + 189.5, + 400.5 + ], + "area_px": 831.0 + }, + { + "image_points_px": [ + [ + 97.0, + 378.0 + ], + [ + 112.0, + 395.0 + ], + [ + 79.0, + 410.0 + ], + [ + 63.0, + 392.0 + ] + ], + "center_px": [ + 87.75, + 393.75 + ], + "area_px": 811.0 + }, + { + "image_points_px": [ + [ + 163.0, + 398.0 + ], + [ + 130.0, + 413.0 + ], + [ + 114.0, + 395.0 + ], + [ + 147.0, + 381.0 + ] + ], + "center_px": [ + 138.5, + 396.75 + ], + "area_px": 809.5 + }, + { + "image_points_px": [ + [ + 266.0, + 405.0 + ], + [ + 234.0, + 420.0 + ], + [ + 217.0, + 402.0 + ], + [ + 249.0, + 388.0 + ] + ], + "center_px": [ + 241.5, + 403.75 + ], + "area_px": 806.5 + }, + { + "image_points_px": [ + [ + 229.0, + 368.0 + ], + [ + 197.0, + 382.0 + ], + [ + 180.0, + 365.0 + ], + [ + 212.0, + 351.0 + ] + ], + "center_px": [ + 204.5, + 366.5 + ], + "area_px": 782.0 + }, + { + "image_points_px": [ + [ + 411.0, + 452.0 + ], + [ + 374.0, + 461.0 + ], + [ + 361.0, + 448.0 + ], + [ + 392.0, + 433.0 + ] + ], + "center_px": [ + 384.5, + 448.5 + ], + "area_px": 736.0 + }, + { + "image_points_px": [ + [ + 1110.0, + 357.0 + ], + [ + 1132.0, + 344.0 + ], + [ + 1160.0, + 361.0 + ], + [ + 1137.0, + 375.0 + ] + ], + "center_px": [ + 1134.75, + 359.25 + ], + "area_px": 765.0 + }, + { + "image_points_px": [ + [ + 1214.0, + 364.0 + ], + [ + 1235.0, + 350.0 + ], + [ + 1264.0, + 368.0 + ], + [ + 1242.0, + 381.0 + ] + ], + "center_px": [ + 1238.75, + 365.75 + ], + "area_px": 761.0 + }, + { + "image_points_px": [ + [ + 1162.0, + 360.0 + ], + [ + 1183.0, + 347.0 + ], + [ + 1212.0, + 364.0 + ], + [ + 1190.0, + 378.0 + ] + ], + "center_px": [ + 1186.75, + 362.25 + ], + "area_px": 761.0 + }, + { + "image_points_px": [ + [ + 61.0, + 391.0 + ], + [ + 27.0, + 406.0 + ], + [ + 13.0, + 388.0 + ], + [ + 46.0, + 375.0 + ] + ], + "center_px": [ + 36.75, + 390.0 + ], + "area_px": 772.5 + }, + { + "image_points_px": [ + [ + 484.0, + 384.0 + ], + [ + 454.0, + 399.0 + ], + [ + 435.0, + 381.0 + ], + [ + 464.0, + 368.0 + ] + ], + "center_px": [ + 459.25, + 383.0 + ], + "area_px": 774.5 + }, + { + "image_points_px": [ + [ + 1010.0, + 384.0 + ], + [ + 1035.0, + 371.0 + ], + [ + 1060.0, + 388.0 + ], + [ + 1035.0, + 401.0 + ] + ], + "center_px": [ + 1035.0, + 386.0 + ], + "area_px": 750.0 + }, + { + "image_points_px": [ + [ + 1006.0, + 351.0 + ], + [ + 1030.0, + 338.0 + ], + [ + 1056.0, + 354.0 + ], + [ + 1032.0, + 368.0 + ] + ], + "center_px": [ + 1031.0, + 352.75 + ], + "area_px": 747.0 + }, + { + "image_points_px": [ + [ + 330.0, + 374.0 + ], + [ + 300.0, + 389.0 + ], + [ + 282.0, + 371.0 + ], + [ + 312.0, + 358.0 + ] + ], + "center_px": [ + 306.0, + 373.0 + ], + "area_px": 762.0 + }, + { + "image_points_px": [ + [ + 279.0, + 371.0 + ], + [ + 248.0, + 385.0 + ], + [ + 231.0, + 368.0 + ], + [ + 262.0, + 355.0 + ] + ], + "center_px": [ + 255.0, + 369.75 + ], + "area_px": 741.0 + }, + { + "image_points_px": [ + [ + 1058.0, + 354.0 + ], + [ + 1081.0, + 341.0 + ], + [ + 1107.0, + 358.0 + ], + [ + 1084.0, + 371.0 + ] + ], + "center_px": [ + 1082.5, + 356.0 + ], + "area_px": 729.0 + }, + { + "image_points_px": [ + [ + 955.0, + 348.0 + ], + [ + 979.0, + 335.0 + ], + [ + 1004.0, + 351.0 + ], + [ + 981.0, + 365.0 + ] + ], + "center_px": [ + 979.75, + 349.75 + ], + "area_px": 732.0 + }, + { + "image_points_px": [ + [ + 342.0, + 342.0 + ], + [ + 312.0, + 356.0 + ], + [ + 294.0, + 339.0 + ], + [ + 324.0, + 326.0 + ] + ], + "center_px": [ + 318.0, + 340.75 + ], + "area_px": 738.0 + }, + { + "image_points_px": [ + [ + 392.0, + 345.0 + ], + [ + 362.0, + 359.0 + ], + [ + 344.0, + 342.0 + ], + [ + 373.0, + 329.0 + ] + ], + "center_px": [ + 367.75, + 343.75 + ], + "area_px": 736.5 + }, + { + "image_points_px": [ + [ + 178.0, + 364.0 + ], + [ + 147.0, + 379.0 + ], + [ + 131.0, + 362.0 + ], + [ + 162.0, + 348.0 + ] + ], + "center_px": [ + 154.5, + 363.25 + ], + "area_px": 743.5 + }, + { + "image_points_px": [ + [ + 79.0, + 358.0 + ], + [ + 46.0, + 372.0 + ], + [ + 32.0, + 355.0 + ], + [ + 64.0, + 342.0 + ] + ], + "center_px": [ + 55.25, + 356.75 + ], + "area_px": 732.0 + }, + { + "image_points_px": [ + [ + 442.0, + 348.0 + ], + [ + 413.0, + 362.0 + ], + [ + 394.0, + 345.0 + ], + [ + 423.0, + 332.0 + ] + ], + "center_px": [ + 418.0, + 346.75 + ], + "area_px": 735.0 + }, + { + "image_points_px": [ + [ + 128.0, + 362.0 + ], + [ + 96.0, + 375.0 + ], + [ + 81.0, + 359.0 + ], + [ + 113.0, + 345.0 + ] + ], + "center_px": [ + 104.5, + 360.25 + ], + "area_px": 730.5 + }, + { + "image_points_px": [ + [ + 492.0, + 351.0 + ], + [ + 463.0, + 365.0 + ], + [ + 444.0, + 349.0 + ], + [ + 472.0, + 335.0 + ] + ], + "center_px": [ + 467.75, + 350.0 + ], + "area_px": 729.0 + }, + { + "image_points_px": [ + [ + 1003.0, + 320.0 + ], + [ + 1026.0, + 307.0 + ], + [ + 1052.0, + 323.0 + ], + [ + 1029.0, + 336.0 + ] + ], + "center_px": [ + 1027.5, + 321.5 + ], + "area_px": 706.0 + }, + { + "image_points_px": [ + [ + 1104.0, + 326.0 + ], + [ + 1127.0, + 313.0 + ], + [ + 1153.0, + 329.0 + ], + [ + 1131.0, + 342.0 + ] + ], + "center_px": [ + 1128.75, + 327.5 + ], + "area_px": 704.5 + }, + { + "image_points_px": [ + [ + 292.0, + 339.0 + ], + [ + 262.0, + 353.0 + ], + [ + 245.0, + 336.0 + ], + [ + 275.0, + 323.0 + ] + ], + "center_px": [ + 268.5, + 337.75 + ], + "area_px": 724.5 + }, + { + "image_points_px": [ + [ + 727.0, + 641.0 + ], + [ + 744.0, + 631.0 + ], + [ + 771.0, + 656.0 + ], + [ + 755.0, + 666.0 + ] + ], + "center_px": [ + 749.25, + 648.5 + ], + "area_px": 687.5 + }, + { + "image_points_px": [ + [ + 96.0, + 326.0 + ], + [ + 64.0, + 340.0 + ], + [ + 49.0, + 324.0 + ], + [ + 81.0, + 311.0 + ] + ], + "center_px": [ + 72.5, + 325.25 + ], + "area_px": 698.5 + }, + { + "image_points_px": [ + [ + 243.0, + 336.0 + ], + [ + 212.0, + 349.0 + ], + [ + 196.0, + 333.0 + ], + [ + 226.0, + 320.0 + ] + ], + "center_px": [ + 219.25, + 334.5 + ], + "area_px": 702.5 + }, + { + "image_points_px": [ + [ + 1054.0, + 322.0 + ], + [ + 1077.0, + 310.0 + ], + [ + 1102.0, + 326.0 + ], + [ + 1080.0, + 339.0 + ] + ], + "center_px": [ + 1078.25, + 324.25 + ], + "area_px": 690.0 + }, + { + "image_points_px": [ + [ + 353.0, + 311.0 + ], + [ + 324.0, + 324.0 + ], + [ + 306.0, + 308.0 + ], + [ + 335.0, + 295.0 + ] + ], + "center_px": [ + 329.5, + 309.5 + ], + "area_px": 698.0 + }, + { + "image_points_px": [ + [ + 402.0, + 314.0 + ], + [ + 373.0, + 327.0 + ], + [ + 355.0, + 311.0 + ], + [ + 383.0, + 298.0 + ] + ], + "center_px": [ + 378.25, + 312.5 + ], + "area_px": 696.5 + }, + { + "image_points_px": [ + [ + 500.0, + 320.0 + ], + [ + 472.0, + 333.0 + ], + [ + 453.0, + 317.0 + ], + [ + 481.0, + 304.0 + ] + ], + "center_px": [ + 476.5, + 318.5 + ], + "area_px": 695.0 + }, + { + "image_points_px": [ + [ + 451.0, + 317.0 + ], + [ + 423.0, + 330.0 + ], + [ + 404.0, + 314.0 + ], + [ + 432.0, + 301.0 + ] + ], + "center_px": [ + 427.5, + 315.5 + ], + "area_px": 695.0 + }, + { + "image_points_px": [ + [ + 953.0, + 316.0 + ], + [ + 976.0, + 304.0 + ], + [ + 1001.0, + 320.0 + ], + [ + 977.0, + 332.0 + ] + ], + "center_px": [ + 976.75, + 318.0 + ], + "area_px": 670.0 + }, + { + "image_points_px": [ + [ + 431.0, + 381.0 + ], + [ + 402.0, + 395.0 + ], + [ + 385.0, + 378.0 + ], + [ + 413.0, + 365.0 + ] + ], + "center_px": [ + 407.75, + 379.75 + ], + "area_px": 706.5 + }, + { + "image_points_px": [ + [ + 1149.0, + 298.0 + ], + [ + 1171.0, + 286.0 + ], + [ + 1197.0, + 301.0 + ], + [ + 1177.0, + 314.0 + ] + ], + "center_px": [ + 1173.5, + 299.75 + ], + "area_px": 663.0 + }, + { + "image_points_px": [ + [ + 1099.0, + 295.0 + ], + [ + 1121.0, + 283.0 + ], + [ + 1147.0, + 298.0 + ], + [ + 1126.0, + 311.0 + ] + ], + "center_px": [ + 1123.25, + 296.75 + ], + "area_px": 664.5 + }, + { + "image_points_px": [ + [ + 1000.0, + 289.0 + ], + [ + 1022.0, + 277.0 + ], + [ + 1048.0, + 292.0 + ], + [ + 1026.0, + 305.0 + ] + ], + "center_px": [ + 1024.0, + 290.75 + ], + "area_px": 666.0 + }, + { + "image_points_px": [ + [ + 144.0, + 330.0 + ], + [ + 113.0, + 343.0 + ], + [ + 98.0, + 327.0 + ], + [ + 129.0, + 314.0 + ] + ], + "center_px": [ + 121.0, + 328.5 + ], + "area_px": 691.0 + }, + { + "image_points_px": [ + [ + 193.0, + 332.0 + ], + [ + 162.0, + 346.0 + ], + [ + 147.0, + 330.0 + ], + [ + 178.0, + 317.0 + ] + ], + "center_px": [ + 170.0, + 331.25 + ], + "area_px": 683.0 + }, + { + "image_points_px": [ + [ + 362.0, + 361.0 + ], + [ + 379.0, + 378.0 + ], + [ + 351.0, + 392.0 + ], + [ + 334.0, + 375.0 + ] + ], + "center_px": [ + 356.5, + 376.5 + ], + "area_px": 714.0 + }, + { + "image_points_px": [ + [ + 304.0, + 308.0 + ], + [ + 275.0, + 321.0 + ], + [ + 258.0, + 305.0 + ], + [ + 287.0, + 292.0 + ] + ], + "center_px": [ + 281.0, + 306.5 + ], + "area_px": 685.0 + }, + { + "image_points_px": [ + [ + 256.0, + 305.0 + ], + [ + 226.0, + 318.0 + ], + [ + 210.0, + 302.0 + ], + [ + 240.0, + 290.0 + ] + ], + "center_px": [ + 233.0, + 303.75 + ], + "area_px": 665.0 + }, + { + "image_points_px": [ + [ + 1050.0, + 292.0 + ], + [ + 1072.0, + 280.0 + ], + [ + 1097.0, + 295.0 + ], + [ + 1075.0, + 308.0 + ] + ], + "center_px": [ + 1073.5, + 293.75 + ], + "area_px": 653.5 + }, + { + "image_points_px": [ + [ + 65.0, + 293.0 + ], + [ + 32.0, + 305.0 + ], + [ + 19.0, + 290.0 + ], + [ + 50.0, + 278.0 + ] + ], + "center_px": [ + 41.5, + 291.5 + ], + "area_px": 648.0 + }, + { + "image_points_px": [ + [ + 160.0, + 299.0 + ], + [ + 129.0, + 311.0 + ], + [ + 114.0, + 296.0 + ], + [ + 145.0, + 284.0 + ] + ], + "center_px": [ + 137.0, + 297.5 + ], + "area_px": 645.0 + }, + { + "image_points_px": [ + [ + 1208.0, + 332.0 + ], + [ + 1228.0, + 319.0 + ], + [ + 1254.0, + 335.0 + ], + [ + 1235.0, + 348.0 + ] + ], + "center_px": [ + 1231.25, + 333.5 + ], + "area_px": 656.5 + }, + { + "image_points_px": [ + [ + 1157.0, + 328.0 + ], + [ + 1177.0, + 316.0 + ], + [ + 1203.0, + 332.0 + ], + [ + 1183.0, + 345.0 + ] + ], + "center_px": [ + 1180.0, + 330.25 + ], + "area_px": 655.0 + }, + { + "image_points_px": [ + [ + 208.0, + 302.0 + ], + [ + 177.0, + 314.0 + ], + [ + 162.0, + 299.0 + ], + [ + 192.0, + 287.0 + ] + ], + "center_px": [ + 184.75, + 300.5 + ], + "area_px": 643.5 + }, + { + "image_points_px": [ + [ + 112.0, + 296.0 + ], + [ + 81.0, + 309.0 + ], + [ + 67.0, + 293.0 + ], + [ + 98.0, + 281.0 + ] + ], + "center_px": [ + 89.5, + 294.75 + ], + "area_px": 655.5 + }, + { + "image_points_px": [ + [ + 1192.0, + 272.0 + ], + [ + 1213.0, + 260.0 + ], + [ + 1239.0, + 275.0 + ], + [ + 1220.0, + 287.0 + ] + ], + "center_px": [ + 1216.0, + 273.5 + ], + "area_px": 624.0 + }, + { + "image_points_px": [ + [ + 1143.0, + 269.0 + ], + [ + 1164.0, + 257.0 + ], + [ + 1190.0, + 272.0 + ], + [ + 1170.0, + 284.0 + ] + ], + "center_px": [ + 1166.75, + 270.5 + ], + "area_px": 625.5 + }, + { + "image_points_px": [ + [ + 222.0, + 272.0 + ], + [ + 192.0, + 285.0 + ], + [ + 176.0, + 270.0 + ], + [ + 206.0, + 258.0 + ] + ], + "center_px": [ + 199.0, + 271.25 + ], + "area_px": 635.0 + }, + { + "image_points_px": [ + [ + 412.0, + 284.0 + ], + [ + 383.0, + 296.0 + ], + [ + 366.0, + 281.0 + ], + [ + 394.0, + 269.0 + ] + ], + "center_px": [ + 388.75, + 282.5 + ], + "area_px": 637.5 + }, + { + "image_points_px": [ + [ + 364.0, + 281.0 + ], + [ + 335.0, + 293.0 + ], + [ + 318.0, + 278.0 + ], + [ + 346.0, + 266.0 + ] + ], + "center_px": [ + 340.75, + 279.5 + ], + "area_px": 637.5 + }, + { + "image_points_px": [ + [ + 508.0, + 290.0 + ], + [ + 480.0, + 302.0 + ], + [ + 462.0, + 287.0 + ], + [ + 489.0, + 275.0 + ] + ], + "center_px": [ + 484.75, + 288.5 + ], + "area_px": 634.5 + }, + { + "image_points_px": [ + [ + 556.0, + 293.0 + ], + [ + 529.0, + 305.0 + ], + [ + 510.0, + 290.0 + ], + [ + 537.0, + 278.0 + ] + ], + "center_px": [ + 533.0, + 291.5 + ], + "area_px": 633.0 + }, + { + "image_points_px": [ + [ + 316.0, + 278.0 + ], + [ + 287.0, + 290.0 + ], + [ + 271.0, + 275.0 + ], + [ + 299.0, + 263.0 + ] + ], + "center_px": [ + 293.25, + 276.5 + ], + "area_px": 625.5 + }, + { + "image_points_px": [ + [ + 459.0, + 287.0 + ], + [ + 432.0, + 299.0 + ], + [ + 414.0, + 284.0 + ], + [ + 442.0, + 272.0 + ] + ], + "center_px": [ + 436.75, + 285.5 + ], + "area_px": 622.5 + }, + { + "image_points_px": [ + [ + 950.0, + 257.0 + ], + [ + 972.0, + 246.0 + ], + [ + 996.0, + 260.0 + ], + [ + 973.0, + 272.0 + ] + ], + "center_px": [ + 972.75, + 258.75 + ], + "area_px": 596.5 + }, + { + "image_points_px": [ + [ + 998.0, + 260.0 + ], + [ + 1020.0, + 249.0 + ], + [ + 1044.0, + 263.0 + ], + [ + 1022.0, + 275.0 + ] + ], + "center_px": [ + 1021.0, + 261.75 + ], + "area_px": 595.0 + }, + { + "image_points_px": [ + [ + 1186.0, + 243.0 + ], + [ + 1206.0, + 232.0 + ], + [ + 1232.0, + 246.0 + ], + [ + 1212.0, + 258.0 + ] + ], + "center_px": [ + 1209.0, + 244.75 + ], + "area_px": 589.0 + }, + { + "image_points_px": [ + [ + 562.0, + 264.0 + ], + [ + 536.0, + 276.0 + ], + [ + 517.0, + 261.0 + ], + [ + 543.0, + 249.0 + ] + ], + "center_px": [ + 539.5, + 262.5 + ], + "area_px": 618.0 + }, + { + "image_points_px": [ + [ + 515.0, + 261.0 + ], + [ + 489.0, + 273.0 + ], + [ + 470.0, + 258.0 + ], + [ + 496.0, + 246.0 + ] + ], + "center_px": [ + 492.5, + 259.5 + ], + "area_px": 618.0 + }, + { + "image_points_px": [ + [ + 81.0, + 264.0 + ], + [ + 51.0, + 276.0 + ], + [ + 37.0, + 261.0 + ], + [ + 67.0, + 249.0 + ] + ], + "center_px": [ + 59.0, + 262.5 + ], + "area_px": 618.0 + }, + { + "image_points_px": [ + [ + 269.0, + 275.0 + ], + [ + 239.0, + 287.0 + ], + [ + 224.0, + 273.0 + ], + [ + 253.0, + 261.0 + ] + ], + "center_px": [ + 246.25, + 274.0 + ], + "area_px": 599.0 + }, + { + "image_points_px": [ + [ + 127.0, + 267.0 + ], + [ + 98.0, + 279.0 + ], + [ + 83.0, + 264.0 + ], + [ + 113.0, + 252.0 + ] + ], + "center_px": [ + 105.25, + 265.5 + ], + "area_px": 616.5 + }, + { + "image_points_px": [ + [ + 174.0, + 270.0 + ], + [ + 145.0, + 282.0 + ], + [ + 130.0, + 267.0 + ], + [ + 159.0, + 255.0 + ] + ], + "center_px": [ + 152.0, + 268.5 + ], + "area_px": 615.0 + }, + { + "image_points_px": [ + [ + 421.0, + 255.0 + ], + [ + 393.0, + 267.0 + ], + [ + 376.0, + 252.0 + ], + [ + 403.0, + 241.0 + ] + ], + "center_px": [ + 398.25, + 253.75 + ], + "area_px": 600.0 + }, + { + "image_points_px": [ + [ + 374.0, + 252.0 + ], + [ + 346.0, + 264.0 + ], + [ + 329.0, + 250.0 + ], + [ + 357.0, + 238.0 + ] + ], + "center_px": [ + 351.5, + 251.0 + ], + "area_px": 596.0 + }, + { + "image_points_px": [ + [ + 1201.0, + 301.0 + ], + [ + 1220.0, + 289.0 + ], + [ + 1246.0, + 304.0 + ], + [ + 1226.0, + 316.0 + ] + ], + "center_px": [ + 1223.25, + 302.5 + ], + "area_px": 598.5 + }, + { + "image_points_px": [ + [ + 468.0, + 258.0 + ], + [ + 441.0, + 270.0 + ], + [ + 423.0, + 255.0 + ], + [ + 450.0, + 244.0 + ] + ], + "center_px": [ + 445.5, + 256.75 + ], + "area_px": 598.5 + }, + { + "image_points_px": [ + [ + 1042.0, + 235.0 + ], + [ + 1064.0, + 224.0 + ], + [ + 1088.0, + 238.0 + ], + [ + 1066.0, + 249.0 + ] + ], + "center_px": [ + 1065.0, + 236.5 + ], + "area_px": 572.0 + }, + { + "image_points_px": [ + [ + 1090.0, + 238.0 + ], + [ + 1111.0, + 227.0 + ], + [ + 1136.0, + 241.0 + ], + [ + 1115.0, + 252.0 + ] + ], + "center_px": [ + 1113.0, + 239.5 + ], + "area_px": 569.0 + }, + { + "image_points_px": [ + [ + 1179.0, + 216.0 + ], + [ + 1199.0, + 205.0 + ], + [ + 1225.0, + 219.0 + ], + [ + 1205.0, + 230.0 + ] + ], + "center_px": [ + 1202.0, + 217.5 + ], + "area_px": 566.0 + }, + { + "image_points_px": [ + [ + 610.0, + 266.0 + ], + [ + 584.0, + 278.0 + ], + [ + 565.0, + 263.0 + ], + [ + 591.0, + 252.0 + ] + ], + "center_px": [ + 587.5, + 264.75 + ], + "area_px": 595.5 + }, + { + "image_points_px": [ + [ + 1138.0, + 241.0 + ], + [ + 1158.0, + 229.0 + ], + [ + 1183.0, + 244.0 + ], + [ + 1164.0, + 255.0 + ] + ], + "center_px": [ + 1160.75, + 242.25 + ], + "area_px": 576.0 + }, + { + "image_points_px": [ + [ + 97.0, + 236.0 + ], + [ + 67.0, + 247.0 + ], + [ + 53.0, + 234.0 + ], + [ + 83.0, + 222.0 + ] + ], + "center_px": [ + 75.0, + 234.75 + ], + "area_px": 566.0 + }, + { + "image_points_px": [ + [ + 995.0, + 232.0 + ], + [ + 1018.0, + 222.0 + ], + [ + 1040.0, + 236.0 + ], + [ + 1019.0, + 247.0 + ] + ], + "center_px": [ + 1018.0, + 234.25 + ], + "area_px": 560.5 + }, + { + "image_points_px": [ + [ + 1227.0, + 219.0 + ], + [ + 1246.0, + 208.0 + ], + [ + 1272.0, + 222.0 + ], + [ + 1253.0, + 233.0 + ] + ], + "center_px": [ + 1249.5, + 220.5 + ], + "area_px": 552.0 + }, + { + "image_points_px": [ + [ + 188.0, + 241.0 + ], + [ + 159.0, + 253.0 + ], + [ + 144.0, + 239.0 + ], + [ + 174.0, + 228.0 + ] + ], + "center_px": [ + 166.25, + 240.25 + ], + "area_px": 565.0 + }, + { + "image_points_px": [ + [ + 476.0, + 230.0 + ], + [ + 450.0, + 242.0 + ], + [ + 432.0, + 228.0 + ], + [ + 458.0, + 216.0 + ] + ], + "center_px": [ + 454.0, + 229.0 + ], + "area_px": 580.0 + }, + { + "image_points_px": [ + [ + 281.0, + 247.0 + ], + [ + 252.0, + 258.0 + ], + [ + 237.0, + 244.0 + ], + [ + 265.0, + 233.0 + ] + ], + "center_px": [ + 258.75, + 245.5 + ], + "area_px": 569.5 + }, + { + "image_points_px": [ + [ + 954.0, + 285.0 + ], + [ + 975.0, + 275.0 + ], + [ + 998.0, + 290.0 + ], + [ + 974.0, + 301.0 + ] + ], + "center_px": [ + 975.25, + 287.75 + ], + "area_px": 574.5 + }, + { + "image_points_px": [ + [ + 327.0, + 250.0 + ], + [ + 299.0, + 261.0 + ], + [ + 283.0, + 247.0 + ], + [ + 311.0, + 236.0 + ] + ], + "center_px": [ + 305.0, + 248.5 + ], + "area_px": 568.0 + }, + { + "image_points_px": [ + [ + 615.0, + 238.0 + ], + [ + 590.0, + 250.0 + ], + [ + 571.0, + 236.0 + ], + [ + 596.0, + 224.0 + ] + ], + "center_px": [ + 593.0, + 237.0 + ], + "area_px": 578.0 + }, + { + "image_points_px": [ + [ + 384.0, + 225.0 + ], + [ + 356.0, + 236.0 + ], + [ + 340.0, + 222.0 + ], + [ + 367.0, + 211.0 + ] + ], + "center_px": [ + 361.75, + 223.5 + ], + "area_px": 566.5 + }, + { + "image_points_px": [ + [ + 234.0, + 244.0 + ], + [ + 206.0, + 256.0 + ], + [ + 191.0, + 241.0 + ], + [ + 219.0, + 230.0 + ] + ], + "center_px": [ + 212.5, + 242.75 + ], + "area_px": 578.5 + }, + { + "image_points_px": [ + [ + 522.0, + 233.0 + ], + [ + 496.0, + 244.0 + ], + [ + 478.0, + 230.0 + ], + [ + 504.0, + 219.0 + ] + ], + "center_px": [ + 500.0, + 231.5 + ], + "area_px": 562.0 + }, + { + "image_points_px": [ + [ + 992.0, + 206.0 + ], + [ + 1013.0, + 195.0 + ], + [ + 1037.0, + 208.0 + ], + [ + 1015.0, + 219.0 + ] + ], + "center_px": [ + 1014.25, + 207.0 + ], + "area_px": 538.0 + }, + { + "image_points_px": [ + [ + 430.0, + 227.0 + ], + [ + 404.0, + 239.0 + ], + [ + 386.0, + 225.0 + ], + [ + 413.0, + 214.0 + ] + ], + "center_px": [ + 408.25, + 226.25 + ], + "area_px": 559.0 + }, + { + "image_points_px": [ + [ + 568.0, + 236.0 + ], + [ + 543.0, + 247.0 + ], + [ + 524.0, + 233.0 + ], + [ + 550.0, + 222.0 + ] + ], + "center_px": [ + 546.25, + 234.5 + ], + "area_px": 560.5 + }, + { + "image_points_px": [ + [ + 51.0, + 233.0 + ], + [ + 21.0, + 245.0 + ], + [ + 8.0, + 231.0 + ], + [ + 38.0, + 220.0 + ] + ], + "center_px": [ + 29.5, + 232.25 + ], + "area_px": 554.5 + }, + { + "image_points_px": [ + [ + 142.0, + 239.0 + ], + [ + 113.0, + 250.0 + ], + [ + 99.0, + 236.0 + ], + [ + 128.0, + 225.0 + ] + ], + "center_px": [ + 120.5, + 237.5 + ], + "area_px": 560.0 + }, + { + "image_points_px": [ + [ + 1173.0, + 190.0 + ], + [ + 1194.0, + 180.0 + ], + [ + 1218.0, + 193.0 + ], + [ + 1197.0, + 203.0 + ] + ], + "center_px": [ + 1195.5, + 191.5 + ], + "area_px": 513.0 + }, + { + "image_points_px": [ + [ + 292.0, + 220.0 + ], + [ + 265.0, + 231.0 + ], + [ + 249.0, + 217.0 + ], + [ + 277.0, + 206.0 + ] + ], + "center_px": [ + 270.75, + 218.5 + ], + "area_px": 555.5 + }, + { + "image_points_px": [ + [ + 284.0, + 473.0 + ], + [ + 246.0, + 485.0 + ], + [ + 240.0, + 479.0 + ], + [ + 272.0, + 462.0 + ] + ], + "center_px": [ + 260.5, + 474.75 + ], + "area_px": 428.0 + }, + { + "image_points_px": [ + [ + 1048.0, + 263.0 + ], + [ + 1068.0, + 252.0 + ], + [ + 1091.0, + 266.0 + ], + [ + 1071.0, + 278.0 + ] + ], + "center_px": [ + 1069.5, + 264.75 + ], + "area_px": 554.5 + }, + { + "image_points_px": [ + [ + 112.0, + 209.0 + ], + [ + 83.0, + 220.0 + ], + [ + 69.0, + 207.0 + ], + [ + 99.0, + 196.0 + ] + ], + "center_px": [ + 90.75, + 208.0 + ], + "area_px": 532.0 + }, + { + "image_points_px": [ + [ + 1133.0, + 213.0 + ], + [ + 1153.0, + 203.0 + ], + [ + 1177.0, + 217.0 + ], + [ + 1157.0, + 227.0 + ] + ], + "center_px": [ + 1155.0, + 215.0 + ], + "area_px": 520.0 + }, + { + "image_points_px": [ + [ + 1220.0, + 192.0 + ], + [ + 1238.0, + 182.0 + ], + [ + 1264.0, + 195.0 + ], + [ + 1245.0, + 206.0 + ] + ], + "center_px": [ + 1241.75, + 193.75 + ], + "area_px": 517.5 + }, + { + "image_points_px": [ + [ + 247.0, + 217.0 + ], + [ + 219.0, + 228.0 + ], + [ + 204.0, + 214.0 + ], + [ + 232.0, + 204.0 + ] + ], + "center_px": [ + 225.5, + 215.75 + ], + "area_px": 535.5 + }, + { + "image_points_px": [ + [ + 202.0, + 214.0 + ], + [ + 173.0, + 225.0 + ], + [ + 159.0, + 212.0 + ], + [ + 187.0, + 201.0 + ] + ], + "center_px": [ + 180.25, + 213.0 + ], + "area_px": 530.0 + }, + { + "image_points_px": [ + [ + 67.0, + 206.0 + ], + [ + 38.0, + 218.0 + ], + [ + 25.0, + 204.0 + ], + [ + 54.0, + 193.0 + ] + ], + "center_px": [ + 46.0, + 205.25 + ], + "area_px": 541.0 + }, + { + "image_points_px": [ + [ + 338.0, + 222.0 + ], + [ + 311.0, + 233.0 + ], + [ + 295.0, + 220.0 + ], + [ + 322.0, + 209.0 + ] + ], + "center_px": [ + 316.5, + 221.0 + ], + "area_px": 527.0 + }, + { + "image_points_px": [ + [ + 439.0, + 201.0 + ], + [ + 413.0, + 212.0 + ], + [ + 396.0, + 198.0 + ], + [ + 422.0, + 188.0 + ] + ], + "center_px": [ + 417.5, + 199.75 + ], + "area_px": 529.5 + }, + { + "image_points_px": [ + [ + 1213.0, + 167.0 + ], + [ + 1231.0, + 157.0 + ], + [ + 1257.0, + 170.0 + ], + [ + 1237.0, + 180.0 + ] + ], + "center_px": [ + 1234.5, + 168.5 + ], + "area_px": 497.0 + }, + { + "image_points_px": [ + [ + 529.0, + 206.0 + ], + [ + 503.0, + 217.0 + ], + [ + 486.0, + 204.0 + ], + [ + 512.0, + 193.0 + ] + ], + "center_px": [ + 507.5, + 205.0 + ], + "area_px": 525.0 + }, + { + "image_points_px": [ + [ + 574.0, + 209.0 + ], + [ + 550.0, + 220.0 + ], + [ + 531.0, + 206.0 + ], + [ + 557.0, + 196.0 + ] + ], + "center_px": [ + 553.0, + 207.75 + ], + "area_px": 526.5 + }, + { + "image_points_px": [ + [ + 620.0, + 211.0 + ], + [ + 595.0, + 222.0 + ], + [ + 577.0, + 209.0 + ], + [ + 602.0, + 198.0 + ] + ], + "center_px": [ + 598.5, + 210.0 + ], + "area_px": 523.0 + }, + { + "image_points_px": [ + [ + 156.0, + 212.0 + ], + [ + 128.0, + 223.0 + ], + [ + 114.0, + 209.0 + ], + [ + 143.0, + 199.0 + ] + ], + "center_px": [ + 135.25, + 210.75 + ], + "area_px": 526.5 + }, + { + "image_points_px": [ + [ + 393.0, + 198.0 + ], + [ + 367.0, + 209.0 + ], + [ + 350.0, + 196.0 + ], + [ + 378.0, + 186.0 + ] + ], + "center_px": [ + 372.0, + 197.25 + ], + "area_px": 505.5 + }, + { + "image_points_px": [ + [ + 1128.0, + 187.0 + ], + [ + 1146.0, + 177.0 + ], + [ + 1171.0, + 190.0 + ], + [ + 1152.0, + 201.0 + ] + ], + "center_px": [ + 1149.25, + 188.75 + ], + "area_px": 507.0 + }, + { + "image_points_px": [ + [ + 348.0, + 196.0 + ], + [ + 322.0, + 207.0 + ], + [ + 306.0, + 193.0 + ], + [ + 333.0, + 183.0 + ] + ], + "center_px": [ + 327.25, + 194.75 + ], + "area_px": 520.5 + }, + { + "image_points_px": [ + [ + 536.0, + 180.0 + ], + [ + 511.0, + 191.0 + ], + [ + 493.0, + 178.0 + ], + [ + 518.0, + 168.0 + ] + ], + "center_px": [ + 514.5, + 179.25 + ], + "area_px": 501.5 + }, + { + "image_points_px": [ + [ + 215.0, + 188.0 + ], + [ + 188.0, + 199.0 + ], + [ + 173.0, + 186.0 + ], + [ + 200.0, + 175.0 + ] + ], + "center_px": [ + 194.0, + 187.0 + ], + "area_px": 516.0 + }, + { + "image_points_px": [ + [ + 625.0, + 185.0 + ], + [ + 601.0, + 196.0 + ], + [ + 582.0, + 183.0 + ], + [ + 607.0, + 173.0 + ] + ], + "center_px": [ + 603.75, + 184.25 + ], + "area_px": 500.5 + }, + { + "image_points_px": [ + [ + 303.0, + 193.0 + ], + [ + 277.0, + 204.0 + ], + [ + 261.0, + 191.0 + ], + [ + 288.0, + 180.0 + ] + ], + "center_px": [ + 282.25, + 192.0 + ], + "area_px": 515.0 + }, + { + "image_points_px": [ + [ + 483.0, + 204.0 + ], + [ + 457.0, + 214.0 + ], + [ + 441.0, + 201.0 + ], + [ + 466.0, + 190.0 + ] + ], + "center_px": [ + 461.75, + 202.25 + ], + "area_px": 517.5 + }, + { + "image_points_px": [ + [ + 990.0, + 180.0 + ], + [ + 1011.0, + 170.0 + ], + [ + 1033.0, + 183.0 + ], + [ + 1012.0, + 193.0 + ] + ], + "center_px": [ + 1011.5, + 181.5 + ], + "area_px": 493.0 + }, + { + "image_points_px": [ + [ + 127.0, + 183.0 + ], + [ + 99.0, + 194.0 + ], + [ + 85.0, + 181.0 + ], + [ + 114.0, + 171.0 + ] + ], + "center_px": [ + 106.25, + 182.25 + ], + "area_px": 498.0 + }, + { + "image_points_px": [ + [ + 1077.0, + 160.0 + ], + [ + 1097.0, + 150.0 + ], + [ + 1120.0, + 163.0 + ], + [ + 1101.0, + 173.0 + ] + ], + "center_px": [ + 1098.75, + 161.5 + ], + "area_px": 488.5 + }, + { + "image_points_px": [ + [ + 259.0, + 191.0 + ], + [ + 231.0, + 201.0 + ], + [ + 217.0, + 188.0 + ], + [ + 244.0, + 178.0 + ] + ], + "center_px": [ + 237.75, + 189.5 + ], + "area_px": 502.5 + }, + { + "image_points_px": [ + [ + 1040.0, + 209.0 + ], + [ + 1060.0, + 198.0 + ], + [ + 1082.0, + 211.0 + ], + [ + 1063.0, + 222.0 + ] + ], + "center_px": [ + 1061.25, + 210.0 + ], + "area_px": 501.0 + }, + { + "image_points_px": [ + [ + 403.0, + 173.0 + ], + [ + 376.0, + 183.0 + ], + [ + 361.0, + 171.0 + ], + [ + 386.0, + 160.0 + ] + ], + "center_px": [ + 381.5, + 171.75 + ], + "area_px": 493.0 + }, + { + "image_points_px": [ + [ + 1032.0, + 158.0 + ], + [ + 1053.0, + 148.0 + ], + [ + 1075.0, + 160.0 + ], + [ + 1055.0, + 170.0 + ] + ], + "center_px": [ + 1053.75, + 159.0 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 580.0, + 183.0 + ], + [ + 555.0, + 193.0 + ], + [ + 538.0, + 180.0 + ], + [ + 562.0, + 170.0 + ] + ], + "center_px": [ + 558.75, + 181.5 + ], + "area_px": 493.5 + }, + { + "image_points_px": [ + [ + 170.0, + 186.0 + ], + [ + 142.0, + 196.0 + ], + [ + 129.0, + 183.0 + ], + [ + 157.0, + 173.0 + ] + ], + "center_px": [ + 149.5, + 184.5 + ], + "area_px": 494.0 + }, + { + "image_points_px": [ + [ + 82.0, + 181.0 + ], + [ + 54.0, + 191.0 + ], + [ + 41.0, + 179.0 + ], + [ + 70.0, + 168.0 + ] + ], + "center_px": [ + 61.75, + 179.75 + ], + "area_px": 487.5 + }, + { + "image_points_px": [ + [ + 315.0, + 168.0 + ], + [ + 288.0, + 178.0 + ], + [ + 273.0, + 166.0 + ], + [ + 300.0, + 156.0 + ] + ], + "center_px": [ + 294.0, + 167.0 + ], + "area_px": 474.0 + }, + { + "image_points_px": [ + [ + 1206.0, + 143.0 + ], + [ + 1226.0, + 134.0 + ], + [ + 1249.0, + 146.0 + ], + [ + 1230.0, + 155.0 + ] + ], + "center_px": [ + 1227.75, + 144.5 + ], + "area_px": 445.5 + }, + { + "image_points_px": [ + [ + 141.0, + 158.0 + ], + [ + 113.0, + 169.0 + ], + [ + 100.0, + 156.0 + ], + [ + 127.0, + 146.0 + ] + ], + "center_px": [ + 120.25, + 157.25 + ], + "area_px": 485.5 + }, + { + "image_points_px": [ + [ + 271.0, + 166.0 + ], + [ + 244.0, + 176.0 + ], + [ + 230.0, + 163.0 + ], + [ + 256.0, + 153.0 + ] + ], + "center_px": [ + 250.25, + 164.5 + ], + "area_px": 489.5 + }, + { + "image_points_px": [ + [ + 491.0, + 178.0 + ], + [ + 465.0, + 188.0 + ], + [ + 449.0, + 176.0 + ], + [ + 474.0, + 166.0 + ] + ], + "center_px": [ + 469.75, + 177.0 + ], + "area_px": 471.0 + }, + { + "image_points_px": [ + [ + 542.0, + 156.0 + ], + [ + 518.0, + 166.0 + ], + [ + 500.0, + 153.0 + ], + [ + 525.0, + 144.0 + ] + ], + "center_px": [ + 521.25, + 154.75 + ], + "area_px": 472.5 + }, + { + "image_points_px": [ + [ + 455.0, + 151.0 + ], + [ + 430.0, + 161.0 + ], + [ + 413.0, + 149.0 + ], + [ + 438.0, + 139.0 + ] + ], + "center_px": [ + 434.0, + 150.0 + ], + "area_px": 470.0 + }, + { + "image_points_px": [ + [ + 358.0, + 171.0 + ], + [ + 332.0, + 181.0 + ], + [ + 317.0, + 168.0 + ], + [ + 343.0, + 158.0 + ] + ], + "center_px": [ + 337.5, + 169.5 + ], + "area_px": 488.0 + }, + { + "image_points_px": [ + [ + 630.0, + 160.0 + ], + [ + 605.0, + 170.0 + ], + [ + 588.0, + 158.0 + ], + [ + 611.0, + 148.0 + ] + ], + "center_px": [ + 608.5, + 159.0 + ], + "area_px": 468.0 + }, + { + "image_points_px": [ + [ + 586.0, + 158.0 + ], + [ + 562.0, + 168.0 + ], + [ + 544.0, + 156.0 + ], + [ + 568.0, + 146.0 + ] + ], + "center_px": [ + 565.0, + 157.0 + ], + "area_px": 468.0 + }, + { + "image_points_px": [ + [ + 446.0, + 176.0 + ], + [ + 421.0, + 186.0 + ], + [ + 405.0, + 173.0 + ], + [ + 430.0, + 163.0 + ] + ], + "center_px": [ + 425.5, + 174.5 + ], + "area_px": 485.0 + }, + { + "image_points_px": [ + [ + 988.0, + 155.0 + ], + [ + 1009.0, + 146.0 + ], + [ + 1030.0, + 158.0 + ], + [ + 1010.0, + 168.0 + ] + ], + "center_px": [ + 1009.25, + 156.75 + ], + "area_px": 460.5 + }, + { + "image_points_px": [ + [ + 1162.0, + 141.0 + ], + [ + 1180.0, + 131.0 + ], + [ + 1204.0, + 144.0 + ], + [ + 1185.0, + 153.0 + ] + ], + "center_px": [ + 1182.75, + 142.25 + ], + "area_px": 454.5 + }, + { + "image_points_px": [ + [ + 98.0, + 156.0 + ], + [ + 70.0, + 166.0 + ], + [ + 57.0, + 154.0 + ], + [ + 85.0, + 144.0 + ] + ], + "center_px": [ + 77.5, + 155.0 + ], + "area_px": 466.0 + }, + { + "image_points_px": [ + [ + 1118.0, + 139.0 + ], + [ + 1137.0, + 129.0 + ], + [ + 1160.0, + 141.0 + ], + [ + 1141.0, + 151.0 + ] + ], + "center_px": [ + 1139.0, + 140.0 + ], + "area_px": 458.0 + }, + { + "image_points_px": [ + [ + 227.0, + 163.0 + ], + [ + 200.0, + 173.0 + ], + [ + 186.0, + 161.0 + ], + [ + 213.0, + 151.0 + ] + ], + "center_px": [ + 206.5, + 162.0 + ], + "area_px": 464.0 + }, + { + "image_points_px": [ + [ + 184.0, + 161.0 + ], + [ + 157.0, + 171.0 + ], + [ + 143.0, + 159.0 + ], + [ + 170.0, + 149.0 + ] + ], + "center_px": [ + 163.5, + 160.0 + ], + "area_px": 464.0 + }, + { + "image_points_px": [ + [ + 240.0, + 139.0 + ], + [ + 213.0, + 149.0 + ], + [ + 199.0, + 137.0 + ], + [ + 225.0, + 127.0 + ] + ], + "center_px": [ + 219.25, + 138.0 + ], + "area_px": 463.0 + }, + { + "image_points_px": [ + [ + 1087.0, + 211.0 + ], + [ + 1107.0, + 201.0 + ], + [ + 1128.0, + 214.0 + ], + [ + 1109.0, + 224.0 + ] + ], + "center_px": [ + 1107.75, + 212.5 + ], + "area_px": 468.5 + }, + { + "image_points_px": [ + [ + 368.0, + 146.0 + ], + [ + 342.0, + 156.0 + ], + [ + 327.0, + 144.0 + ], + [ + 352.0, + 134.0 + ] + ], + "center_px": [ + 347.25, + 145.0 + ], + "area_px": 461.0 + }, + { + "image_points_px": [ + [ + 325.0, + 144.0 + ], + [ + 300.0, + 154.0 + ], + [ + 284.0, + 142.0 + ], + [ + 310.0, + 132.0 + ] + ], + "center_px": [ + 304.75, + 143.0 + ], + "area_px": 461.0 + }, + { + "image_points_px": [ + [ + 498.0, + 153.0 + ], + [ + 473.0, + 163.0 + ], + [ + 457.0, + 151.0 + ], + [ + 481.0, + 141.0 + ] + ], + "center_px": [ + 477.25, + 152.0 + ], + "area_px": 459.0 + }, + { + "image_points_px": [ + [ + 55.0, + 153.0 + ], + [ + 27.0, + 164.0 + ], + [ + 15.0, + 151.0 + ], + [ + 43.0, + 142.0 + ] + ], + "center_px": [ + 35.0, + 152.5 + ], + "area_px": 456.0 + }, + { + "image_points_px": [ + [ + 411.0, + 149.0 + ], + [ + 385.0, + 158.0 + ], + [ + 370.0, + 146.0 + ], + [ + 396.0, + 137.0 + ] + ], + "center_px": [ + 390.5, + 147.5 + ], + "area_px": 447.0 + }, + { + "image_points_px": [ + [ + 1034.0, + 404.0 + ], + [ + 1071.0, + 429.0 + ], + [ + 1050.0, + 423.0 + ], + [ + 1035.0, + 412.0 + ] + ], + "center_px": [ + 1047.5, + 417.0 + ], + "area_px": 206.0 + }, + { + "image_points_px": [ + [ + 1200.0, + 120.0 + ], + [ + 1219.0, + 111.0 + ], + [ + 1242.0, + 122.0 + ], + [ + 1222.0, + 131.0 + ] + ], + "center_px": [ + 1220.75, + 121.0 + ], + "area_px": 417.0 + }, + { + "image_points_px": [ + [ + 112.0, + 132.0 + ], + [ + 85.0, + 142.0 + ], + [ + 72.0, + 130.0 + ], + [ + 99.0, + 120.0 + ] + ], + "center_px": [ + 92.0, + 131.0 + ], + "area_px": 454.0 + }, + { + "image_points_px": [ + [ + 548.0, + 132.0 + ], + [ + 523.0, + 141.0 + ], + [ + 507.0, + 130.0 + ], + [ + 531.0, + 120.0 + ] + ], + "center_px": [ + 527.25, + 130.75 + ], + "area_px": 438.5 + }, + { + "image_points_px": [ + [ + 591.0, + 134.0 + ], + [ + 567.0, + 144.0 + ], + [ + 550.0, + 132.0 + ], + [ + 574.0, + 123.0 + ] + ], + "center_px": [ + 570.5, + 133.25 + ], + "area_px": 437.5 + }, + { + "image_points_px": [ + [ + 593.0, + 134.0 + ], + [ + 616.0, + 125.0 + ], + [ + 634.0, + 137.0 + ], + [ + 611.0, + 146.0 + ] + ], + "center_px": [ + 613.5, + 135.5 + ], + "area_px": 438.0 + }, + { + "image_points_px": [ + [ + 1083.0, + 185.0 + ], + [ + 1101.0, + 175.0 + ], + [ + 1123.0, + 188.0 + ], + [ + 1105.0, + 198.0 + ] + ], + "center_px": [ + 1103.0, + 186.5 + ], + "area_px": 454.0 + }, + { + "image_points_px": [ + [ + 420.0, + 125.0 + ], + [ + 394.0, + 134.0 + ], + [ + 379.0, + 123.0 + ], + [ + 405.0, + 114.0 + ] + ], + "center_px": [ + 399.5, + 124.0 + ], + "area_px": 421.0 + }, + { + "image_points_px": [ + [ + 1074.0, + 136.0 + ], + [ + 1093.0, + 127.0 + ], + [ + 1115.0, + 139.0 + ], + [ + 1095.0, + 148.0 + ] + ], + "center_px": [ + 1094.25, + 137.5 + ], + "area_px": 427.5 + }, + { + "image_points_px": [ + [ + 1070.0, + 113.0 + ], + [ + 1088.0, + 104.0 + ], + [ + 1111.0, + 115.0 + ], + [ + 1092.0, + 125.0 + ] + ], + "center_px": [ + 1090.25, + 114.25 + ], + "area_px": 426.5 + }, + { + "image_points_px": [ + [ + 1113.0, + 115.0 + ], + [ + 1131.0, + 106.0 + ], + [ + 1154.0, + 118.0 + ], + [ + 1136.0, + 127.0 + ] + ], + "center_px": [ + 1133.5, + 116.5 + ], + "area_px": 423.0 + }, + { + "image_points_px": [ + [ + 197.0, + 137.0 + ], + [ + 169.0, + 146.0 + ], + [ + 157.0, + 135.0 + ], + [ + 183.0, + 125.0 + ] + ], + "center_px": [ + 176.5, + 135.75 + ], + "area_px": 434.0 + }, + { + "image_points_px": [ + [ + 154.0, + 134.0 + ], + [ + 127.0, + 144.0 + ], + [ + 114.0, + 132.0 + ], + [ + 141.0, + 123.0 + ] + ], + "center_px": [ + 134.0, + 133.25 + ], + "area_px": 434.0 + }, + { + "image_points_px": [ + [ + 282.0, + 141.0 + ], + [ + 256.0, + 151.0 + ], + [ + 242.0, + 139.0 + ], + [ + 268.0, + 130.0 + ] + ], + "center_px": [ + 262.0, + 140.25 + ], + "area_px": 432.0 + }, + { + "image_points_px": [ + [ + 70.0, + 130.0 + ], + [ + 42.0, + 139.0 + ], + [ + 30.0, + 128.0 + ], + [ + 58.0, + 119.0 + ] + ], + "center_px": [ + 50.0, + 129.0 + ], + "area_px": 416.0 + }, + { + "image_points_px": [ + [ + 1169.0, + 165.0 + ], + [ + 1186.0, + 155.0 + ], + [ + 1209.0, + 168.0 + ], + [ + 1191.0, + 177.0 + ] + ], + "center_px": [ + 1188.75, + 166.25 + ], + "area_px": 432.5 + }, + { + "image_points_px": [ + [ + 335.0, + 120.0 + ], + [ + 310.0, + 130.0 + ], + [ + 295.0, + 118.0 + ], + [ + 320.0, + 109.0 + ] + ], + "center_px": [ + 315.0, + 119.25 + ], + "area_px": 430.0 + }, + { + "image_points_px": [ + [ + 1157.0, + 117.0 + ], + [ + 1176.0, + 109.0 + ], + [ + 1198.0, + 120.0 + ], + [ + 1179.0, + 129.0 + ] + ], + "center_px": [ + 1177.5, + 118.75 + ], + "area_px": 405.5 + }, + { + "image_points_px": [ + [ + 1194.0, + 97.0 + ], + [ + 1212.0, + 88.0 + ], + [ + 1235.0, + 100.0 + ], + [ + 1216.0, + 108.0 + ] + ], + "center_px": [ + 1214.25, + 98.25 + ], + "area_px": 404.0 + }, + { + "image_points_px": [ + [ + 1151.0, + 95.0 + ], + [ + 1169.0, + 86.0 + ], + [ + 1192.0, + 98.0 + ], + [ + 1173.0, + 106.0 + ] + ], + "center_px": [ + 1171.25, + 96.25 + ], + "area_px": 404.0 + }, + { + "image_points_px": [ + [ + 462.0, + 127.0 + ], + [ + 438.0, + 137.0 + ], + [ + 422.0, + 125.0 + ], + [ + 446.0, + 116.0 + ] + ], + "center_px": [ + 442.0, + 126.25 + ], + "area_px": 428.0 + }, + { + "image_points_px": [ + [ + 505.0, + 129.0 + ], + [ + 481.0, + 139.0 + ], + [ + 465.0, + 127.0 + ], + [ + 488.0, + 118.0 + ] + ], + "center_px": [ + 484.75, + 128.25 + ], + "area_px": 427.0 + }, + { + "image_points_px": [ + [ + 293.0, + 118.0 + ], + [ + 266.0, + 127.0 + ], + [ + 253.0, + 116.0 + ], + [ + 279.0, + 107.0 + ] + ], + "center_px": [ + 272.75, + 117.0 + ], + "area_px": 413.0 + }, + { + "image_points_px": [ + [ + 251.0, + 116.0 + ], + [ + 225.0, + 125.0 + ], + [ + 211.0, + 114.0 + ], + [ + 238.0, + 105.0 + ] + ], + "center_px": [ + 231.25, + 115.0 + ], + "area_px": 413.0 + }, + { + "image_points_px": [ + [ + 638.0, + 114.0 + ], + [ + 616.0, + 123.0 + ], + [ + 598.0, + 111.0 + ], + [ + 620.0, + 102.0 + ] + ], + "center_px": [ + 618.0, + 112.5 + ], + "area_px": 426.0 + }, + { + "image_points_px": [ + [ + 377.0, + 123.0 + ], + [ + 352.0, + 132.0 + ], + [ + 337.0, + 121.0 + ], + [ + 363.0, + 112.0 + ] + ], + "center_px": [ + 357.25, + 122.0 + ], + "area_px": 411.0 + }, + { + "image_points_px": [ + [ + 345.0, + 98.0 + ], + [ + 320.0, + 107.0 + ], + [ + 305.0, + 96.0 + ], + [ + 330.0, + 87.0 + ] + ], + "center_px": [ + 325.0, + 97.0 + ], + "area_px": 410.0 + }, + { + "image_points_px": [ + [ + 456.0, + 447.0 + ], + [ + 419.0, + 454.0 + ], + [ + 415.0, + 452.0 + ], + [ + 443.0, + 437.0 + ] + ], + "center_px": [ + 433.25, + 447.5 + ], + "area_px": 288.5 + }, + { + "image_points_px": [ + [ + 428.0, + 102.0 + ], + [ + 403.0, + 111.0 + ], + [ + 388.0, + 100.0 + ], + [ + 412.0, + 91.0 + ] + ], + "center_px": [ + 407.75, + 101.0 + ], + "area_px": 409.0 + }, + { + "image_points_px": [ + [ + 512.0, + 107.0 + ], + [ + 488.0, + 116.0 + ], + [ + 472.0, + 105.0 + ], + [ + 496.0, + 96.0 + ] + ], + "center_px": [ + 492.0, + 106.0 + ], + "area_px": 408.0 + }, + { + "image_points_px": [ + [ + 596.0, + 111.0 + ], + [ + 572.0, + 120.0 + ], + [ + 556.0, + 109.0 + ], + [ + 579.0, + 100.0 + ] + ], + "center_px": [ + 575.75, + 110.0 + ], + "area_px": 407.0 + }, + { + "image_points_px": [ + [ + 554.0, + 109.0 + ], + [ + 530.0, + 118.0 + ], + [ + 514.0, + 107.0 + ], + [ + 537.0, + 98.0 + ] + ], + "center_px": [ + 533.75, + 108.0 + ], + "area_px": 407.0 + }, + { + "image_points_px": [ + [ + 209.0, + 114.0 + ], + [ + 183.0, + 123.0 + ], + [ + 170.0, + 112.0 + ], + [ + 195.0, + 102.0 + ] + ], + "center_px": [ + 189.25, + 112.75 + ], + "area_px": 421.5 + }, + { + "image_points_px": [ + [ + 560.0, + 87.0 + ], + [ + 537.0, + 96.0 + ], + [ + 520.0, + 85.0 + ], + [ + 543.0, + 76.0 + ] + ], + "center_px": [ + 540.0, + 86.0 + ], + "area_px": 406.0 + }, + { + "image_points_px": [ + [ + 167.0, + 111.0 + ], + [ + 141.0, + 121.0 + ], + [ + 128.0, + 110.0 + ], + [ + 154.0, + 100.0 + ] + ], + "center_px": [ + 147.5, + 110.5 + ], + "area_px": 416.0 + }, + { + "image_points_px": [ + [ + 1038.0, + 182.0 + ], + [ + 1057.0, + 173.0 + ], + [ + 1077.0, + 185.0 + ], + [ + 1058.0, + 195.0 + ] + ], + "center_px": [ + 1057.5, + 183.75 + ], + "area_px": 427.5 + }, + { + "image_points_px": [ + [ + 1125.0, + 162.0 + ], + [ + 1142.0, + 153.0 + ], + [ + 1164.0, + 165.0 + ], + [ + 1146.0, + 175.0 + ] + ], + "center_px": [ + 1144.25, + 163.75 + ], + "area_px": 423.0 + }, + { + "image_points_px": [ + [ + 982.0, + 86.0 + ], + [ + 1001.0, + 78.0 + ], + [ + 1022.0, + 89.0 + ], + [ + 1003.0, + 98.0 + ] + ], + "center_px": [ + 1002.0, + 87.75 + ], + "area_px": 397.0 + }, + { + "image_points_px": [ + [ + 1231.0, + 78.0 + ], + [ + 1248.0, + 69.0 + ], + [ + 1271.0, + 80.0 + ], + [ + 1254.0, + 89.0 + ] + ], + "center_px": [ + 1251.0, + 79.0 + ], + "area_px": 394.0 + }, + { + "image_points_px": [ + [ + 1024.0, + 89.0 + ], + [ + 1043.0, + 80.0 + ], + [ + 1064.0, + 91.0 + ], + [ + 1045.0, + 100.0 + ] + ], + "center_px": [ + 1044.0, + 90.0 + ], + "area_px": 398.0 + }, + { + "image_points_px": [ + [ + 386.0, + 100.0 + ], + [ + 362.0, + 110.0 + ], + [ + 347.0, + 98.0 + ], + [ + 371.0, + 89.0 + ] + ], + "center_px": [ + 366.5, + 99.25 + ], + "area_px": 418.5 + }, + { + "image_points_px": [ + [ + 126.0, + 109.0 + ], + [ + 99.0, + 118.0 + ], + [ + 87.0, + 107.0 + ], + [ + 113.0, + 98.0 + ] + ], + "center_px": [ + 106.25, + 108.0 + ], + "area_px": 404.0 + }, + { + "image_points_px": [ + [ + 303.0, + 96.0 + ], + [ + 278.0, + 105.0 + ], + [ + 264.0, + 94.0 + ], + [ + 289.0, + 85.0 + ] + ], + "center_px": [ + 283.5, + 95.0 + ], + "area_px": 401.0 + }, + { + "image_points_px": [ + [ + 1189.0, + 75.0 + ], + [ + 1206.0, + 67.0 + ], + [ + 1229.0, + 78.0 + ], + [ + 1210.0, + 86.0 + ] + ], + "center_px": [ + 1208.5, + 76.5 + ], + "area_px": 374.0 + }, + { + "image_points_px": [ + [ + 99.0, + 85.0 + ], + [ + 72.0, + 94.0 + ], + [ + 60.0, + 83.0 + ], + [ + 87.0, + 75.0 + ] + ], + "center_px": [ + 79.5, + 84.25 + ], + "area_px": 385.5 + }, + { + "image_points_px": [ + [ + 469.0, + 105.0 + ], + [ + 446.0, + 114.0 + ], + [ + 430.0, + 103.0 + ], + [ + 455.0, + 94.0 + ] + ], + "center_px": [ + 450.0, + 104.0 + ], + "area_px": 399.0 + }, + { + "image_points_px": [ + [ + 518.0, + 85.0 + ], + [ + 495.0, + 94.0 + ], + [ + 479.0, + 83.0 + ], + [ + 502.0, + 74.0 + ] + ], + "center_px": [ + 498.5, + 84.0 + ], + "area_px": 397.0 + }, + { + "image_points_px": [ + [ + 262.0, + 94.0 + ], + [ + 236.0, + 102.0 + ], + [ + 223.0, + 92.0 + ], + [ + 249.0, + 83.0 + ] + ], + "center_px": [ + 242.5, + 92.75 + ], + "area_px": 383.5 + }, + { + "image_points_px": [ + [ + 601.0, + 89.0 + ], + [ + 579.0, + 98.0 + ], + [ + 562.0, + 87.0 + ], + [ + 584.0, + 78.0 + ] + ], + "center_px": [ + 581.5, + 88.0 + ], + "area_px": 395.0 + }, + { + "image_points_px": [ + [ + 642.0, + 91.0 + ], + [ + 620.0, + 100.0 + ], + [ + 603.0, + 89.0 + ], + [ + 625.0, + 80.0 + ] + ], + "center_px": [ + 622.5, + 90.0 + ], + "area_px": 395.0 + }, + { + "image_points_px": [ + [ + 221.0, + 91.0 + ], + [ + 195.0, + 100.0 + ], + [ + 182.0, + 90.0 + ], + [ + 208.0, + 81.0 + ] + ], + "center_px": [ + 201.5, + 90.5 + ], + "area_px": 377.0 + }, + { + "image_points_px": [ + [ + 1224.0, + 57.0 + ], + [ + 1242.0, + 49.0 + ], + [ + 1264.0, + 59.0 + ], + [ + 1247.0, + 67.0 + ] + ], + "center_px": [ + 1244.25, + 58.0 + ], + "area_px": 355.0 + }, + { + "image_points_px": [ + [ + 58.0, + 83.0 + ], + [ + 32.0, + 92.0 + ], + [ + 20.0, + 81.0 + ], + [ + 46.0, + 72.0 + ] + ], + "center_px": [ + 39.0, + 82.0 + ], + "area_px": 394.0 + }, + { + "image_points_px": [ + [ + 395.0, + 78.0 + ], + [ + 371.0, + 87.0 + ], + [ + 356.0, + 76.0 + ], + [ + 380.0, + 68.0 + ] + ], + "center_px": [ + 375.5, + 77.25 + ], + "area_px": 379.5 + }, + { + "image_points_px": [ + [ + 436.0, + 80.0 + ], + [ + 412.0, + 89.0 + ], + [ + 397.0, + 78.0 + ], + [ + 420.0, + 70.0 + ] + ], + "center_px": [ + 416.25, + 79.25 + ], + "area_px": 378.5 + }, + { + "image_points_px": [ + [ + 139.0, + 87.0 + ], + [ + 113.0, + 96.0 + ], + [ + 101.0, + 85.0 + ], + [ + 126.0, + 76.0 + ] + ], + "center_px": [ + 119.75, + 86.0 + ], + "area_px": 393.0 + }, + { + "image_points_px": [ + [ + 273.0, + 72.0 + ], + [ + 247.0, + 80.0 + ], + [ + 234.0, + 70.0 + ], + [ + 260.0, + 62.0 + ] + ], + "center_px": [ + 253.5, + 71.0 + ], + "area_px": 364.0 + }, + { + "image_points_px": [ + [ + 979.0, + 65.0 + ], + [ + 999.0, + 57.0 + ], + [ + 1018.0, + 68.0 + ], + [ + 1000.0, + 76.0 + ] + ], + "center_px": [ + 999.0, + 66.5 + ], + "area_px": 369.0 + }, + { + "image_points_px": [ + [ + 1031.0, + 134.0 + ], + [ + 1050.0, + 125.0 + ], + [ + 1069.0, + 136.0 + ], + [ + 1052.0, + 146.0 + ] + ], + "center_px": [ + 1050.5, + 135.25 + ], + "area_px": 397.0 + }, + { + "image_points_px": [ + [ + 1063.0, + 69.0 + ], + [ + 1081.0, + 61.0 + ], + [ + 1102.0, + 72.0 + ], + [ + 1083.0, + 80.0 + ] + ], + "center_px": [ + 1082.25, + 70.5 + ], + "area_px": 367.5 + }, + { + "image_points_px": [ + [ + 1021.0, + 67.0 + ], + [ + 1040.0, + 59.0 + ], + [ + 1060.0, + 70.0 + ], + [ + 1042.0, + 78.0 + ] + ], + "center_px": [ + 1040.75, + 68.5 + ], + "area_px": 367.5 + }, + { + "image_points_px": [ + [ + 1105.0, + 71.0 + ], + [ + 1123.0, + 63.0 + ], + [ + 1144.0, + 74.0 + ], + [ + 1126.0, + 82.0 + ] + ], + "center_px": [ + 1124.5, + 72.5 + ], + "area_px": 366.0 + }, + { + "image_points_px": [ + [ + 1147.0, + 73.0 + ], + [ + 1164.0, + 65.0 + ], + [ + 1186.0, + 76.0 + ], + [ + 1168.0, + 84.0 + ] + ], + "center_px": [ + 1166.25, + 74.5 + ], + "area_px": 364.5 + }, + { + "image_points_px": [ + [ + 180.0, + 89.0 + ], + [ + 154.0, + 98.0 + ], + [ + 142.0, + 87.0 + ], + [ + 168.0, + 79.0 + ] + ], + "center_px": [ + 161.0, + 88.25 + ], + "area_px": 375.0 + }, + { + "image_points_px": [ + [ + 112.0, + 64.0 + ], + [ + 86.0, + 72.0 + ], + [ + 74.0, + 62.0 + ], + [ + 100.0, + 53.0 + ] + ], + "center_px": [ + 93.0, + 62.75 + ], + "area_px": 375.0 + }, + { + "image_points_px": [ + [ + 152.0, + 66.0 + ], + [ + 126.0, + 74.0 + ], + [ + 114.0, + 64.0 + ], + [ + 139.0, + 55.0 + ] + ], + "center_px": [ + 132.75, + 64.75 + ], + "area_px": 374.0 + }, + { + "image_points_px": [ + [ + 232.0, + 70.0 + ], + [ + 208.0, + 79.0 + ], + [ + 194.0, + 68.0 + ], + [ + 220.0, + 60.0 + ] + ], + "center_px": [ + 213.5, + 69.25 + ], + "area_px": 373.0 + }, + { + "image_points_px": [ + [ + 313.0, + 74.0 + ], + [ + 289.0, + 83.0 + ], + [ + 275.0, + 72.0 + ], + [ + 300.0, + 64.0 + ] + ], + "center_px": [ + 294.25, + 73.25 + ], + "area_px": 372.0 + }, + { + "image_points_px": [ + [ + 1018.0, + 47.0 + ], + [ + 1038.0, + 39.0 + ], + [ + 1057.0, + 49.0 + ], + [ + 1039.0, + 57.0 + ] + ], + "center_px": [ + 1038.0, + 48.0 + ], + "area_px": 350.0 + }, + { + "image_points_px": [ + [ + 354.0, + 76.0 + ], + [ + 330.0, + 85.0 + ], + [ + 316.0, + 74.0 + ], + [ + 340.0, + 66.0 + ] + ], + "center_px": [ + 335.0, + 75.25 + ], + "area_px": 371.0 + }, + { + "image_points_px": [ + [ + 1059.0, + 49.0 + ], + [ + 1078.0, + 41.0 + ], + [ + 1098.0, + 51.0 + ], + [ + 1080.0, + 59.0 + ] + ], + "center_px": [ + 1078.75, + 50.0 + ], + "area_px": 349.0 + }, + { + "image_points_px": [ + [ + 1183.0, + 55.0 + ], + [ + 1201.0, + 47.0 + ], + [ + 1222.0, + 57.0 + ], + [ + 1204.0, + 65.0 + ] + ], + "center_px": [ + 1202.5, + 56.0 + ], + "area_px": 348.0 + }, + { + "image_points_px": [ + [ + 72.0, + 62.0 + ], + [ + 46.0, + 70.0 + ], + [ + 34.0, + 60.0 + ], + [ + 61.0, + 52.0 + ] + ], + "center_px": [ + 53.25, + 61.0 + ], + "area_px": 357.0 + }, + { + "image_points_px": [ + [ + 403.0, + 57.0 + ], + [ + 380.0, + 66.0 + ], + [ + 365.0, + 55.0 + ], + [ + 389.0, + 47.0 + ] + ], + "center_px": [ + 384.25, + 56.25 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 363.0, + 55.0 + ], + [ + 340.0, + 64.0 + ], + [ + 325.0, + 53.0 + ], + [ + 349.0, + 45.0 + ] + ], + "center_px": [ + 344.25, + 54.25 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 476.0, + 83.0 + ], + [ + 453.0, + 91.0 + ], + [ + 438.0, + 81.0 + ], + [ + 461.0, + 72.0 + ] + ], + "center_px": [ + 457.0, + 81.75 + ], + "area_px": 369.0 + }, + { + "image_points_px": [ + [ + 192.0, + 68.0 + ], + [ + 166.0, + 76.0 + ], + [ + 154.0, + 66.0 + ], + [ + 180.0, + 58.0 + ] + ], + "center_px": [ + 173.0, + 67.0 + ], + "area_px": 356.0 + }, + { + "image_points_px": [ + [ + 484.0, + 61.0 + ], + [ + 461.0, + 70.0 + ], + [ + 446.0, + 59.0 + ], + [ + 468.0, + 51.0 + ] + ], + "center_px": [ + 464.75, + 60.25 + ], + "area_px": 368.0 + }, + { + "image_points_px": [ + [ + 605.0, + 68.0 + ], + [ + 583.0, + 76.0 + ], + [ + 567.0, + 66.0 + ], + [ + 589.0, + 57.0 + ] + ], + "center_px": [ + 586.0, + 66.75 + ], + "area_px": 367.0 + }, + { + "image_points_px": [ + [ + 564.0, + 66.0 + ], + [ + 542.0, + 74.0 + ], + [ + 526.0, + 64.0 + ], + [ + 548.0, + 55.0 + ] + ], + "center_px": [ + 545.0, + 64.75 + ], + "area_px": 367.0 + }, + { + "image_points_px": [ + [ + 443.0, + 59.0 + ], + [ + 420.0, + 68.0 + ], + [ + 405.0, + 58.0 + ], + [ + 428.0, + 49.0 + ] + ], + "center_px": [ + 424.0, + 58.5 + ], + "area_px": 365.0 + }, + { + "image_points_px": [ + [ + 524.0, + 63.0 + ], + [ + 501.0, + 72.0 + ], + [ + 486.0, + 62.0 + ], + [ + 508.0, + 53.0 + ] + ], + "center_px": [ + 504.75, + 62.5 + ], + "area_px": 364.5 + }, + { + "image_points_px": [ + [ + 244.0, + 49.0 + ], + [ + 218.0, + 57.0 + ], + [ + 206.0, + 47.0 + ], + [ + 230.0, + 39.0 + ] + ], + "center_px": [ + 224.5, + 48.0 + ], + "area_px": 354.0 + }, + { + "image_points_px": [ + [ + 451.0, + 39.0 + ], + [ + 427.0, + 47.0 + ], + [ + 413.0, + 37.0 + ], + [ + 436.0, + 29.0 + ] + ], + "center_px": [ + 431.75, + 38.0 + ], + "area_px": 351.0 + }, + { + "image_points_px": [ + [ + 372.0, + 35.0 + ], + [ + 348.0, + 43.0 + ], + [ + 334.0, + 33.0 + ], + [ + 357.0, + 25.0 + ] + ], + "center_px": [ + 352.75, + 34.0 + ], + "area_px": 351.0 + }, + { + "image_points_px": [ + [ + 530.0, + 43.0 + ], + [ + 508.0, + 51.0 + ], + [ + 492.0, + 41.0 + ], + [ + 515.0, + 33.0 + ] + ], + "center_px": [ + 511.25, + 42.0 + ], + "area_px": 349.0 + }, + { + "image_points_px": [ + [ + 610.0, + 47.0 + ], + [ + 588.0, + 55.0 + ], + [ + 572.0, + 45.0 + ], + [ + 594.0, + 37.0 + ] + ], + "center_px": [ + 591.0, + 46.0 + ], + "area_px": 348.0 + }, + { + "image_points_px": [ + [ + 570.0, + 45.0 + ], + [ + 548.0, + 53.0 + ], + [ + 532.0, + 43.0 + ], + [ + 554.0, + 35.0 + ] + ], + "center_px": [ + 551.0, + 44.0 + ], + "area_px": 348.0 + }, + { + "image_points_px": [ + [ + 988.0, + 131.0 + ], + [ + 1007.0, + 123.0 + ], + [ + 1025.0, + 134.0 + ], + [ + 1007.0, + 143.0 + ] + ], + "center_px": [ + 1006.75, + 132.75 + ], + "area_px": 370.0 + }, + { + "image_points_px": [ + [ + 734.0, + 33.0 + ], + [ + 714.0, + 41.0 + ], + [ + 696.0, + 31.0 + ], + [ + 716.0, + 23.0 + ] + ], + "center_px": [ + 715.0, + 32.0 + ], + "area_px": 344.0 + }, + { + "image_points_px": [ + [ + 978.0, + 44.0 + ], + [ + 997.0, + 37.0 + ], + [ + 1016.0, + 47.0 + ], + [ + 998.0, + 55.0 + ] + ], + "center_px": [ + 997.25, + 45.75 + ], + "area_px": 340.5 + }, + { + "image_points_px": [ + [ + 323.0, + 53.0 + ], + [ + 299.0, + 62.0 + ], + [ + 286.0, + 51.0 + ], + [ + 309.0, + 43.0 + ] + ], + "center_px": [ + 304.25, + 52.25 + ], + "area_px": 361.5 + }, + { + "image_points_px": [ + [ + 937.0, + 43.0 + ], + [ + 956.0, + 35.0 + ], + [ + 975.0, + 45.0 + ], + [ + 956.0, + 53.0 + ] + ], + "center_px": [ + 956.0, + 44.0 + ], + "area_px": 342.0 + }, + { + "image_points_px": [ + [ + 1178.0, + 34.0 + ], + [ + 1196.0, + 27.0 + ], + [ + 1216.0, + 37.0 + ], + [ + 1200.0, + 45.0 + ] + ], + "center_px": [ + 1197.5, + 35.75 + ], + "area_px": 336.0 + }, + { + "image_points_px": [ + [ + 936.0, + 23.0 + ], + [ + 954.0, + 15.0 + ], + [ + 974.0, + 25.0 + ], + [ + 955.0, + 33.0 + ] + ], + "center_px": [ + 954.75, + 24.0 + ], + "area_px": 341.0 + }, + { + "image_points_px": [ + [ + 976.0, + 25.0 + ], + [ + 994.0, + 17.0 + ], + [ + 1014.0, + 27.0 + ], + [ + 996.0, + 35.0 + ] + ], + "center_px": [ + 995.0, + 26.0 + ], + "area_px": 340.0 + }, + { + "image_points_px": [ + [ + 1172.0, + 15.0 + ], + [ + 1188.0, + 7.0 + ], + [ + 1210.0, + 17.0 + ], + [ + 1194.0, + 25.0 + ] + ], + "center_px": [ + 1191.0, + 16.0 + ], + "area_px": 336.0 + }, + { + "image_points_px": [ + [ + 1097.0, + 31.0 + ], + [ + 1114.0, + 23.0 + ], + [ + 1135.0, + 33.0 + ], + [ + 1118.0, + 41.0 + ] + ], + "center_px": [ + 1116.0, + 32.0 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 42.0, + 104.0 + ], + [ + 17.0, + 114.0 + ], + [ + 6.0, + 103.0 + ], + [ + 31.0, + 94.0 + ] + ], + "center_px": [ + 24.0, + 103.75 + ], + "area_px": 367.0 + }, + { + "image_points_px": [ + [ + 165.0, + 45.0 + ], + [ + 139.0, + 53.0 + ], + [ + 128.0, + 43.0 + ], + [ + 152.0, + 35.0 + ] + ], + "center_px": [ + 146.0, + 44.0 + ], + "area_px": 346.0 + }, + { + "image_points_px": [ + [ + 125.0, + 43.0 + ], + [ + 100.0, + 51.0 + ], + [ + 88.0, + 41.0 + ], + [ + 113.0, + 33.0 + ] + ], + "center_px": [ + 106.5, + 42.0 + ], + "area_px": 346.0 + }, + { + "image_points_px": [ + [ + 283.0, + 51.0 + ], + [ + 259.0, + 60.0 + ], + [ + 246.0, + 49.0 + ], + [ + 271.0, + 42.0 + ] + ], + "center_px": [ + 264.75, + 50.5 + ], + "area_px": 345.0 + }, + { + "image_points_px": [ + [ + 645.0, + 70.0 + ], + [ + 624.0, + 78.0 + ], + [ + 608.0, + 68.0 + ], + [ + 629.0, + 59.0 + ] + ], + "center_px": [ + 626.5, + 68.75 + ], + "area_px": 356.5 + }, + { + "image_points_px": [ + [ + 204.0, + 47.0 + ], + [ + 179.0, + 55.0 + ], + [ + 167.0, + 45.0 + ], + [ + 191.0, + 37.0 + ] + ], + "center_px": [ + 185.25, + 46.0 + ], + "area_px": 345.0 + }, + { + "image_points_px": [ + [ + 1137.0, + 32.0 + ], + [ + 1155.0, + 25.0 + ], + [ + 1175.0, + 35.0 + ], + [ + 1157.0, + 42.0 + ] + ], + "center_px": [ + 1156.0, + 33.5 + ], + "area_px": 320.0 + }, + { + "image_points_px": [ + [ + 1056.0, + 29.0 + ], + [ + 1074.0, + 21.0 + ], + [ + 1094.0, + 31.0 + ], + [ + 1075.0, + 38.0 + ] + ], + "center_px": [ + 1074.75, + 29.75 + ], + "area_px": 322.0 + }, + { + "image_points_px": [ + [ + 1016.0, + 27.0 + ], + [ + 1034.0, + 19.0 + ], + [ + 1054.0, + 29.0 + ], + [ + 1035.0, + 36.0 + ] + ], + "center_px": [ + 1034.75, + 27.75 + ], + "area_px": 322.0 + }, + { + "image_points_px": [ + [ + 1132.0, + 13.0 + ], + [ + 1151.0, + 6.0 + ], + [ + 1170.0, + 15.0 + ], + [ + 1153.0, + 23.0 + ] + ], + "center_px": [ + 1151.5, + 14.25 + ], + "area_px": 321.0 + }, + { + "image_points_px": [ + [ + 1092.0, + 11.0 + ], + [ + 1111.0, + 4.0 + ], + [ + 1130.0, + 13.0 + ], + [ + 1113.0, + 21.0 + ] + ], + "center_px": [ + 1111.5, + 12.25 + ], + "area_px": 321.0 + }, + { + "image_points_px": [ + [ + 1219.0, + 36.0 + ], + [ + 1236.0, + 29.0 + ], + [ + 1257.0, + 39.0 + ], + [ + 1239.0, + 46.0 + ] + ], + "center_px": [ + 1237.75, + 37.5 + ], + "area_px": 318.5 + }, + { + "image_points_px": [ + [ + 1212.0, + 17.0 + ], + [ + 1229.0, + 9.0 + ], + [ + 1250.0, + 19.0 + ], + [ + 1232.0, + 26.0 + ] + ], + "center_px": [ + 1230.75, + 17.75 + ], + "area_px": 320.0 + }, + { + "image_points_px": [ + [ + 83.0, + 106.0 + ], + [ + 59.0, + 116.0 + ], + [ + 47.0, + 106.0 + ], + [ + 71.0, + 96.0 + ] + ], + "center_px": [ + 65.0, + 106.0 + ], + "area_px": 360.0 + }, + { + "image_points_px": [ + [ + 490.0, + 41.0 + ], + [ + 467.0, + 49.0 + ], + [ + 453.0, + 39.0 + ], + [ + 475.0, + 31.0 + ] + ], + "center_px": [ + 471.25, + 40.0 + ], + "area_px": 341.0 + }, + { + "image_points_px": [ + [ + 411.0, + 37.0 + ], + [ + 388.0, + 45.0 + ], + [ + 374.0, + 35.0 + ], + [ + 396.0, + 27.0 + ] + ], + "center_px": [ + 392.25, + 36.0 + ], + "area_px": 341.0 + }, + { + "image_points_px": [ + [ + 730.0, + 53.0 + ], + [ + 709.0, + 61.0 + ], + [ + 693.0, + 51.0 + ], + [ + 714.0, + 43.0 + ] + ], + "center_px": [ + 711.5, + 52.0 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 614.0, + 27.0 + ], + [ + 593.0, + 35.0 + ], + [ + 577.0, + 25.0 + ], + [ + 598.0, + 17.0 + ] + ], + "center_px": [ + 595.5, + 26.0 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 773.0, + 35.0 + ], + [ + 753.0, + 43.0 + ], + [ + 736.0, + 33.0 + ], + [ + 756.0, + 25.0 + ] + ], + "center_px": [ + 754.5, + 34.0 + ], + "area_px": 336.0 + }, + { + "image_points_px": [ + [ + 293.0, + 31.0 + ], + [ + 269.0, + 39.0 + ], + [ + 256.0, + 29.0 + ], + [ + 280.0, + 22.0 + ] + ], + "center_px": [ + 274.5, + 30.25 + ], + "area_px": 325.5 + }, + { + "image_points_px": [ + [ + 138.0, + 23.0 + ], + [ + 113.0, + 31.0 + ], + [ + 101.0, + 22.0 + ], + [ + 126.0, + 14.0 + ] + ], + "center_px": [ + 119.5, + 22.5 + ], + "area_px": 321.0 + }, + { + "image_points_px": [ + [ + 1029.0, + 111.0 + ], + [ + 1046.0, + 102.0 + ], + [ + 1065.0, + 114.0 + ], + [ + 1048.0, + 122.0 + ] + ], + "center_px": [ + 1047.0, + 112.25 + ], + "area_px": 357.0 + }, + { + "image_points_px": [ + [ + 986.0, + 108.0 + ], + [ + 1003.0, + 100.0 + ], + [ + 1022.0, + 111.0 + ], + [ + 1005.0, + 120.0 + ] + ], + "center_px": [ + 1004.0, + 109.75 + ], + "area_px": 357.0 + }, + { + "image_points_px": [ + [ + 332.0, + 33.0 + ], + [ + 309.0, + 41.0 + ], + [ + 295.0, + 31.0 + ], + [ + 319.0, + 24.0 + ] + ], + "center_px": [ + 313.75, + 32.25 + ], + "area_px": 324.5 + }, + { + "image_points_px": [ + [ + 86.0, + 41.0 + ], + [ + 60.0, + 49.0 + ], + [ + 50.0, + 39.0 + ], + [ + 74.0, + 31.0 + ] + ], + "center_px": [ + 67.5, + 40.0 + ], + "area_px": 338.0 + }, + { + "image_points_px": [ + [ + 497.0, + 21.0 + ], + [ + 474.0, + 29.0 + ], + [ + 460.0, + 19.0 + ], + [ + 482.0, + 12.0 + ] + ], + "center_px": [ + 478.25, + 20.25 + ], + "area_px": 322.5 + }, + { + "image_points_px": [ + [ + 536.0, + 23.0 + ], + [ + 514.0, + 31.0 + ], + [ + 499.0, + 21.0 + ], + [ + 521.0, + 14.0 + ] + ], + "center_px": [ + 517.5, + 22.25 + ], + "area_px": 321.5 + }, + { + "image_points_px": [ + [ + 380.0, + 15.0 + ], + [ + 357.0, + 23.0 + ], + [ + 343.0, + 14.0 + ], + [ + 366.0, + 6.0 + ] + ], + "center_px": [ + 361.5, + 14.5 + ], + "area_px": 319.0 + }, + { + "image_points_px": [ + [ + 575.0, + 25.0 + ], + [ + 554.0, + 33.0 + ], + [ + 538.0, + 23.0 + ], + [ + 560.0, + 16.0 + ] + ], + "center_px": [ + 556.75, + 24.25 + ], + "area_px": 320.5 + }, + { + "image_points_px": [ + [ + 61.0, + 19.0 + ], + [ + 36.0, + 28.0 + ], + [ + 25.0, + 18.0 + ], + [ + 50.0, + 10.0 + ] + ], + "center_px": [ + 43.0, + 18.75 + ], + "area_px": 331.0 + }, + { + "image_points_px": [ + [ + 458.0, + 19.0 + ], + [ + 435.0, + 27.0 + ], + [ + 421.0, + 18.0 + ], + [ + 443.0, + 10.0 + ] + ], + "center_px": [ + 439.25, + 18.5 + ], + "area_px": 318.5 + }, + { + "image_points_px": [ + [ + 537.0, + 313.0 + ], + [ + 513.0, + 328.0 + ], + [ + 502.0, + 320.0 + ], + [ + 529.0, + 307.0 + ] + ], + "center_px": [ + 520.25, + 317.0 + ], + "area_px": 311.5 + }, + { + "image_points_px": [ + [ + 738.0, + 13.0 + ], + [ + 758.0, + 6.0 + ], + [ + 775.0, + 15.0 + ], + [ + 755.0, + 23.0 + ] + ], + "center_px": [ + 756.5, + 14.25 + ], + "area_px": 317.5 + }, + { + "image_points_px": [ + [ + 699.0, + 11.0 + ], + [ + 719.0, + 4.0 + ], + [ + 736.0, + 13.0 + ], + [ + 716.0, + 21.0 + ] + ], + "center_px": [ + 717.5, + 12.25 + ], + "area_px": 317.5 + }, + { + "image_points_px": [ + [ + 47.0, + 39.0 + ], + [ + 21.0, + 47.0 + ], + [ + 11.0, + 37.0 + ], + [ + 36.0, + 30.0 + ] + ], + "center_px": [ + 28.75, + 38.25 + ], + "area_px": 321.0 + }, + { + "image_points_px": [ + [ + 1068.0, + 91.0 + ], + [ + 1085.0, + 82.0 + ], + [ + 1104.0, + 93.0 + ], + [ + 1086.0, + 101.0 + ] + ], + "center_px": [ + 1085.75, + 91.75 + ], + "area_px": 341.0 + }, + { + "image_points_px": [ + [ + 657.0, + 29.0 + ], + [ + 678.0, + 22.0 + ], + [ + 694.0, + 31.0 + ], + [ + 672.0, + 38.0 + ] + ], + "center_px": [ + 675.25, + 30.0 + ], + "area_px": 302.0 + }, + { + "image_points_px": [ + [ + 176.0, + 25.0 + ], + [ + 151.0, + 33.0 + ], + [ + 140.0, + 24.0 + ], + [ + 165.0, + 16.0 + ] + ], + "center_px": [ + 158.0, + 24.5 + ], + "area_px": 313.0 + }, + { + "image_points_px": [ + [ + 99.0, + 21.0 + ], + [ + 74.0, + 29.0 + ], + [ + 63.0, + 20.0 + ], + [ + 88.0, + 12.0 + ] + ], + "center_px": [ + 81.0, + 20.5 + ], + "area_px": 313.0 + }, + { + "image_points_px": [ + [ + 215.0, + 27.0 + ], + [ + 191.0, + 35.0 + ], + [ + 179.0, + 25.0 + ], + [ + 203.0, + 18.0 + ] + ], + "center_px": [ + 197.0, + 26.25 + ], + "area_px": 318.0 + }, + { + "image_points_px": [ + [ + 254.0, + 29.0 + ], + [ + 230.0, + 37.0 + ], + [ + 218.0, + 27.0 + ], + [ + 241.0, + 20.0 + ] + ], + "center_px": [ + 235.75, + 28.25 + ], + "area_px": 317.0 + }, + { + "image_points_px": [ + [ + 341.0, + 14.0 + ], + [ + 317.0, + 21.0 + ], + [ + 305.0, + 12.0 + ], + [ + 328.0, + 4.0 + ] + ], + "center_px": [ + 322.75, + 12.75 + ], + "area_px": 317.0 + }, + { + "image_points_px": [ + [ + 418.0, + 18.0 + ], + [ + 396.0, + 25.0 + ], + [ + 382.0, + 16.0 + ], + [ + 404.0, + 8.0 + ] + ], + "center_px": [ + 400.0, + 16.75 + ], + "area_px": 314.0 + }, + { + "image_points_px": [ + [ + 302.0, + 12.0 + ], + [ + 279.0, + 19.0 + ], + [ + 266.0, + 10.0 + ], + [ + 291.0, + 3.0 + ] + ], + "center_px": [ + 284.5, + 11.0 + ], + "area_px": 300.0 + }, + { + "image_points_px": [ + [ + 647.0, + 49.0 + ], + [ + 629.0, + 57.0 + ], + [ + 612.0, + 47.0 + ], + [ + 634.0, + 39.0 + ] + ], + "center_px": [ + 630.5, + 48.0 + ], + "area_px": 320.0 + }, + { + "image_points_px": [ + [ + 1103.0, + 50.0 + ], + [ + 1119.0, + 43.0 + ], + [ + 1137.0, + 53.0 + ], + [ + 1122.0, + 61.0 + ] + ], + "center_px": [ + 1120.25, + 51.75 + ], + "area_px": 301.5 + }, + { + "image_points_px": [ + [ + 1144.0, + 53.0 + ], + [ + 1160.0, + 45.0 + ], + [ + 1178.0, + 55.0 + ], + [ + 1163.0, + 63.0 + ] + ], + "center_px": [ + 1161.25, + 54.0 + ], + "area_px": 303.0 + }, + { + "image_points_px": [ + [ + 107.0, + 503.0 + ], + [ + 95.0, + 506.0 + ], + [ + 74.0, + 497.0 + ], + [ + 95.0, + 489.0 + ] + ], + "center_px": [ + 92.75, + 498.75 + ], + "area_px": 280.5 + }, + { + "image_points_px": [ + [ + 592.0, + 286.0 + ], + [ + 566.0, + 298.0 + ], + [ + 558.0, + 293.0 + ], + [ + 583.0, + 281.0 + ] + ], + "center_px": [ + 574.75, + 289.5 + ], + "area_px": 229.5 + }, + { + "image_points_px": [ + [ + 981.0, + 367.0 + ], + [ + 1010.0, + 388.0 + ], + [ + 1001.0, + 387.0 + ], + [ + 987.0, + 378.0 + ] + ], + "center_px": [ + 994.75, + 380.0 + ], + "area_px": 130.0 + }, + { + "image_points_px": [ + [ + 898.0, + 21.0 + ], + [ + 916.0, + 14.0 + ], + [ + 931.0, + 23.0 + ], + [ + 914.0, + 30.0 + ] + ], + "center_px": [ + 914.75, + 22.0 + ], + "area_px": 266.0 + }, + { + "image_points_px": [ + [ + 809.0, + 34.0 + ], + [ + 790.0, + 42.0 + ], + [ + 776.0, + 35.0 + ], + [ + 794.0, + 27.0 + ] + ], + "center_px": [ + 792.25, + 34.5 + ], + "area_px": 245.5 + }, + { + "image_points_px": [ + [ + 780.0, + 15.0 + ], + [ + 797.0, + 8.0 + ], + [ + 812.0, + 17.0 + ], + [ + 794.0, + 24.0 + ] + ], + "center_px": [ + 795.75, + 16.0 + ], + "area_px": 259.0 + }, + { + "image_points_px": [ + [ + 477.0, + 419.0 + ], + [ + 486.0, + 414.0 + ], + [ + 494.0, + 413.0 + ], + [ + 495.0, + 434.0 + ] + ], + "center_px": [ + 488.0, + 420.0 + ], + "area_px": 197.0 + }, + { + "image_points_px": [ + [ + 908.0, + 35.0 + ], + [ + 916.0, + 33.0 + ], + [ + 935.0, + 43.0 + ], + [ + 927.0, + 45.0 + ] + ], + "center_px": [ + 921.5, + 39.0 + ], + "area_px": 118.0 + }, + { + "image_points_px": [ + [ + 743.0, + 49.0 + ], + [ + 755.0, + 45.0 + ], + [ + 767.0, + 52.0 + ], + [ + 756.0, + 57.0 + ] + ], + "center_px": [ + 755.25, + 50.75 + ], + "area_px": 142.5 + }, + { + "image_points_px": [ + [ + 314.0, + 612.0 + ], + [ + 313.0, + 625.0 + ], + [ + 301.0, + 628.0 + ], + [ + 302.0, + 615.0 + ] + ], + "center_px": [ + 307.5, + 620.0 + ], + "area_px": 153.0 + }, + { + "image_points_px": [ + [ + 871.0, + 14.0 + ], + [ + 876.0, + 12.0 + ], + [ + 892.0, + 21.0 + ], + [ + 887.0, + 23.0 + ] + ], + "center_px": [ + 881.5, + 17.5 + ], + "area_px": 77.0 + }, + { + "image_points_px": [ + [ + 30.0, + 599.0 + ], + [ + 12.0, + 603.0 + ], + [ + 8.0, + 602.0 + ], + [ + 24.0, + 598.0 + ] + ], + "center_px": [ + 18.5, + 600.5 + ], + "area_px": 37.0 + }, + { + "image_points_px": [ + [ + 825.0, + 586.0 + ], + [ + 823.0, + 588.0 + ], + [ + 805.0, + 590.0 + ], + [ + 818.0, + 582.0 + ] + ], + "center_px": [ + 817.75, + 586.5 + ], + "area_px": 70.0 + }, + { + "image_points_px": [ + [ + 114.0, + 540.0 + ], + [ + 115.0, + 545.0 + ], + [ + 110.0, + 561.0 + ], + [ + 110.0, + 550.0 + ] + ], + "center_px": [ + 112.25, + 549.0 + ], + "area_px": 42.5 + }, + { + "image_points_px": [ + [ + 781.0, + 588.0 + ], + [ + 786.0, + 587.0 + ], + [ + 801.0, + 591.0 + ], + [ + 791.0, + 591.0 + ] + ], + "center_px": [ + 789.75, + 589.25 + ], + "area_px": 32.5 + } + ] +} \ No newline at end of file diff --git a/pipeline/render_3c_camera_pose.json b/pipeline/render_3c_camera_pose.json new file mode 100644 index 0000000..84da36e --- /dev/null +++ b/pipeline/render_3c_camera_pose.json @@ -0,0 +1,390 @@ +{ + "schema_version": "1.0", + "created_utc": "2026-05-29T05:34:17Z", + "source": { + "detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_3c_aruco_detection.json", + "robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json" + }, + "camera": { + "camera_id": "cam1", + "camera_matrix": [ + [ + 1777.77783203125, + 0.0, + 640.0 + ], + [ + 0.0, + 1500.0, + 360.0 + ], + [ + 0.0, + 0.0, + 1.0 + ] + ], + "distortion_coefficients": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "estimation": { + "method": "single_camera_marker_center_lm", + "description": "Rigid init from per-marker pose estimates, followed by LM on normalized marker-center reprojection residuals.", + "marker_size_m": 0.025, + "num_used_markers": 3, + "used_marker_ids": [ + 214, + 215, + 211 + ], + "history": { + "iters": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52 + ], + "rms": [ + 8.276652092351446, + 3.2695419276393194, + 1.6997554577172982, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.9031353472765118, + 0.8761012206869034, + 0.8761012206869034, + 0.8761012206869034, + 0.6657758310157231, + 0.4982919577482978, + 0.463899810578019, + 0.4620191377323524, + 0.46061835425038966, + 0.45820325758845926, + 0.4535628754664195, + 0.44440988606652543, + 0.42668189732885436, + 0.39303163296273724, + 0.33250807541862465, + 0.2873217198737302, + 0.2310754990881048, + 0.1683327418729557, + 0.12140389664238704, + 0.091031135899403, + 0.06974953807273628, + 0.05302622844733477, + 0.039719619692176966, + 0.037288115046028705, + 0.019479927098974645, + 0.009348648211600379, + 0.005670126166140046, + 0.004435173697432046, + 0.003309583557122678, + 0.0021075079585650964, + 0.0010750386520058455, + 0.00038672742677653426, + 8.049312829495705e-05, + 9.15644812387087e-06, + 5.813634591654259e-07, + 1.9407836813260934e-08, + 3.2977852013459893e-10, + 2.8258286470569123e-12, + 1.2165664095469026e-14 + ], + "lambda": [ + 0.001, + 0.0005, + 0.00025, + 0.000125, + 0.00025, + 0.0005, + 0.001, + 0.002, + 0.004, + 0.008, + 0.016, + 0.032, + 0.064, + 0.128, + 0.256, + 0.128, + 0.256, + 0.512, + 0.256, + 0.128, + 0.064, + 0.032, + 0.016, + 0.008, + 0.004, + 0.002, + 0.001, + 0.0005, + 0.00025, + 0.000125, + 6.25e-05, + 3.125e-05, + 1.5625e-05, + 7.8125e-06, + 3.90625e-06, + 1.953125e-06, + 9.765625e-07, + 4.8828125e-07, + 2.44140625e-07, + 1.220703125e-07, + 6.103515625e-08, + 3.0517578125e-08, + 1.52587890625e-08, + 7.62939453125e-09, + 3.814697265625e-09, + 1.9073486328125e-09, + 9.5367431640625e-10, + 4.76837158203125e-10, + 2.384185791015625e-10, + 1.1920928955078125e-10, + 5.960464477539063e-11, + 2.980232238769531e-11, + 1.4901161193847657e-11 + ] + }, + "residual_rms_px": 0.0, + "residual_median_px": 0.0, + "residual_max_px": 0.0, + "sigma2_normalized": 9.648909021380052e-32 + }, + "camera_pose": { + "world_to_camera": { + "rotation_matrix": [ + [ + 0.7478234767913818, + 0.5858157873153687, + -0.3123779296875 + ], + [ + 0.6608203053474426, + -0.6115613579750061, + 0.43509677052497864 + ], + [ + 0.06384828686714172, + -0.5318012237548828, + -0.8444588780403137 + ] + ], + "translation_m": [ + -38.69017028808594, + -76.18257904052734, + 733.07861328125 + ], + "rvec_rad": [ + 3.428568125507585, + 1.3340777852363335, + -0.2659620236785496 + ] + }, + "camera_in_world": { + "position_m": [ + 32.47060012817383, + 365.9270935058594, + 640.1156005859375 + ], + "position_mm": [ + 32470.599609375, + 365927.09375, + 640115.625 + ], + "orientation_deg": { + "roll": -147.79916381835938, + "pitch": -3.660727574305826, + "yaw": 41.46568298339844 + } + }, + "uncertainty": { + "pose_covariance_6x6": [ + [ + 8.629612631969329e-29, + 6.419343182143809e-30, + 1.7908295924670243e-29, + -7.073499368795134e-27, + 5.6187259819083295e-27, + -2.0666865847138868e-26 + ], + [ + 6.419343182143446e-30, + 3.051760893870683e-29, + 4.68511451162592e-29, + 1.5261835153152037e-27, + -5.226262008292569e-28, + -1.103919177657209e-26 + ], + [ + 1.7908295924670055e-29, + 4.685114511625924e-29, + 2.0846170216876133e-28, + 6.842689966147899e-29, + 3.484907360650631e-27, + -3.678530361558646e-26 + ], + [ + -7.073499368795157e-27, + 1.5261835153151694e-27, + 6.842689966146321e-29, + 8.882557859237887e-25, + -4.5534571307576935e-25, + 1.9082917888723267e-24 + ], + [ + 5.618725981908361e-27, + -5.226262008292345e-28, + 3.484907360650649e-27, + -4.553457130757711e-25, + 6.148749838486226e-25, + -9.837708583024273e-25 + ], + [ + -2.0666865847138762e-26, + -1.1039191776572181e-26, + -3.678530361558645e-26, + 1.9082917888723113e-24, + -9.837708583024117e-25, + 1.3630824927229218e-23 + ] + ], + "parameter_std": { + "rvec_std_deg": [ + 5.322532023987312e-13, + 3.1651761469334046e-13, + 8.272480883107961e-13 + ], + "tvec_std_m": [ + 9.424732282265575e-13, + 7.841396456299239e-13, + 3.691994708450869e-12 + ] + }, + "camera_center_std_m": [ + 6.236013873929964e-12, + 5.578343371266709e-12, + 2.895045264319711e-12 + ], + "camera_center_std_mm": [ + 6.2360138739299636e-09, + 5.578343371266708e-09, + 2.8950452643197107e-09 + ], + "orientation_std_deg": { + "roll": 4.550535817991357e-13, + "pitch": 4.763282335043431e-13, + "yaw": 1.775861640110364e-13 + } + } + }, + "observations": { + "markers": [ + { + "marker_id": 214, + "observed_center_px": [ + 1147.5, + 678.25 + ], + "projected_center_px": [ + 1147.5, + 678.25 + ], + "reprojection_error_px": 0.0, + "confidence": 0.1700115058329765 + }, + { + "marker_id": 215, + "observed_center_px": [ + 853.0, + 631.5 + ], + "projected_center_px": [ + 853.0, + 631.5 + ], + "reprojection_error_px": 0.0, + "confidence": 0.9372326698512834 + }, + { + "marker_id": 211, + "observed_center_px": [ + 975.5, + 549.5 + ], + "projected_center_px": [ + 975.5, + 549.5 + ], + "reprojection_error_px": 0.0, + "confidence": 0.8902520865668376 + } + ] + }, + "qa": { + "sanity_notes": [] + } +} \ No newline at end of file diff --git a/pipeline/render_3c_two_cam.csv b/pipeline/render_3c_two_cam.csv new file mode 100644 index 0000000..09483d8 --- /dev/null +++ b/pipeline/render_3c_two_cam.csv @@ -0,0 +1,17 @@ +id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by +camera 0,462.85,-447.38,679.21,-139.679,-3.166,49.062 +camera 1,278.74,-619.38,596.01,-128.837,-0.336,9.419 +122,202.24,-295.10,250.81,-28.414,-15.485,1.697,3 +198,126.58,-65.51,155.07,-3.661,-5.631,-2.911,3 +208,351.02,-86.53,-1.04,-1.448,-0.084,0.377,2 +210,-2.56,36.17,-52.21,1.418,0.510,0.839,2 +211,250.00,-10.00,3.00,68.426,25.579,18.293,3 +214,350.00,-10.00,3.00,-1.702,-0.340,0.760,3 +215,250.00,-90.00,3.00,2.880,-1.221,-1.765,3 +218,236.59,-245.24,189.57,-58.103,50.616,-52.876,1 +219,227.26,-329.71,232.26,-59.187,48.504,-50.906,1 +229,124.73,-146.21,161.04,-3.612,-3.364,-1.997,3 +243,122.58,-179.86,116.23,67.866,-8.370,-6.945,2 +244,246.50,-158.07,135.63,-68.544,55.107,-66.578,1 +246,179.04,-106.04,108.88,103.363,42.379,32.981,1 +247,143.22,-106.60,110.01,-28.304,-5.147,-2.319,1 diff --git a/pipeline/render_3c_two_cam.json b/pipeline/render_3c_two_cam.json new file mode 100644 index 0000000..6623ccb --- /dev/null +++ b/pipeline/render_3c_two_cam.json @@ -0,0 +1,225 @@ +{ + "metadata": { + "timestamp": "2026-05-29 07:01:38", + "reference_markers": [ + 211, + 215, + 214 + ], + "dict": "DICT_4X4_250", + "marker_size_mm": 25.0, + "description": "Two-camera joint optimization with triangulation" + }, + "cameras": [ + { + "id": "camera1", + "position_mm": [ + 462.85337477011745, + -447.3761981117614, + 679.2119813369037 + ], + "orientation_deg": { + "roll": -139.67859744771047, + "pitch": -3.165957561501241, + "yaw": 49.06230550849313 + } + }, + { + "id": "camera2", + "position_mm": [ + 278.74292453701025, + -619.3816023355497, + 596.013403520274 + ], + "orientation_deg": { + "roll": -128.8365839999356, + "pitch": -0.33589695340564535, + "yaw": 9.419081380244078 + } + } + ], + "markers": [ + { + "id": 122, + "position_mm": [ + 202.24261474609375, + -295.09710693359375, + 250.81494140625 + ], + "orientation_deg": { + "roll": -28.41441452710221, + "pitch": -15.485467478547452, + "yaw": 1.6970935429672367 + } + }, + { + "id": 198, + "position_mm": [ + 126.584228515625, + -65.51023864746094, + 155.06854248046875 + ], + "orientation_deg": { + "roll": -3.660633208127074, + "pitch": -5.630630889795624, + "yaw": -2.9106432706678698 + } + }, + { + "id": 208, + "position_mm": [ + 351.0157443651476, + -86.53427022011029, + -1.0397490394067344 + ], + "orientation_deg": { + "roll": -1.4484575811662157, + "pitch": -0.08375253351626927, + "yaw": 0.37677851429577486 + } + }, + { + "id": 210, + "position_mm": [ + -2.558166926849015, + 36.16561975926857, + -52.21100279675572 + ], + "orientation_deg": { + "roll": 1.4182725874800994, + "pitch": 0.5101505675200076, + "yaw": 0.8388746917381826 + } + }, + { + "id": 211, + "position_mm": [ + 250.00003051757812, + -10.000012397766113, + 3.0000078678131104 + ], + "orientation_deg": { + "roll": 68.42584362262588, + "pitch": 25.578734156462517, + "yaw": 18.29336709620276 + } + }, + { + "id": 214, + "position_mm": [ + 350.0, + -9.999968528747559, + 2.999967336654663 + ], + "orientation_deg": { + "roll": -1.7021011527964998, + "pitch": -0.34049805661256133, + "yaw": 0.7603837134528649 + } + }, + { + "id": 215, + "position_mm": [ + 250.0, + -90.00000762939453, + 3.000002145767212 + ], + "orientation_deg": { + "roll": 2.879885512023364, + "pitch": -1.2207582699857618, + "yaw": -1.7652611699290457 + } + }, + { + "id": 218, + "position_mm": [ + 236.59325735949972, + -245.23626778778672, + 189.57266262534728 + ], + "orientation_deg": { + "roll": -58.10323420416955, + "pitch": 50.61599751527859, + "yaw": -52.875746653538656 + } + }, + { + "id": 219, + "position_mm": [ + 227.2649738848997, + -329.7144822031666, + 232.2572485343396 + ], + "orientation_deg": { + "roll": -59.18660506982057, + "pitch": 48.503782448589995, + "yaw": -50.906238173493115 + } + }, + { + "id": 229, + "position_mm": [ + 124.72924041748047, + -146.21078491210938, + 161.03932189941406 + ], + "orientation_deg": { + "roll": -3.6119417177489486, + "pitch": -3.3643207255933993, + "yaw": -1.9966876167092664 + } + }, + { + "id": 243, + "position_mm": [ + 122.57701769337837, + -179.85790574360627, + 116.23497462026722 + ], + "orientation_deg": { + "roll": 67.86582375271519, + "pitch": -8.37046200567875, + "yaw": -6.945220224171688 + } + }, + { + "id": 244, + "position_mm": [ + 246.4997454888863, + -158.06502830092427, + 135.62936814972826 + ], + "orientation_deg": { + "roll": -68.54419573537868, + "pitch": 55.10689840067641, + "yaw": -66.57844357425445 + } + }, + { + "id": 246, + "position_mm": [ + 179.03805942690053, + -106.03594119519106, + 108.88294827910639 + ], + "orientation_deg": { + "roll": 103.36293213539558, + "pitch": 42.37920301941833, + "yaw": 32.98079690795832 + } + }, + { + "id": 247, + "position_mm": [ + 143.22372509352726, + -106.60064380982665, + 110.0127892418814 + ], + "orientation_deg": { + "roll": -28.30352249482726, + "pitch": -5.146503410532437, + "yaw": -2.318781544830814 + } + } + ] +} \ No newline at end of file diff --git a/pipeline/render_3c_two_cam_annotated.jpg b/pipeline/render_3c_two_cam_annotated.jpg new file mode 100644 index 0000000..f583a10 Binary files /dev/null and b/pipeline/render_3c_two_cam_annotated.jpg differ diff --git a/pipeline/render_3c_two_cam_overlay.png b/pipeline/render_3c_two_cam_overlay.png new file mode 100644 index 0000000..a8139a8 Binary files /dev/null and b/pipeline/render_3c_two_cam_overlay.png differ diff --git a/pipeline/run_pipeline_3.bat b/pipeline/run_pipeline_3.bat new file mode 100644 index 0000000..dc54f45 --- /dev/null +++ b/pipeline/run_pipeline_3.bat @@ -0,0 +1,10 @@ + +python3 1_detect_aruco_observations.py --image render_3a.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . +python3 1_detect_aruco_observations.py --image render_3b.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . +python3 1_detect_aruco_observations.py --image render_3c.png -npz render.npz -robot ../robot.json -cameraId cam1 -outDir . + + + +python3 2_estimate_camera_from_observations.py --robot ../robot.json --i render_3a_aruco_detection.json --outDir "C:/Users/kech/SynologyDrive/2026-AppServer-AppRobot/appRobotRendering/pipeline/" +python3 2_estimate_camera_from_observations.py --robot ../robot.json --i render_3b_aruco_detection.json --outDir "C:/Users/kech/SynologyDrive/2026-AppServer-AppRobot/appRobotRendering/pipeline/" +python3 2_estimate_camera_from_observations.py --robot ../robot.json --i render_3c_aruco_detection.json --outDir "C:/Users/kech/SynologyDrive/2026-AppServer-AppRobot/appRobotRendering/pipeline/" diff --git a/pipeline/run_readTwoMarkers.py b/pipeline/run_readTwoMarkers.py new file mode 100644 index 0000000..36f6394 --- /dev/null +++ b/pipeline/run_readTwoMarkers.py @@ -0,0 +1 @@ +python3 readTwoImages.py -i render_3c.png -i render_3b.png -npz render.npz -npz render.npz -settings settingsReadTwoMarkers.json diff --git a/pipeline/settingsReadTwoMarkers.json b/pipeline/settingsReadTwoMarkers.json new file mode 100644 index 0000000..f2cb432 --- /dev/null +++ b/pipeline/settingsReadTwoMarkers.json @@ -0,0 +1,16 @@ +{ "coordinateSystem":{ + "MarkersUsed":"DICT_4X4_250", + "KnownMarkers": + { + "210": [0.020, -0.020, 0.003], + "211": [0.250, -0.010, 0.003], + "215": [0.250, -0.090, 0.003], + "214": [0.350, -0.010, 0.003], + "208": [0.350, -0.090, 0.003], + "206": [0.650, -0.010, 0.003], + "205": [0.750, -0.090, 0.003], + "207": [0.750, -0.010, 0.003], + "217": [0.650, -0.090, 0.003] + } + } +} \ No newline at end of file diff --git a/render.png b/render.png deleted file mode 100644 index acb9a3d..0000000 Binary files a/render.png and /dev/null differ diff --git a/robot.json b/robot.json index 5b0cd24..d7f69ab 100644 --- a/robot.json +++ b/robot.json @@ -16,7 +16,13 @@ "renderingInfo": { "width": 1280, "height": 720, - "cameraPosition": [370, -600, 500], + "cameraPosition__1": [-10, -800, 500], + "cameraPosition__2": [-500, 300, 1200], + "cameraPosition__3": [-200, -900, 200], + "cameraPosition__4": [1200, 200, 300], + "cameraPosition_a":[-300, -800,500], + "cameraPosition":[300, -700,500], + "cameraPosition_c":[600, -500,600], "cameraTarget": [210, -180, 180], "cameraUpVector": [0, 0, 1], "lightPosition": [-500, -500, 500], @@ -78,10 +84,19 @@ } }, "defaultPosition": { - "x": 100, - "y": 30, - "z": -30, - "a": -120, + "x": 10, + "y": 4, + "z": 20, + "a": 10, + "b": 2, + "c": 9, + "e": 1 + }, + "defaultPosition____": { + "x": 140, + "y": 46, + "z": -70, + "a": 120, "b": 22, "c": 91, "e": 10 @@ -95,22 +110,22 @@ "c": null, "e": null }, - "multiview_quality": { - "combine_mode": "mean", - "size_ref_px": 50.0, - "border_ref_px": 120.0, - "center_ref_norm": 0.01, - "sharpness_ref": 2500.0, - "homography_ref": 0.18, - "size_factor": 0.01, - "aspect_factor": 0.01, - "border_factor": 0.01, - "center_factor": 0.01, - "sharpness_factor": 0.01, - "homography_factor": 0.01, - "normal_visibility_factor": 0.01, - "spin_factor": 0.01, - "weight_floor": 0.01 + "multiview_calculation": { + "combine_mode": "mean", + "size_ref_px": 50.0, + "border_ref_px": 120.0, + "center_ref_norm": 0.01, + "sharpness_ref": 2500.0, + "homography_ref": 0.18, + "size_factor": 0.3, + "aspect_factor": 0.3, + "border_factor": 0.01, + "center_factor": 0.01, + "sharpness_factor": 0.5, + "homography_factor": 0.2, + "normal_visibility_factor": 0.01, + "spin_factor": 0.3, + "weight_floor": 0.3 }, "movements": { "x": null, diff --git a/vibeCoding/29.5.txt b/vibeCoding/29.5.txt deleted file mode 100644 index 6a464c2..0000000 --- a/vibeCoding/29.5.txt +++ /dev/null @@ -1,2351 +0,0 @@ -== MultiView == - -Aus mehreren Bildern von einem Roboter solle die Pose (die Stellung der Gelenke) erkannt werden. - -Dazu existiert schon jede Menge Code -* roboter.json > Info Datei über alle Joings des Roboters. Hier sind auch Render-Informationen für andere Programme hinterlegt. Das läuft stabil und soll nicht ohne Grund verändert werden. Wenn du werte nicht brauchst, ignoriere sie. Wenn du zusätzliche Infos dort speichern willst, sag das. -* 1_detect_aruco_observations.py > Macht openCV Bilderkennung. Liefert pro Datei alle gefundenen Arucos und ArucoCandidates mit Confidence-Level. -* 1_detect_aruco_observations.py erstellt pro png eine Datei render_1a_aruco_detection.json mit allen Markern und Confidence-Leveln. Hier das Beispiel einer solchen Datei. -* 2_Multiview.py > Hier arbeite ich dran, und hier bin ich noch nicht zufrieden. - -Ziel des nächsten Schritts: Baue eine besser Version von 2_Multiview. Es sollen nur die ..aruco_detection.json und das robot.json genommen werden, und daraus die Position des Roboters ermittelt werden. Der Ansatz Simultane Multiview-Optimierung gefällt mir gut. Was mir noch nicht gut gefällt. - -(1). Es ist mindestens ein Fehler drinnen. multiview_pose.json und multiview_pose_summary.json zeigen unterschiedliche werte an. Ich hätte in der _summary die zusammengefassten werte erwartet. - -(2) Die Gewichtung der Arucos ist noch nicht perfekt. Ich will eigentlich den Abstand und die optische-Schärfe, Grösse der Arucos mit berücksichtigen. Grössere Arucos sollen mehr Gewicht erhalten. Schlecht ausgerichtete Arucos sollen weniger Gewicht erhalten. - -(3) Siehst du eine Möglichkeit, die Orientierung (normal und spin) der Arucos mit in die Gewichtung einfliessen zu lassnen? Hintergrund: auf einem gedrehten Bauteil sind die Arucos gedreht. Hier bin ich unsicher, ob das überhaupt möglich ist. - - -Egal was du machst: Lösche nicht einfach code, wenn du nicht genau weisst wofür er ist. Es ist einiges an Arbeit in diesen Code gegangen, behandel ihn entsprechend. - -=== roboter.json === -{ - "coordinateSystem": { - "handedness": "right", - "x": "right", - "y": "backward", - "z": "up" - }, - "units": { - "length": "mm", - "rotation": "degree" - }, - "vision_config": { - "MarkerType": "DICT_4X4_250", - "MarkerSize": 0.025 - }, - "renderingInfo": { - "width": 1280, - "height": 720, - "cameraPosition": [370, -600, 500], - "cameraTarget": [210, -180, 180], - "cameraUpVector": [0, 0, 1], - "lightPosition": [-500, -500, 500], - "lightTarget": [0, 0, 0], - "lightUpVector": [0, 0, 1], - "metric": "mm", - "showSkeleton": true, - "showMarkers": true, - "backgroundColor": [0.70, 0.85, 1.0], - "backgroundStrength": 0.20, - "sunEnergy": 0.35, - "areaEnergy": 120, - "exposure": -1.5, - "materials": { - "wood": { - "baseColor": [0.72, 0.52, 0.33], - "roughness": 0.85, - "metallic": 0.0 - }, - "plaWhite": { - "baseColor": [0.95, 0.95, 0.95], - "roughness": 0.45, - "metallic": 0.0 - }, - "steel": { - "baseColor": [0.72, 0.72, 0.75], - "roughness": 0.25, - "metallic": 1.0 - }, - "powderCoatBlue": { - "baseColor": [0.15, 0.25, 0.7], - "roughness": 0.55, - "metallic": 0.0 - }, - "defaultPlastic": { - "baseColor": [0.95, 0.95, 0.95], - "roughness": 0.4, - "metallic": 0.0 - }, - "skeletonRed": { - "baseColor": [0.85, 0.20, 0.20], - "roughness": 0.35, - "metallic": 0.0 - }, - "markerBlack": { - "baseColor": [0.04, 0.04, 0.04], - "roughness": 0.80, - "metallic": 0.0 - } - }, - "skeletonDefaults": { - "radius": 4, - "color": [0.85, 0.20, 0.20] - }, - "markerDefaults": { - "size": 25, - "thickness": 1, - "color": [0.04, 0.04, 0.04] - } - }, - "defaultPosition": { - "x": 100, - "y": 30, - "z": -30, - "a": -120, - "b": 22, - "c": 91, - "e": 10 - }, - "recognized": { - "x": null, - "y": null, - "z": null, - "a": null, - "b": null, - "c": null, - "e": null - }, - "movements": { - "x": null, - "y": null, - "z": null, - "a": null, - "b": null, - "c": null, - "e": null - }, - "links": { - "Board": { - "parent": null, - "size": [1000, 200, 25], - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - "skeleton": { - "from": [0, 0, 16], - "to": [1000, 0, 16], - "radius": 4, - "color": [0.85, 0.20, 0.20] - }, - "markers":[ - {"id":210,"position":[20, -20, 0.3], "normal":[0,0,1]}, - {"id":211,"position":[250, -10, 0.3], "normal":[0,0,1]}, - {"id":215,"position":[250, -90, 0.3], "normal":[0,0,1]}, - {"id":214,"position":[350, -10, 0.3], "normal":[0,0,1]}, - {"id":208,"position":[350, -90, 0.3], "normal":[0,0,1]}, - {"id":206,"position":[650, -10, 0.3], "normal":[0,0,1]}, - {"id":205,"position":[750, -90, 0.3], "normal":[0,0,1]}, - {"id":207,"position":[750, -10, 0.3], "normal":[0,0,1]}, - {"id":217,"position":[650, -90, 0.3], "normal":[0,0,1]} - ], - "model": [ - { - "stlFile": "surfaces/Board.stl", - "originOfModel": [0, 0, 0], - "rotationOfModelDegree": [0, 0, -90], - "material": "wood" - }, - { - "stlFile": "surfaces/BoardRail.stl", - "originOfModel": [0, 0, 0], - "rotationOfModelDegree": [0, 0, -90], - "material": "steel" - } - ] - }, - "Base": { - "parent": "Board", - "size": [150, 200, 150], - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - "jointToParent": { - "name": "Slider", - "type": "linear", - "axis": [1, 0, 0], - "origin": [0, 0, 16], - "rotation": [0, 0, 0], - "variable": "x" - }, - "skeleton": { - "from": [0, 108, 45], - "to": [110, 108, 45], - "radius": 4, - "color": [0.20, 0.80, 0.20] - }, - "markers": [ - ], - "model": [ - { - "stlFile": "surfaces/Base.stl", - "originOfModel": [-30, 0, -35], - "rotationOfModelDegree": [0, 0, 0], - "material": "plaWhite" - } - ] - }, - "Arm1": { - "parent": "Base", - "size": [70, 250, 70], - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - "jointToParent": { - "name": "Joint1", - "type": "revolute", - "axis": [-1, 0, 0], - "origin": [110, 108, 45], - "rotation": [0, 0, 0], - "variable": "y" - }, - "skeleton": { - "from": [0, 0, 0], - "to": [0, -250, 0], - "radius": 4, - "color": [0.20, 0.20, 0.90] - }, - "markers": [ - { - "id": 198, - "name": "aruco_198", - "position": [0, -160, 35], - "normal": [0, 0, 1], - "size": 25, - "spin": 0 - }, - { - "id": 229, - "name": "aruco_229", - "position": [0, -250, 35], - "normal": [0, 0, 1], - "size": 25, - "spin": 0 - }, - { - "id": 242, - "name": "aruco_242", - "position": [0, -250, -35], - "normal": [0, 0, -1], - "size": 25, - "spin": 0 - }, - { - "id": 243, - "name": "aruco_243", - "position": [0, -285, 0], - "normal": [0, -1, 0], - "size": 25, - "spin": 0 - } - ], - "model": [ - { - "stlFile": "surfaces/Holm.stl", - "originOfModel__": [-25,29,-28.5], - "originOfModel": [-29,25,28.5], - "rotationOfModelDegree__": [0, 0, 0], - "rotationOfModelDegree": [180, 0, -90], - "material": "powderCoatBlue" - } - ] - }, - "Ellbow": { - "parent": "Arm1", - - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - - "jointToParent": { - "name": "Joint2", - "type": "revolute", - "axis": [-1, 0, 0], - "origin": [0, -250, 0], - "rotation": [0, 0, 0], - "variable": "z" - }, - - "skeleton": { - "from": [0, 0, 0], - "to": [90, 0, 0], - "radius": 4, - "color": [0.90, 0.20, 0.20] - }, - "model": [ - { - "stlFile": "surfaces/Ellebogen.stl", - "originOfModel": [90,0,0], - "rotationOfModelDegree": [0,-90,-90], - "material": "defaultPlastic" - } - ], - "markers": [ - { - "id": 244, - "name": "aruco_244", - "position": [125, 0, 0], - "normal": [1, 0, 0], - "size": 25, - "spin": 0 - }, - { - "id": 245, - "name": "aruco_245", - "position": [90, 0, -35], - "normal": [0, 0, -1], - "size": 25, - "spin": 0 - }, - { - "id": 246, - "name": "aruco_246", - "position": [90, 0, 35], - "normal": [0, 0, 1], - "size": 25 - }, - { - "id": 247, - "name": "aruco_247", - "position": [52.5, 0, 35], - "normal": [0, 0, 1], - "size": 25 - } - ] - - }, - "Arm2": { - "parent": "Ellbow", - - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - - "jointToParent": { - "name": "Joint3", - "type": "revolute", - "axis": [0, -1, 0], - "origin": [90, 0, 0], - "rotation": [0, 0, 0], - "variable": "a" - }, - - "skeleton": { - "from": [0, 0, 0], - "to": [0, -250, 0], - "radius": 4, - "color": [0.95, 0.85, 0.20] - }, - "model": [ - { - "stlFile": "surfaces/Unterarm.stl", - "originOfModel": [0,-250,0], - "rotationOfModelDegree": [180, 0, -90], - "material": "defaultPlastic" - } - ], - "markers":[ - - {"id":124, "position":[24.75, -112, -24.75],"normal":[1,0,-1]}, - {"id":122, "name": "aruco_122", "position":[-35,-112,0], "normal":[-1,0,0]}, - {"id":218, "name": "aruco_218", "position":[35,-112,0], "normal":[1,0,0]}, - {"id":122, "name": "aruco_122", "position":[0, -182, 30],"normal":[0,0,1]}, - {"id":101, "name": "aruco_122", "position":[ 24.75, -182, -24.75],"normal":[ 1,0,-1]}, - {"id":102, "name": "aruco_122", "position":[-24.75, -182, -24.75],"normal":[-1,0,-1]}, - {"id":124, "name": "aruco_124", "position":[-35,-219,0], "normal":[-1,0,0]}, - {"id":219, "name": "aruco_219", "position":[35,-219,0], "normal":[1,0,0]} - - ] - }, - "Hand": { - "parent": "Arm2", - - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - - "jointToParent": { - "name": "Joint4", - "type": "revolute", - "axis": [1, 0, 0], - "origin": [0, -250, 0], - "rotation": [0, 0, 0], - "variable": "b" - }, - - "skeleton": { - "from": [0, 0, 0], - "to": [0, -35, 0], - "radius": 4, - "color": [0.95, 0.55, 0.15] - } - }, - "Palm": { - "parent": "Hand", - - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - - "jointToParent": { - "name": "Joint3", - "type": "revolute", - "axis": [0, -1, 0], - "origin": [0, 0, 0], - "rotation": [0, 0, 0], - "variable": "c" - }, - - "skeleton": { - "from": [-50, -35, 0], - "to": [50, -35, 0], - "radius": 7, - "color": [0.95, 0.20, 0.20] - } - }, - "FingerA": { - "parent": "Palm", - "size": [80, 60, 20], - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - "jointToParent": { - "name": "Slider", - "type": "linear", - "axis": [1, 0, 0], - "origin": [4, -35,0], - "rotation": [0, 0, 0], - "variable": "e" - }, - "skeleton": { - "from": [0, 0,0], - "to": [0, -60, 0], - "radius": 4, - "color": [0.20, 0.80, 0.20] - }, - "model": [ - { - "stlFile": "surfaces/Finger.stl", - "originOfModel": [24,0,-9.1], - "rotationOfModelDegree": [90, -90,0], - "material": "defaultPlastic" - } - ] - }, - "FingerB": { - "parent": "Palm", - "size": [80, 60, 20], - "mountPosition": [0, 0, 0], - "mountRotation": [0, 0, 0], - "jointToParent": { - "name": "Slider", - "type": "linear", - "axis": [-1, 0, 0], - "origin": [-4, -35,0], - "rotation": [0, 0, 0], - "variable": "e" - }, - "skeleton": { - "from": [0, 0,0], - "to": [0, -60, 0], - "radius": 4, - "color": [0.20, 0.80, 0.20] - }, - "model": [ - { - "stlFile": "surfaces/Finger.stl", - "originOfModel": [-24,0,9.1], - "rotationOfModelDegree": [90, 90,0], - "material": "defaultPlastic" - } - ] - } - } -} - - -=== 1_detect_aruco_observations.py === - -#!/usr/bin/env python3 - -import argparse -import json -import os -import hashlib -import time -import uuid -from typing import Dict, Any - -import cv2 -import numpy as np - - -# ------------------------------------------------------------ -# Utilities -# ------------------------------------------------------------ - -def load_intrinsics_npz(npz_path: str): - data = np.load(npz_path) - - for k in ('camera_matrix', 'mtx', 'K'): - if k in data: - K = data[k].astype(np.float32) - break - else: - raise KeyError('Camera matrix not found in npz') - - for k in ('dist_coeffs', 'dist', 'D'): - if k in data: - D = data[k].astype(np.float32).reshape(-1, 1) - break - else: - D = np.zeros((5, 1), dtype=np.float32) - - return K, D - - -# ------------------------------------------------------------ - -def load_robot_vision_config(robot_json_path: str): - - with open(robot_json_path, 'r', encoding='utf-8') as f: - robot = json.load(f) - - vision_config = robot.get('vision_config', {}) - - marker_type = vision_config.get('MarkerType', 'DICT_4X4_250') - marker_size = float(vision_config.get('MarkerSize', 0.025)) - - return { - 'MarkerType': marker_type, - 'MarkerSize': marker_size - } - - -# ------------------------------------------------------------ - -def get_aruco_detector(dict_name: str): - - mapping = { - 'DICT_4X4_250': cv2.aruco.DICT_4X4_250, - 'DICT_5X5_100': cv2.aruco.DICT_5X5_100, - 'DICT_6X6_250': cv2.aruco.DICT_6X6_250, - 'DICT_ARUCO_ORIGINAL': cv2.aruco.DICT_ARUCO_ORIGINAL, - } - - dict_id = mapping.get(dict_name, cv2.aruco.DICT_4X4_250) - - dictionary = cv2.aruco.getPredefinedDictionary(dict_id) - - try: - params = cv2.aruco.DetectorParameters() - except Exception: - params = cv2.aruco.DetectorParameters_create() - - try: - detector = cv2.aruco.ArucoDetector(dictionary, params) - return detector, None - - except Exception: - return None, (dictionary, params) - - -# ------------------------------------------------------------ - -def detect_markers(image, detector_tuple): - - detector, fallback = detector_tuple - - if detector is not None: - - corners, ids, rejected = detector.detectMarkers(image) - - else: - - dictionary, params = fallback - - corners, ids, rejected = cv2.aruco.detectMarkers( - image, - dictionary, - parameters=params - ) - - return corners, ids, rejected - - -# ------------------------------------------------------------ - -def hash_file(path): - - sha = hashlib.sha256() - - with open(path, 'rb') as f: - - while True: - - chunk = f.read(1024 * 1024) - - if not chunk: - break - - sha.update(chunk) - - return sha.hexdigest() - - -# ------------------------------------------------------------ - -def polygon_mask(shape, polygon): - - mask = np.zeros(shape, dtype=np.uint8) - - cv2.fillConvexPoly( - mask, - polygon.astype(np.int32), - 255 - ) - - return mask - - -# ------------------------------------------------------------ - -def shrink_polygon(points, scale=0.80): - - center = np.mean(points, axis=0) - - shrunk = center + (points - center) * scale - - return shrunk.astype(np.float32) - - -# ------------------------------------------------------------ - -def compute_sharpness(gray_image, polygon): - - shrunk = shrink_polygon(polygon, scale=0.80) - - mask = polygon_mask(gray_image.shape, shrunk) - - pixels = gray_image[mask == 255] - - if pixels.size == 0: - return 0.0 - - temp = np.zeros_like(gray_image) - temp[mask == 255] = gray_image[mask == 255] - - lap = cv2.Laplacian(temp, cv2.CV_64F) - - values = lap[mask == 255] - - if values.size == 0: - return 0.0 - - return float(values.var()) - - -# ------------------------------------------------------------ - -def compute_contrast(gray_image, polygon): - - shrunk = shrink_polygon(polygon, scale=0.80) - - mask = polygon_mask(gray_image.shape, shrunk) - - pixels = gray_image[mask == 255] - - if pixels.size == 0: - - return { - 'p05': 0.0, - 'p95': 0.0, - 'dynamic_range': 0.0, - 'mean_gray': 0.0, - 'std_gray': 0.0 - } - - p05 = float(np.percentile(pixels, 5)) - p95 = float(np.percentile(pixels, 95)) - - return { - 'p05': p05, - 'p95': p95, - 'dynamic_range': float(p95 - p05), - 'mean_gray': float(np.mean(pixels)), - 'std_gray': float(np.std(pixels)) - } - - -# ------------------------------------------------------------ - -def compute_edge_ratio(corners): - - edge_lengths = [] - - for k in range(4): - - p1 = corners[k] - p2 = corners[(k + 1) % 4] - - edge_lengths.append( - float(np.linalg.norm(p1 - p2)) - ) - - edge_ratio = ( - max(edge_lengths) / - max(1e-6, min(edge_lengths)) - ) - - return edge_ratio, edge_lengths - - -# ------------------------------------------------------------ - -def compute_geometry_metrics(center, corners, width, height): - - image_center = np.array( - [width / 2.0, height / 2.0], - dtype=np.float32 - ) - - dist_center = np.linalg.norm(center - image_center) - - max_dist = np.linalg.norm(image_center) - - distance_center_norm = float( - dist_center / max(1e-6, max_dist) - ) - - min_x = np.min(corners[:, 0]) - max_x = np.max(corners[:, 0]) - - min_y = np.min(corners[:, 1]) - max_y = np.max(corners[:, 1]) - - border_distance_px = float(min( - min_x, - min_y, - width - max_x, - height - max_y - )) - - return { - 'distance_to_center_norm': distance_center_norm, - 'distance_to_border_px': border_distance_px - } - - -# ------------------------------------------------------------ - -def compute_confidence( - area_px, - sharpness, - edge_ratio, - dynamic_range, - border_distance_px -): - - score = 1.0 - - # area - score *= min(1.0, area_px / 1500.0) - - # sharpness - score *= min(1.0, sharpness / 120.0) - - # edge distortion - score *= 1.0 / max(1.0, edge_ratio) - - # contrast - score *= min(1.0, dynamic_range / 80.0) - - # border distance - score *= min(1.0, max(0.0, border_distance_px) / 50.0) - - score = max(0.0, min(1.0, score)) - - return float(score) - - -# ------------------------------------------------------------ - -def main(): - - parser = argparse.ArgumentParser() - - parser.add_argument( - '-i', - '--image', - required=True - ) - - parser.add_argument( - '-npz', - '--intrinsics', - required=True - ) - - parser.add_argument( - '-robot', - '--robot', - required=True - ) - - parser.add_argument( - '-cameraId', - '--cameraId', - required=True, - type=str - ) - - parser.add_argument( - '-outDir', - '--outDir', - required=True - ) - - args = parser.parse_args() - - os.makedirs(args.outDir, exist_ok=True) - - # -------------------------------------------------------- - # Load robot vision config - # -------------------------------------------------------- - - vision_config = load_robot_vision_config(args.robot) - - marker_type = vision_config['MarkerType'] - marker_size = vision_config['MarkerSize'] - - # -------------------------------------------------------- - # Load image - # -------------------------------------------------------- - - image = cv2.imread(args.image) - - if image is None: - raise RuntimeError(f'Cannot read image: {args.image}') - - gray = cv2.cvtColor( - image, - cv2.COLOR_BGR2GRAY - ) - - height, width = gray.shape[:2] - - # -------------------------------------------------------- - # Intrinsics - # -------------------------------------------------------- - - K, D = load_intrinsics_npz(args.intrinsics) - - # -------------------------------------------------------- - # Detection - # -------------------------------------------------------- - - detector_tuple = get_aruco_detector(marker_type) - - corners_list, ids, rejected = detect_markers( - gray, - detector_tuple - ) - - detections = [] - - # -------------------------------------------------------- - # Valid detections - # -------------------------------------------------------- - - if ids is not None: - - ids = ids.flatten().tolist() - - for i, marker_id in enumerate(ids): - - corners = corners_list[i].reshape((4, 2)).astype(np.float32) - - center = corners.mean(axis=0) - - area_px = float( - cv2.contourArea(corners) - ) - - perimeter_px = float( - cv2.arcLength(corners, True) - ) - - edge_ratio, edge_lengths = compute_edge_ratio(corners) - - sharpness = compute_sharpness( - gray, - corners - ) - - contrast = compute_contrast( - gray, - corners - ) - - geometry = compute_geometry_metrics( - center, - corners, - width, - height - ) - - confidence = compute_confidence( - area_px=area_px, - sharpness=sharpness, - edge_ratio=edge_ratio, - dynamic_range=contrast['dynamic_range'], - border_distance_px=geometry['distance_to_border_px'] - ) - - detection = { - - 'observation_id': str(uuid.uuid4()), - - 'type': 'aruco', - - 'marker_id': int(marker_id), - - 'marker_size_m': marker_size, - - 'image_points_px': corners.tolist(), - - 'center_px': center.tolist(), - - 'quality': { - - 'area_px': area_px, - - 'perimeter_px': perimeter_px, - - 'sharpness': { - 'laplacian_var': sharpness - }, - - 'contrast': contrast, - - 'geometry': geometry, - - 'edge_ratio': edge_ratio, - - 'edge_lengths_px': edge_lengths - }, - - 'confidence': confidence - } - - detections.append(detection) - - # -------------------------------------------------------- - # Rejected candidates - # -------------------------------------------------------- - - rejected_candidates = [] - - if rejected is not None: - - for candidate in rejected: - - pts = candidate.reshape((-1, 2)).astype(np.float32) - - center = pts.mean(axis=0) - - area_px = float( - cv2.contourArea(pts) - ) - - rejected_candidates.append({ - - 'image_points_px': pts.tolist(), - - 'center_px': center.tolist(), - - 'area_px': area_px - }) - - # -------------------------------------------------------- - # Final output - # -------------------------------------------------------- - - output = { - - 'schema_version': '1.0', - - 'created_utc': time.strftime( - '%Y-%m-%dT%H:%M:%SZ', - time.gmtime() - ), - - 'vision_config': { - 'MarkerType': marker_type, - 'MarkerSize': marker_size - }, - - 'camera': { - - 'camera_id': args.cameraId, - - 'intrinsics_file': os.path.abspath(args.intrinsics), - - 'camera_matrix': K.tolist(), - - 'distortion_coefficients': D.reshape(-1).tolist() - }, - - 'image': { - - 'image_file': os.path.abspath(args.image), - - 'image_sha256': hash_file(args.image), - - 'width_px': int(width), - - 'height_px': int(height) - }, - - 'aruco': { - - 'dictionary': marker_type, - - 'num_detected_markers': len(detections), - - 'num_rejected_candidates': len(rejected_candidates) - }, - - 'detections': detections, - - 'rejected_candidates': rejected_candidates - } - - # -------------------------------------------------------- - # Output path - # -------------------------------------------------------- - - input_filename = os.path.basename(args.image) - - input_base = os.path.splitext(input_filename)[0] - - out_json = os.path.join( - args.outDir, - f'{input_base}_aruco_detection.json' - ) - - # -------------------------------------------------------- - # Save JSON - # -------------------------------------------------------- - - with open(out_json, 'w', encoding='utf-8') as f: - - json.dump( - output, - f, - indent=2 - ) - - print(f'Saved: {out_json}') - - -# ------------------------------------------------------------ - -if __name__ == '__main__': - main() - - -=== render_1a_aruco_detection.json === - -{ - "schema_version": "1.0", - "created_utc": "2026-05-28T19:21:53Z", - "vision_config": { - "MarkerType": "DICT_4X4_250", - "MarkerSize": 0.025 - }, - "camera": { - "camera_id": "cam1", - "intrinsics_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render.npz", - "camera_matrix": [ - [ - 1777.77783203125, - 0.0, - 640.0 - ], - [ - 0.0, - 1500.0, - 360.0 - ], - [ - 0.0, - 0.0, - 1.0 - ] - ], - "distortion_coefficients": [ - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 - ] - }, - "image": { - "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", - "image_sha256": "693cee15555027b57d05defcf84517eafed047372b0effa201fc0c3fbc9f664f", - "width_px": 1280, - "height_px": 720 - }, - "aruco": { - "dictionary": "DICT_4X4_250", - "num_detected_markers": 17, - "num_rejected_candidates": 411 - }, - "detections": [ - { - "observation_id": "00b95fef-f4ef-4c40-9fba-19831b071579", - "type": "aruco", - "marker_id": 102, - "marker_size_m": 0.025, - "image_points_px": [ - [ - 863.0, - 344.0 - ], - [ - 894.0, - 309.0 - ], - [ - 936.0, - 332.0 - ], - [ - 906.0, - 368.0 - ] - ], - "center_px": [ - 899.75, - 338.25 - ], - "quality": { - "area_px": 2225.5, - "perimeter_px": 190.7457504272461, - "sharpness": { - "laplacian_var": 3935.778766550373 - }, - "contrast": { - "p05": 14.0, - "p95": 185.0, - "dynamic_range": 171.0, - "mean_gray": 101.42780748663101, - "std_gray": 79.4179284235363 - }, - "geometry": { - "distance_to_center_norm": 0.3549750745296478, - "distance_to_border_px": 309.0 - }, - "edge_ratio": 1.0532483321651058, - "edge_lengths_px": [ - 46.75468063354492, - 47.88528060913086, - 46.86149978637695, - 49.24428939819336 - ] - }, - "confidence": 0.9494437061622057 - }, - { - "observation_id": "bc663284-6938-4f10-90f4-27d1370da670", - "type": "aruco", - "marker_id": 243, - "marker_size_m": 0.025, - "image_points_px": [ - [ - 524.0, - 300.0 - ], - [ - 558.0, - 275.0 - ], - [ - 577.0, - 317.0 - ], - [ - 544.0, - 342.0 - ] - ], - "center_px": [ - 550.75, - 308.5 - ], - "quality": { - "area_px": 1894.5, - "perimeter_px": 176.21891403198242, - "sharpness": { - "laplacian_var": 2678.6956247003295 - }, - "contrast": { - "p05": 25.0, - "p95": 191.0, - "dynamic_range": 166.0, - "mean_gray": 82.62843676355067, - "std_gray": 73.67721820744883 - }, - "geometry": { - "distance_to_center_norm": 0.14032743871212006, - "distance_to_border_px": 275.0 - }, - "edge_ratio": 1.1236297656439467, - "edge_lengths_px": [ - 42.20189666748047, - 46.097721099853516, - 41.400482177734375, - 46.51881408691406 - ] - }, - "confidence": 0.8899728634608616 - }, - { - "observation_id": "6d4d7de6-2133-49ad-a26d-567f5eed42ad", - "type": "aruco", - "marker_id": 210, - "marker_size_m": 0.025, - "image_points_px": [ - [ - 137.0, - 273.0 - ], - [ - 858.0, - 269.0 - ] - ], - "center_px": [ - 863.25, - 271.0 - ], - "area_px": 24.5 - } - ] -} - -=== 2_Multiview.py === - -#!/usr/bin/env python3 - -""" -============================================================ -STEP 2b — Simultane Multiview-Optimierung für Roboterpose -============================================================ - -Ziel: - Aus mehreren ArUco-Detektionsdateien die gemeinsame - Roboterpose (x,y,z,a,b,c,e) schätzen und jede Kamera-Pose - sowie Marker-Weltpositionen ausgeben. - -Eingabe: - --robot ../robot.json - --detections render_1a_aruco_detection.json render_1b_aruco_detection.json ... - --outDir . - -Ausgabe: - multiview_pose.json - -Hinweis: - Dieses Skript verwendet die Markerpositionen aus robot.json - als kinematische Constraints und optimiert gleichzeitig: - - Roboterzustand (x,y,z,a,b,c,e) - - Kameraextrinsische Parameter pro Bild - -""" - -import argparse -import datetime -import json -import math -import os -import time -from pathlib import Path -from typing import Any, Dict, List, Tuple - -import cv2 -import numpy as np -from scipy.optimize import least_squares - -STATE_KEYS = ["x", "y", "z", "a", "b", "c", "e"] - -# ------------------------------------------------------------------ -# Constraint definitions and validation -# ------------------------------------------------------------------ - -class ConstraintResult: - """Result of validating/applying a single constraint""" - def __init__(self, name: str, enabled: bool, reason: str = ""): - self.name = name - self.enabled = enabled - self.reason = reason - self.residuals = [] - - def __str__(self) -> str: - status = "✓ ENABLED" if self.enabled else "✗ DISABLED" - return f"{self.name:40s} {status:12s} {self.reason}" - - -def validate_constraints(robot: Dict[str, Any], robot_markers: Dict[int, Dict[str, Any]]) -> Dict[str, ConstraintResult]: - """ - Validate which constraints can be applied based on robot geometry. - Returns a dict of constraint_name -> ConstraintResult - """ - results = {} - - # --- Constraint 1: Rigid body distances within each link --- - rigid_body_result = ConstraintResult("RigidBodyDistances", False) - try: - rigid_body_count = 0 - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) >= 2: - rigid_body_count += 1 - if rigid_body_count >= 2: - rigid_body_result.enabled = True - rigid_body_result.reason = f"Found {rigid_body_count} links with 2+ markers each" - else: - rigid_body_result.reason = "Not enough rigid links with multiple markers" - except Exception as e: - rigid_body_result.reason = f"Error: {str(e)}" - results['RigidBodyDistances'] = rigid_body_result - - # --- Constraint 2: Fixed X-distances between links (rotation around X-axis) --- - inter_link_x_result = ConstraintResult("InterLinkXDistances", False) - try: - links_with_markers = set(m['link_name'] for m in robot_markers.values()) - x_rotated_links = [] - for link_name in ['Arm1', 'Ellbow']: - if link_name in links_with_markers: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) >= 1: - x_rotated_links.append(link_name) - if len(x_rotated_links) >= 2: - inter_link_x_result.enabled = True - inter_link_x_result.reason = f"Found {len(x_rotated_links)} X-rotation links: {', '.join(x_rotated_links)}" - else: - inter_link_x_result.reason = "Not enough X-rotation links" - except Exception as e: - inter_link_x_result.reason = f"Error: {str(e)}" - results['InterLinkXDistances'] = inter_link_x_result - - # --- Sanity check (not a hard constraint): Arm2 sin(a) dependency --- - arm2_sina_result = ConstraintResult("Arm2SinADependency", True, "Sanity check only (not enforced)") - try: - arm2_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm2'] - if len(arm2_markers) >= 2: - z_values = set(m['position_m'][2] for m in arm2_markers) - if len(z_values) > 1: - arm2_sina_result.enabled = True - arm2_sina_result.reason = "Multiple Z-values detected; sin(a) dependency confirmed" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "No Z-variation in Arm2 markers (cannot use sin(a) constraint)" - else: - arm2_sina_result.enabled = False - arm2_sina_result.reason = "Not enough Arm2 markers" - except Exception as e: - arm2_sina_result.reason = f"Error: {str(e)}" - results['Arm2SinADependency'] = arm2_sina_result - - return results - - -# ------------------------------------------------------------------ -# JSON helpers -# ------------------------------------------------------------------ - -def load_json(path: str) -> Dict[str, Any]: - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - - -def save_json(data: Dict[str, Any], path: Path) -> None: - with open(path, 'w', encoding='utf-8') as f: - json.dump(data, f, indent=2) - - -# ------------------------------------------------------------------ -# robot.json helpers -# ------------------------------------------------------------------ - -def resolve_scalar(value: Any, default: float = 0.0) -> float: - if value is None: - return default - if isinstance(value, (int, float)): - return float(value) - try: - return float(str(value).strip()) - except ValueError: - return default - - -def resolve_vector(value: Any, default_len: int = 3) -> Tuple[float, ...]: - if value is None: - return tuple(0.0 for _ in range(default_len)) - if isinstance(value, (int, float, str)): - return (resolve_scalar(value),) + tuple(0.0 for _ in range(default_len - 1)) - if isinstance(value, (list, tuple)): - resolved = [resolve_scalar(v) for v in value] - if len(resolved) < default_len: - resolved.extend([0.0] * (default_len - len(resolved))) - return tuple(resolved[:default_len]) - return tuple(0.0 for _ in range(default_len)) - - -def parse_metric_scale(robot: Dict[str, Any]) -> float: - rendering_info = robot.get('renderingInfo', {}) or {} - metric = rendering_info.get('metric', 'mm') - return 0.001 if str(metric).strip().lower() == 'mm' else 1.0 - - -def normalize_axis(axis: Any) -> np.ndarray: - vec = np.asarray(axis, dtype=np.float64) - if vec.shape != (3,): - vec = vec.reshape(-1)[:3] - norm = np.linalg.norm(vec) - return vec / max(norm, 1e-9) - - -def euler_deg_to_matrix(euler_deg: Any) -> np.ndarray: - x_deg, y_deg, z_deg = resolve_vector(euler_deg, 3) - x = math.radians(x_deg) - y = math.radians(y_deg) - z = math.radians(z_deg) - - cx = math.cos(x) - sx = math.sin(x) - cy = math.cos(y) - sy = math.sin(y) - cz = math.cos(z) - sz = math.sin(z) - - Rx = np.array([ - [1.0, 0.0, 0.0], - [0.0, cx, -sx], - [0.0, sx, cx] - ], dtype=np.float64) - - Ry = np.array([ - [cy, 0.0, sy], - [0.0, 1.0, 0.0], - [-sy, 0.0, cy] - ], dtype=np.float64) - - Rz = np.array([ - [cz, -sz, 0.0], - [sz, cz, 0.0], - [0.0, 0.0, 1.0] - ], dtype=np.float64) - - return Rz @ Ry @ Rx - - -def transform_from_translation_rotation(translation: Any, rotation_deg: Any) -> np.ndarray: - T = np.eye(4, dtype=np.float64) - pos = np.asarray(resolve_vector(translation, 3), dtype=np.float64) - T[:3, 3] = pos - T[:3, :3] = euler_deg_to_matrix(rotation_deg) - return T - - -def axis_angle_matrix(axis: Any, angle_deg: float) -> np.ndarray: - axis_vec = normalize_axis(axis) - theta = math.radians(angle_deg) - kx, ky, kz = axis_vec - c = math.cos(theta) - s = math.sin(theta) - v = 1.0 - c - R = np.array([ - [kx * kx * v + c, kx * ky * v - kz * s, kx * kz * v + ky * s], - [ky * kx * v + kz * s, ky * ky * v + c, ky * kz * v - kx * s], - [kz * kx * v - ky * s, kz * ky * v + kx * s, kz * kz * v + c] - ], dtype=np.float64) - T = np.eye(4, dtype=np.float64) - T[:3, :3] = R - return T - - -# ------------------------------------------------------------------ -# Kinematics and marker extraction -# ------------------------------------------------------------------ - -def extract_markers(robot: Dict[str, Any], scale: float) -> Dict[int, Dict[str, Any]]: - markers = {} - links = robot.get('links', {}) or {} - marker_defaults = (robot.get('renderingInfo', {}) or {}).get('markerDefaults', {}) or {} - default_size_mm = float(marker_defaults.get('size', 25.0)) - - for link_name, link_info in links.items(): - for marker in link_info.get('markers', []) or []: - marker_id = int(marker.get('id', -1)) - if marker_id < 0: - continue - - pos = resolve_vector(marker.get('position', [0, 0, 0]), 3) - size_mm = float(marker.get('size', default_size_mm)) - markers[marker_id] = { - 'marker_id': marker_id, - 'link_name': link_name, - 'position_m': np.asarray([pos[0] * scale, pos[1] * scale, pos[2] * scale], dtype=np.float64), - 'normal': normalize_axis(resolve_vector(marker.get('normal', [0, 0, 1]), 3)), - 'spin_deg': float(marker.get('spin', 0.0)), - 'size_m': size_mm * scale, - } - - return markers - - -def compute_marker_observation_quality( - corners_px: np.ndarray, - image_shape: Tuple[int, int] -) -> Dict[str, float]: - """ - Compute quality metrics for a marker observation based on: - - Orientation/distortion in the image - - Size (distance) to camera - - Returns dict with: - - 'orientation_quality': 0..1 (1 = frontal, 0 = very skewed) - - 'size_quality': 0..1 (1 = reasonable size, 0 = too small or too large) - - 'combined_quality': product of both - """ - if corners_px.shape[0] != 4: - return { - 'orientation_quality': 0.5, - 'size_quality': 0.5, - 'combined_quality': 0.25 - } - - # Compute edge lengths - corners = corners_px.astype(np.float64) - edges = [ - np.linalg.norm(corners[(i+1) % 4] - corners[i]) - for i in range(4) - ] - - # Orientation quality: low aspect ratio means frontal (1.0 = square) - aspect_ratio = max(edges) / (min(edges) + 1e-6) - # For aspect ratio 1.0->1, 1.5->0.8, 3.0->0.4, 5.0->0.2 - orientation_quality = max(0.1, 2.0 / (1.0 + aspect_ratio)) - - # Size quality: area-based - area_px = cv2.contourArea(corners.astype(np.int32)) - image_area = image_shape[0] * image_shape[1] - - # Ideal: marker should be 5-20% of image area - # Too small: <1%, too large: >40% - area_ratio = area_px / image_area - - if area_ratio < 0.01: - size_quality = 0.3 + area_ratio * 20 # linear growth 0-0.3 - elif area_ratio > 0.4: - size_quality = 0.3 + (1.0 - area_ratio) * 2.33 # linear decay from 1.0 - else: - # 1% to 40%: bell curve, max at ~5-20% - ideal_ratio = 0.10 - size_quality = 1.0 - (area_ratio - ideal_ratio) ** 2 / (0.15 ** 2) - size_quality = max(0.3, min(1.0, size_quality)) - - combined_quality = orientation_quality * size_quality - - return { - 'orientation_quality': float(orientation_quality), - 'size_quality': float(size_quality), - 'combined_quality': float(combined_quality) - } - - -def marker_plane_axes(normal: np.ndarray, spin_deg: float) -> Tuple[np.ndarray, np.ndarray]: - n = normalize_axis(normal) - candidate = np.array((0.0, 0.0, 1.0), dtype=np.float64) - if abs(np.dot(n, candidate)) > 0.99: - candidate = np.array((1.0, 0.0, 0.0), dtype=np.float64) - - x_dir = np.cross(candidate, n) - x_dir /= max(np.linalg.norm(x_dir), 1e-9) - y_dir = np.cross(n, x_dir) - - if abs(spin_deg) > 1e-6: - theta = math.radians(spin_deg) - cos_t = math.cos(theta) - sin_t = math.sin(theta) - x_rot = x_dir * cos_t + np.cross(n, x_dir) * sin_t + n * np.dot(n, x_dir) * (1.0 - cos_t) - y_rot = y_dir * cos_t + np.cross(n, y_dir) * sin_t + n * np.dot(n, y_dir) * (1.0 - cos_t) - return x_rot, y_rot - - return x_dir, y_dir - - -def marker_object_corners(marker: Dict[str, Any]) -> np.ndarray: - half = marker['size_m'] * 0.5 - x_dir, y_dir = marker_plane_axes(marker['normal'], marker['spin_deg']) - corners = np.stack([ - -x_dir * half + y_dir * half, - x_dir * half + y_dir * half, - x_dir * half - y_dir * half, - -x_dir * half - y_dir * half - ], axis=0) - return marker['position_m'].reshape(1, 3) + corners - - -def build_link_chain(robot: Dict[str, Any]) -> List[str]: - links = robot.get('links', {}) or {} - ordered: List[str] = [] - remaining = set(links.keys()) - - while remaining: - progress = False - for name in list(remaining): - parent = links[name].get('parent') - if not parent or parent in ordered: - ordered.append(name) - remaining.remove(name) - progress = True - if not progress: - raise RuntimeError('Cycle detected in robot link tree or missing parent link') - return ordered - - -def compute_link_transforms(robot: Dict[str, Any], state: Dict[str, float], scale: float) -> Dict[str, np.ndarray]: - links = robot.get('links', {}) or {} - ordered_links = build_link_chain(robot) - transforms: Dict[str, np.ndarray] = {} - - for link_name in ordered_links: - link_info = links[link_name] or {} - parent_name = link_info.get('parent') - parent_transform = transforms[parent_name] if parent_name else np.eye(4, dtype=np.float64) - - mount_translation = np.asarray(resolve_vector(link_info.get('mountPosition', [0, 0, 0]), 3), dtype=np.float64) * scale - mount = transform_from_translation_rotation( - mount_translation, - link_info.get('mountRotation', [0, 0, 0]) - ) - - joint_info = link_info.get('jointToParent', {}) or {} - joint_origin = np.asarray(resolve_vector(joint_info.get('origin', [0, 0, 0]), 3), dtype=np.float64) * scale - joint = transform_from_translation_rotation( - joint_origin, - joint_info.get('rotation', [0, 0, 0]) - ) - - motion = np.eye(4, dtype=np.float64) - joint_type = str(joint_info.get('type', 'fixed')).strip().lower() - control_var = str(joint_info.get('variable', joint_info.get('control', ''))).strip().lower() - axis = resolve_vector(joint_info.get('axis', [1, 0, 0]), 3) - - if joint_type == 'linear': - motion[:3, 3] = normalize_axis(axis) * state.get(control_var, 0.0) * scale - elif joint_type == 'revolute': - motion = axis_angle_matrix(axis, state.get(control_var, 0.0)) - - transforms[link_name] = parent_transform @ mount @ joint @ motion - - return transforms - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = np.ones(4, dtype=np.float64) - local[:3] = marker['position_m'] - world = link_transform @ local - return world[:3] - - -# ------------------------------------------------------------------ -# Camera / observation helpers -# ------------------------------------------------------------------ - -def load_intrinsics(detection_json: Dict[str, Any]) -> Tuple[np.ndarray, np.ndarray]: - cam = detection_json['camera'] - K = np.asarray(cam['camera_matrix'], dtype=np.float64) - D = np.asarray(cam.get('distortion_coefficients', [0, 0, 0, 0, 0]), dtype=np.float64).reshape(-1, 1) - return K, D - - -def collect_views_and_observations( - detection_files: List[str], - robot_markers: Dict[int, Dict[str, Any]] -) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]: - views: List[Dict[str, Any]] = [] - observations: List[Dict[str, Any]] = [] - - for idx, det_path in enumerate(detection_files): - detection_json = load_json(det_path) - K, D = load_intrinsics(detection_json) - image_shape = detection_json.get('image', {}).get('image_shape') - if not image_shape: - image_shape = (720, 1280) # fallback - - views.append({ - 'index': idx, - 'source_file': os.path.abspath(det_path), - 'camera_id': detection_json.get('camera', {}).get('camera_id', f'cam{idx+1}'), - 'image_file': detection_json.get('image', {}).get('image_file'), - 'image_shape': image_shape, - 'K': K, - 'D': D - }) - - for det in detection_json.get('detections', []) or []: - marker_id = int(det.get('marker_id', -1)) - if marker_id < 0 or marker_id not in robot_markers: - continue - - image_points = det.get('image_points_px') - if isinstance(image_points, list) and len(image_points) == 4: - image_points = np.asarray(image_points, dtype=np.float64) - else: - center = resolve_vector(det.get('center_px', [0, 0]), 2) - image_points = np.asarray([center], dtype=np.float64) - - confidence = float(det.get('confidence', 1.0)) - - # Compute observation quality metrics - quality_metrics = compute_marker_observation_quality(image_points, tuple(image_shape)) - - # Blend base confidence and observation quality instead of multiplying them. - # Reduce the distance/size-based quality influence by roughly 40% relative to the previous blend. - base_confidence = max(0.01, min(1.0, confidence)) - combined_quality = quality_metrics['combined_quality'] - combined_confidence = base_confidence * 0.76 + combined_quality * 0.24 - - marker = robot_markers[marker_id] - observations.append({ - 'view_index': idx, - 'marker_id': marker_id, - 'marker_link_corners': marker_object_corners(marker), - 'image_points_px': image_points, - 'confidence_base': base_confidence, - 'quality_metrics': quality_metrics, - 'confidence': max(0.01, min(1.0, combined_confidence)) - }) - - if len(views) == 0: - raise RuntimeError('No valid detection views found') - - if len(observations) == 0: - raise RuntimeError('No marker observations matched robot.json markers') - - return views, observations - - -def compute_marker_world_corners(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - link_transform = link_transforms[marker['link_name']] - local = marker_object_corners(marker) - homogeneous = np.concatenate([local, np.ones((local.shape[0], 1), dtype=np.float64)], axis=1) - world = (link_transform @ homogeneous.T).T - return world[:, :3] - - -def initial_camera_guess( - view: Dict[str, Any], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - default_state: Dict[str, float], - scale: float, - robot: Dict[str, Any] -) -> Tuple[np.ndarray, np.ndarray]: - object_points = [] - image_points = [] - - link_transforms = compute_link_transforms(robot, default_state, scale) - - for obs in observations: - if obs['view_index'] != view['index']: - continue - marker = robot_markers[obs['marker_id']] - object_points.append(compute_marker_world_corners(marker, link_transforms)) - image_points.append(obs['image_points_px']) - - if len(object_points) == 0: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - object_points = np.vstack(object_points) - image_points = np.vstack(image_points) - - if object_points.shape[0] < 4: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - success, rvec, tvec = cv2.solvePnP( - object_points, - image_points, - view['K'], - view['D'], - flags=cv2.SOLVEPNP_ITERATIVE - ) - - if not success: - return np.zeros((3, 1), dtype=np.float64), np.array([[0.0], [0.0], [1.0]], dtype=np.float64) - - return rvec, tvec - - -def project_points( - points_3d: np.ndarray, - rvec: np.ndarray, - tvec: np.ndarray, - K: np.ndarray, - D: np.ndarray -) -> np.ndarray: - projected, _ = cv2.projectPoints(points_3d, rvec, tvec, K, D) - return projected.reshape(-1, 2) - - -def compute_soft_constraint_residuals( - robot_state: Dict[str, float], - robot_markers: Dict[int, Dict[str, Any]], - link_transforms: Dict[str, np.ndarray], - robot: Dict[str, Any], - enabled_constraints: Dict[str, ConstraintResult] -) -> List[float]: - """ - Compute residuals from soft constraints (kinematic consistency, rigid body distances). - Returns a list of constraint residuals to append to the total residual vector. - """ - residuals = [] - weight_scale = 0.1 # Weight for soft constraints relative to reprojection errors - - # Constraint 1: Rigid body distances within each link - if enabled_constraints['RigidBodyDistances'].enabled: - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) < 2: - continue - - # Compute all pairwise distances in world coords - for i in range(len(link_markers)): - for j in range(i + 1, len(link_markers)): - m_i = link_markers[i] - m_j = link_markers[j] - - pos_i = compute_marker_world_position(m_i, link_transforms) - pos_j = compute_marker_world_position(m_j, link_transforms) - - dist_world = np.linalg.norm(pos_i - pos_j) - - # Reference distance in local coords - dist_local = np.linalg.norm(m_i['position_m'] - m_j['position_m']) - - # Residual: difference should be zero (rigid body) - error = dist_world - dist_local - residuals.append(error * weight_scale * 0.1) # Very soft weight - - # Constraint 2: Fixed X-distances between links (Arm1 <-> Ellbow) - if enabled_constraints['InterLinkXDistances'].enabled: - arm1_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm1'] - ellbow_markers = [m for m in robot_markers.values() if m['link_name'] == 'Ellbow'] - - if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: - # Get first marker from each link - m_arm1 = arm1_markers[0] - m_ellbow = ellbow_markers[0] - - pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) - pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) - - # X-distance in world should match reference (relative position) - # Since both rotate around X-axis at different points, we check consistency - x_diff_world = pos_ellbow[0] - pos_arm1[0] - x_diff_ref = m_ellbow['position_m'][0] - m_arm1['position_m'][0] - - error = x_diff_world - x_diff_ref - residuals.append(error * weight_scale) - - return residuals - - -def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: - """Compute the world position of a marker given current link transforms.""" - link_transform = link_transforms[marker['link_name']] - local_pos = np.concatenate([marker['position_m'], [1.0]]) - world_pos = (link_transform @ local_pos)[:3] - return world_pos - - -# ------------------------------------------------------------------ -# Optimization -# ------------------------------------------------------------------ - -def pack_parameters(robot_state: Dict[str, float], camera_params: List[Tuple[np.ndarray, np.ndarray]]) -> np.ndarray: - state_vec = np.asarray([robot_state[k] for k in STATE_KEYS], dtype=np.float64) - cams = [] - for rvec, tvec in camera_params: - cams.append(rvec.reshape(3)) - cams.append(tvec.reshape(3)) - return np.concatenate([state_vec] + cams) - - -def unpack_parameters(params: np.ndarray, n_views: int) -> Tuple[Dict[str, float], List[Tuple[np.ndarray, np.ndarray]]]: - robot_state = {STATE_KEYS[i]: float(params[i]) for i in range(len(STATE_KEYS))} - camera_params = [] - offset = len(STATE_KEYS) - for _ in range(n_views): - rvec = params[offset:offset + 3].reshape(3, 1) - tvec = params[offset + 3:offset + 6].reshape(3, 1) - camera_params.append((rvec, tvec)) - offset += 6 - return robot_state, camera_params - - -def residuals_for_parameters( - params: np.ndarray, - views: List[Dict[str, Any]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - robot: Dict[str, Any], - scale: float, - default_state: Dict[str, float], - enabled_constraints: Dict[str, ConstraintResult] -) -> np.ndarray: - robot_state, camera_params = unpack_parameters(params, len(views)) - link_transforms = compute_link_transforms(robot, robot_state, scale) - - residuals = [] - - # Reprojection residuals (primary observation) - for obs in observations: - marker = robot_markers[obs['marker_id']] - world_corners = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(world_corners, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - weight = math.sqrt(obs['confidence']) - residuals.extend((diffs * weight).reshape(-1)) - - # Weak priors on robot state - for key in STATE_KEYS: - diff = robot_state[key] - default_state.get(key, 0.0) - if key in ('x', 'y', 'z', 'e'): - w = 0.001 - else: - w = 0.01 - residuals.append(diff * w) - - # Soft constraints (kinematic consistency, rigid body constraints) - soft_constraint_residuals = compute_soft_constraint_residuals( - robot_state, robot_markers, link_transforms, robot, enabled_constraints - ) - residuals.extend(soft_constraint_residuals) - - return np.asarray(residuals, dtype=np.float64) - - - -def estimate_uncertainty(result: Any, n_params: int) -> np.ndarray: - if result.jac is None: - return np.full(n_params, float('nan'), dtype=np.float64) - J = result.jac - m, n = J.shape - JTJ = J.T @ J - try: - cov = np.linalg.pinv(JTJ) - except np.linalg.LinAlgError: - cov = np.linalg.pinv(JTJ + np.eye(n) * 1e-9) - residuals = result.fun - dof = max(1, m - n) - sigma2 = float(np.sum(residuals ** 2) / dof) - cov *= sigma2 - return np.sqrt(np.diag(cov)) - - -def print_constraint_sanity_check( - robot_state: Dict[str, float], - robot_markers: Dict[int, Dict[str, Any]], - link_transforms: Dict[str, np.ndarray], - robot: Dict[str, Any], - enabled_constraints: Dict[str, ConstraintResult] -) -> None: - """ - Print sanity checks for all constraints to verify the optimization result. - """ - print("\n" + "=" * 70) - print("CONSTRAINT SANITY CHECKS (after optimization)") - print("=" * 70) - - # Check 1: Rigid body distances - if enabled_constraints['RigidBodyDistances'].enabled: - print("\n1. RIGID BODY DISTANCES") - for link_name in ['Arm1', 'Ellbow', 'Arm2']: - link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] - if len(link_markers) < 2: - continue - - max_error = 0.0 - for i in range(len(link_markers)): - for j in range(i + 1, len(link_markers)): - m_i = link_markers[i] - m_j = link_markers[j] - - pos_i = compute_marker_world_position(m_i, link_transforms) - pos_j = compute_marker_world_position(m_j, link_transforms) - - dist_world = np.linalg.norm(pos_i - pos_j) - dist_local = np.linalg.norm(m_i['position_m'] - m_j['position_m']) - error = abs(dist_world - dist_local) - max_error = max(max_error, error) - - status = "✓" if max_error < 1.0 else "⚠" if max_error < 5.0 else "✗" - print(f" {link_name:10s}: max_error = {max_error:.3f} mm {status}") - - # Check 2: Inter-link X distances - if enabled_constraints['InterLinkXDistances'].enabled: - print("\n2. INTER-LINK X-DISTANCES") - arm1_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm1'] - ellbow_markers = [m for m in robot_markers.values() if m['link_name'] == 'Ellbow'] - - if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: - m_arm1 = arm1_markers[0] - m_ellbow = ellbow_markers[0] - - pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) - pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) - - x_diff_world = pos_ellbow[0] - pos_arm1[0] - x_diff_ref = m_ellbow['position_m'][0] - m_arm1['position_m'][0] - error = abs(x_diff_world - x_diff_ref) - - status = "✓" if error < 1.0 else "⚠" if error < 5.0 else "✗" - print(f" Arm1 <-> Ellbow: error = {error:.3f} mm {status}") - - # Check 3: Arm2 sin(a) dependency - if enabled_constraints['Arm2SinADependency'].enabled: - print("\n3. ARM2 sin(a) DEPENDENCY (sanity check)") - arm2_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm2'] - if len(arm2_markers) >= 2: - # Check that markers with different Z values have different X spreads - a_rad = math.radians(robot_state['a']) - sin_a = math.sin(a_rad) - cos_a = math.cos(a_rad) - - z_variations = {} - for m in arm2_markers: - z_local = m['position_m'][2] - x_local = m['position_m'][0] - pos_world = compute_marker_world_position(m, link_transforms) - x_world = pos_world[0] - - # Expected: x_world = 90 + x_local * cos(a) - z_local * sin(a) - x_expected = 90 * (robot.get('renderingInfo', {}).get('metric', 'mm') == 'mm' and 0.09 or 0.09) + x_local * cos_a - z_local * sin_a - x_error = abs(x_world - x_expected) - - if z_local not in z_variations: - z_variations[z_local] = [] - z_variations[z_local].append(x_error) - - max_error = max(max(errors) for errors in z_variations.values()) if z_variations else 0.0 - status = "✓" if max_error < 5.0 else "⚠" if max_error < 10.0 else "⚠" - print(f" X-consistency with sin(a): max_error = {max_error:.3f} mm {status}") - print(f" (Note: this is a consistency check, not a hard constraint)") - - print("=" * 70) - - -def camera_position_world(rvec: np.ndarray, tvec: np.ndarray) -> np.ndarray: - R, _ = cv2.Rodrigues(rvec) - return (-R.T @ tvec).reshape(3) - - -def build_output( - robot_state: Dict[str, float], - state_uncertainty: np.ndarray, - views: List[Dict[str, Any]], - camera_params: List[Tuple[np.ndarray, np.ndarray]], - observations: List[Dict[str, Any]], - robot_markers: Dict[int, Dict[str, Any]], - scale: float, - robot: Dict[str, Any], - robot_json_path: str -) -> Dict[str, Any]: - link_transforms = compute_link_transforms(robot, robot_state, scale) - - marker_summary: Dict[int, Dict[str, Any]] = {} - for marker_id, marker in robot_markers.items(): - marker_summary[marker_id] = { - 'marker_id': marker_id, - 'link_name': marker['link_name'], - 'position_world_m': compute_marker_world_position(marker, link_transforms).tolist(), - 'size_m': marker['size_m'], - 'observation_count': 0, - 'mean_confidence': None, - 'mean_reprojection_error_px': None, - 'observations': [] - } - - per_marker_errors: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - per_marker_confidences: Dict[int, List[float]] = {mid: [] for mid in marker_summary} - - link_transforms = compute_link_transforms(robot, robot_state, scale) - for obs in observations: - marker_id = obs['marker_id'] - marker = robot_markers[marker_id] - object_points_m = compute_marker_world_corners(marker, link_transforms) - rvec, tvec = camera_params[obs['view_index']] - proj = project_points(object_points_m, rvec, tvec, views[obs['view_index']]['K'], views[obs['view_index']]['D']) - diffs = proj - obs['image_points_px'] - errors = np.linalg.norm(diffs, axis=1) - repro_error = float(np.mean(errors)) - per_marker_errors[marker_id].extend(errors.tolist()) - per_marker_confidences[marker_id].append(obs['confidence']) - marker_summary[marker_id]['observation_count'] += 1 - marker_summary[marker_id]['observations'].append({ - 'view_index': obs['view_index'], - 'source_file': views[obs['view_index']]['source_file'], - 'image_file': views[obs['view_index']]['image_file'], - 'confidence': obs['confidence'], - 'mean_reprojection_error_px': repro_error, - 'corner_reprojection_errors_px': errors.tolist() - }) - - for marker_id, summary in marker_summary.items(): - if summary['observation_count'] > 0: - summary['mean_confidence'] = float(np.mean(per_marker_confidences[marker_id])) - summary['mean_reprojection_error_px'] = float(np.mean(per_marker_errors[marker_id])) - - camera_outputs = [] - for idx, view in enumerate(views): - rvec, tvec = camera_params[idx] - cam_pos = camera_position_world(rvec, tvec) - observed_count = sum(1 for obs in observations if obs['view_index'] == idx) - camera_outputs.append({ - 'view_index': idx, - 'source_file': view['source_file'], - 'camera_id': view['camera_id'], - 'camera_position_world_m': cam_pos.tolist(), - 'rvec': rvec.reshape(-1).tolist(), - 'tvec': tvec.reshape(-1).tolist(), - 'intrinsics': { - 'camera_matrix': view['K'].tolist(), - 'distortion_coefficients': view['D'].reshape(-1).tolist() - }, - 'observation_count': observed_count - }) - - robot_pose_output = { - 'state': {k: float(robot_state[k]) for k in STATE_KEYS}, - 'uncertainty': { - 'x_mm': float(state_uncertainty[0]), - 'y_mm': float(state_uncertainty[1]), - 'z_mm': float(state_uncertainty[2]), - 'a_deg': float(state_uncertainty[3]), - 'b_deg': float(state_uncertainty[4]), - 'c_deg': float(state_uncertainty[5]), - 'e_mm': float(state_uncertainty[6]) - }, - 'confidence': { - 'x': float(math.exp(-state_uncertainty[0] / 10.0)), - 'y': float(math.exp(-state_uncertainty[1] / 10.0)), - 'z': float(math.exp(-state_uncertainty[2] / 10.0)), - 'a': float(math.exp(-state_uncertainty[3] / 10.0)), - 'b': float(math.exp(-state_uncertainty[4] / 10.0)), - 'c': float(math.exp(-state_uncertainty[5] / 10.0)), - 'e': float(math.exp(-state_uncertainty[6] / max(1.0, state_uncertainty[6]))) - } - } - - return { - 'schema_version': '1.0', - 'created_utc': datetime.datetime.utcnow().isoformat() + 'Z', - 'source_robot_json': os.path.abspath(robot_json_path), - 'source_detections': [view['source_file'] for view in views], - 'robot_pose': robot_pose_output, - 'camera_poses': camera_outputs, - 'marker_positions': list(marker_summary.values()) - } - - -# ------------------------------------------------------------------ -# Main -# ------------------------------------------------------------------ - -def main() -> None: - parser = argparse.ArgumentParser(description='Multiview optimization of robot pose and camera extrinsics') - parser.add_argument('--robot', required=True, help='Path to robot.json') - parser.add_argument('--detections', required=True, nargs='+', help='List of detection JSON files') - parser.add_argument('--outDir', required=True, help='Output directory') - parser.add_argument('--write-summary', action='store_true', help='Write summary file') - parser.add_argument('--max-iter', type=int, default=500, help='Maximum optimizer iterations') - args = parser.parse_args() - - os.makedirs(args.outDir, exist_ok=True) - - robot_json_path = os.path.abspath(args.robot) - robot = load_json(robot_json_path) - scale = parse_metric_scale(robot) - - default_state = { - k: float(robot.get('defaultPosition', {}).get(k, 0.0) or 0.0) - for k in STATE_KEYS - } - - robot_markers = extract_markers(robot, scale) - - # Validate constraints - print("\n" + "=" * 70) - print("CONSTRAINT VALIDATION") - print("=" * 70) - enabled_constraints = validate_constraints(robot, robot_markers) - for constraint_name, result in enabled_constraints.items(): - print(result) - print("=" * 70) - - views, observations = collect_views_and_observations(args.detections, robot_markers) - - # Print observation quality summary - print("\n" + "=" * 70) - print("OBSERVATION QUALITY SUMMARY") - print("=" * 70) - print(f"Total observations: {len(observations)}") - print() - - # Aggregate quality metrics - quality_by_marker = {} - for obs in observations: - mid = obs['marker_id'] - if mid not in quality_by_marker: - quality_by_marker[mid] = [] - quality_by_marker[mid].append(obs['quality_metrics']) - - print(f"{'Marker':>8} {'Link':>12} {'Count':>6} {'Avg Orient.':>12} {'Avg Size':>12} {'Avg Conf.':>12}") - print("-" * 70) - for marker_id in sorted(quality_by_marker.keys()): - marker = robot_markers[marker_id] - quality_list = quality_by_marker[marker_id] - avg_orient = np.mean([q['orientation_quality'] for q in quality_list]) - avg_size = np.mean([q['size_quality'] for q in quality_list]) - - obs_for_marker = [o for o in observations if o['marker_id'] == marker_id] - avg_conf = np.mean([o['confidence'] for o in obs_for_marker]) - - print(f"{marker_id:8d} {marker['link_name']:>12} {len(quality_list):6d} " - f"{avg_orient:12.3f} {avg_size:12.3f} {avg_conf:12.3f}") - print("=" * 70) - - camera_guesses = [] - for view in views: - rvec, tvec = initial_camera_guess(view, observations, robot_markers, default_state, scale, robot) - camera_guesses.append((rvec, tvec)) - - - x0 = pack_parameters(default_state, camera_guesses) - - progress = { - 'iter': 0, - 'last_cost': None, - 'last_print': time.time(), - 'prev_x': x0.copy() - } - - def progress_callback(xk: np.ndarray) -> None: - progress['iter'] += 1 - now = time.time() - if progress['iter'] == 1 or now - progress['last_print'] >= 1.0: - res = residuals_for_parameters(xk, views, observations, robot_markers, robot, scale, default_state, enabled_constraints) - cost = 0.5 * float(np.dot(res, res)) - delta_cost = None - convergence = '' - if progress['last_cost'] is not None: - delta_cost = cost - progress['last_cost'] - if abs(delta_cost) < 1e-3: - convergence = ' stable' - elif delta_cost < 0: - convergence = ' improving' - else: - convergence = ' worsening' - step_norm = float(np.linalg.norm(xk - progress['prev_x'])) - print( - f'[Multiview] iter={progress["iter"]:4d} cost={cost:.4f}' - + (f' delta={delta_cost:.4g}' if delta_cost is not None else '') - + f' step={step_norm:.4g}' - + convergence - ) - progress['last_cost'] = cost - progress['last_print'] = now - progress['prev_x'] = xk.copy() - - result = least_squares( - residuals_for_parameters, - x0, - args=(views, observations, robot_markers, robot, scale, default_state, enabled_constraints), - jac='2-point', - method='trf', - loss='soft_l1', - f_scale=1.0, - max_nfev=args.max_iter, - callback=progress_callback - ) - - robot_state, camera_params = unpack_parameters(result.x, len(views)) - uncertainties = estimate_uncertainty(result, len(result.x)) - - # Print constraint sanity checks - link_transforms = compute_link_transforms(robot, robot_state, scale) - print_constraint_sanity_check(robot_state, robot_markers, link_transforms, robot, enabled_constraints) - - output = build_output(robot_state, uncertainties[:len(STATE_KEYS)], views, camera_params, observations, robot_markers, scale, robot, robot_json_path) - - out_path = Path(args.outDir) / 'multiview_pose.json' - save_json(output, out_path) - - print(f'Saved: {out_path}') - if args.write_summary: - summary_path = Path(args.outDir) / 'multiview_pose_summary.json' - summary = { - 'final_cost': float(result.cost), - 'status': int(result.status), - 'message': result.message, - 'robot_state': output['robot_pose'], - 'camera_count': len(views), - 'marker_count': len(robot_markers) - } - save_json(summary, summary_path) - print(f'Saved: {summary_path}') - - -if __name__ == '__main__': - main() - - - -========= - - -Aus mehreren Bildern von einem Roboter solle die Pose (die Stellung der Gelenke) erkannt werden. - -Dazu existiert schon jede Menge Code -* roboter.json > Info Datei über alle Joings des Roboters. Hier sind auch Render-Informationen für andere Programme hinterlegt. Das läuft stabil und soll nicht ohne Grund verändert werden. Wenn du werte nicht brauchst, ignoriere sie. Wenn du zusätzliche Infos dort speichern willst, sag das. -* 1_detect_aruco_observations.py > Macht openCV Bilderkennung. Liefert pro Datei alle gefundenen Arucos und ArucoCandidates mit Confidence-Level. -* 1_detect_aruco_observations.py erstellt pro png eine Datei render_1a_aruco_detection.json mit allen Markern und Confidence-Leveln. Hier das Beispiel einer solchen Datei. -* 2_Multiview.py > Hier arbeite ich dran, und hier bin ich noch nicht zufrieden. - -Ziel des nächsten Schritts: Baue eine besser Version von 2_Multiview. Es sollen nur die ..aruco_detection.json und das robot.json genommen werden, und daraus die Position des Roboters ermittelt werden. Der Ansatz Simultane Multiview-Optimierung gefällt mir gut. Was mir noch nicht gut gefällt. - -(1). Es ist mindestens ein Fehler drinnen. multiview_pose.json und multiview_pose_summary.json zeigen unterschiedliche werte an. Ich hätte in der _summary die zusammengefassten werte erwartet. - -(2) Die Gewichtung der Arucos ist noch nicht perfekt. Ich will eigentlich den Abstand und die optische-Schärfe, Grösse der Arucos mit berücksichtigen. Grössere Arucos sollen mehr Gewicht erhalten. Schlecht ausgerichtete Arucos sollen weniger Gewicht erhalten. - -(3) Siehst du eine Möglichkeit, die Orientierung (normal und spin) der Arucos mit in die Gewichtung einfliessen zu lassnen? Hintergrund: auf einem gedrehten Bauteil sind die Arucos gedreht. Hier bin ich unsicher, ob das überhaupt möglich ist. - - -Egal was du machst: Lösche nicht einfach code, wenn du nicht genau weisst wofür er ist. Es ist einiges an Arbeit in diesen Code gegangen, behandel ihn entsprechend. - - -Der Roboter.json enthält noch nicht alle Marker. Die Finger werden später noch Marker erhlaten. Der Code soll in solchen Fällen confidence-level markieren, so dass die Werte als "sehr sehr ungewiss" erkannt werden können. - -Kannst du diese Aufgabe bearbeiten? Wenn möglich, erstelle eine neue Version der 2_Multiveiw.py. Wenn du noch fragen hast, stell bitte erst die Fragen. Du kannst hart sein, es muss kein freundlicher Text raus kommen, sondern es muss ein korrektes Programm rauskommen, das möglichst viele (andere) Test Bilder (sets von je 2-6 Fotos der selben Pose vom bekannten Roboter) erkennt. \ No newline at end of file