{"record":{"id":"9ea5a3ce03af2ddd","repo":"ruvnet/RuView","slug":"intrinsics-file-path-missing-key-key-r","errorCode":null,"errorMessage":"Intrinsics file {path} missing key {key!r}","messagePattern":"Intrinsics file (.+?) missing key (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"scripts/calibration_lib.py","lineNumber":153,"sourceCode":"    )\n    return {\n        \"image_size\": [int(image_size[0]), int(image_size[1])],\n        \"camera_matrix\": camera_matrix.tolist(),\n        \"dist_coeffs\": dist_coeffs.ravel().tolist(),\n        \"reprojection_error_px\": float(rms),\n        \"source\": \"computed\",\n    }\n\n\ndef load_intrinsics(path: Path) -> dict:\n    \"\"\"Load a pre-computed intrinsics JSON ({camera_matrix, dist_coeffs, image_size}).\"\"\"\n    with open(path, \"r\", encoding=\"utf-8\") as f:\n        data = json.load(f)\n    # Accept either a bare intrinsics dict or a full calibration bundle.\n    intr = data.get(\"camera_intrinsics\", data)\n    for key in (\"camera_matrix\", \"dist_coeffs\", \"image_size\"):\n        if key not in intr:\n            raise ValueError(f\"Intrinsics file {path} missing key {key!r}\")\n    intr = dict(intr)\n    intr[\"source\"] = \"file\"\n    return intr\n\n\n# ---------------------------------------------------------------------------\n# Extrinsics (camera -> room rigid transform)\n# ---------------------------------------------------------------------------\n\ndef reprojection_rmse(\n    room_points: np.ndarray,\n    image_points: np.ndarray,\n    rvec: np.ndarray,\n    tvec: np.ndarray,\n    camera_matrix: np.ndarray,\n    dist_coeffs: np.ndarray,\n) -> float:\n    proj, _ = cv2.projectPoints(room_points, rvec, tvec, camera_matrix, dist_coeffs)","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/ruvnet/RuView/blob/4685618388a5e49fad5b3005806f3bdd6a7c25c3/scripts/calibration_lib.py#L135-L171","documentation":"load_intrinsics loads a precomputed camera-intrinsics JSON for the calibration flow. It accepts either a bare intrinsics dict or a full bundle containing a 'camera_intrinsics' object, then requires the keys camera_matrix, dist_coeffs, and image_size. The first missing key raises ValueError naming the file and the key.","triggerScenarios":"Passing an intrinsics file that contains only camera_matrix (no dist_coeffs/image_size), a bundle whose nested object uses different key names, or a geometry file where intrinsics were expected.","commonSituations":"Reusing intrinsics exported from another OpenCV pipeline that omits D or image size; hand-edited files; resolution changed after calibration so image_size is missing.","solutions":["Regenerate the intrinsics file with the calibration flow so all three keys are written","If importing from elsewhere, map fields explicitly: K → camera_matrix (3x3), D → dist_coeffs, [w, h] → image_size","Pre-validate: jq 'has(\"camera_matrix\") and has(\"dist_coeffs\") and has(\"image_size\")' intrinsics.json"],"exampleFix":"// before\n// intrinsics.json\n{\"camera_matrix\": [[800,0,320],[0,810,240],[0,0,1]]}\n\n// after\n// intrinsics.json\n{\"camera_matrix\": [[800,0,320],[0,810,240],[0,0,1]],\n \"dist_coeffs\": [0,0,0,0,0],\n \"image_size\": [640,480]}","handlingStrategy":"validation","validationCode":"import json\n\nREQUIRED = (\"camera_matrix\", \"dist_coeffs\", \"image_size\")\n\ndef intrinsics_valid(path: str) -> bool:\n    with open(path, encoding=\"utf-8\") as f:\n        data = json.load(f)\n    intr = data.get(\"camera_intrinsics\", data) if isinstance(data, dict) else {}\n    return isinstance(intr, dict) and all(k in intr for k in REQUIRED)\n\nif not intrinsics_valid(\"intrinsics.json\"):\n    raise SystemExit(f\"intrinsics file must contain {REQUIRED}\")","typeGuard":null,"tryCatchPattern":"try:\n    intr = load_intrinsics(path)\nexcept ValueError as e:\n    raise SystemExit(f\"regenerate the intrinsics file: {e}\") from e","preventionTips":["Always write camera_matrix, dist_coeffs, and image_size together from the calibration flow","Map external exports (K/D/size) explicitly instead of hand-editing","Re-verify image_size whenever capture resolution changes"],"tags":["python","json","opencv","calibration","validation","intrinsics"],"backgroundTag":null,"analyzedSha":"4685618388a5e49fad5b3005806f3bdd6a7c25c3","analyzedAt":"2026-08-16T06:09:40.886Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}