{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":91498,"databundleVersionId":11655853,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Translation/Rotation Vector 3D Plot ","metadata":{}},{"cell_type":"code","source":"import math\nimport os\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.mplot3d import Axes3D\nfrom PIL import Image","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-17T11:04:51.172560Z","iopub.execute_input":"2025-06-17T11:04:51.172904Z","iopub.status.idle":"2025-06-17T11:04:51.178266Z","shell.execute_reply.started":"2025-06-17T11:04:51.172880Z","shell.execute_reply":"2025-06-17T11:04:51.177359Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train=pd.read_csv('/kaggle/input/image-matching-challenge-2025/train_labels.csv')\ndisplay(train)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-17T11:04:51.179535Z","iopub.execute_input":"2025-06-17T11:04:51.179812Z","iopub.status.idle":"2025-06-17T11:04:51.214120Z","shell.execute_reply.started":"2025-06-17T11:04:51.179764Z","shell.execute_reply":"2025-06-17T11:04:51.213204Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train2=train[train['dataset']=='imc2023_haiper'][train['scene']=='fountain']\ndisplay(train2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-17T11:04:51.215127Z","iopub.execute_input":"2025-06-17T11:04:51.215349Z","iopub.status.idle":"2025-06-17T11:04:51.228870Z","shell.execute_reply.started":"2025-06-17T11:04:51.215332Z","shell.execute_reply":"2025-06-17T11:04:51.228015Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Convert a string to a list of floats\ndef parse_vector(s):\n    return list(map(float, s.split(';')))\n\n# Convert the 'translation_vector' column to a numerical array\nvec_array = train2['translation_vector'].apply(parse_vector).tolist()\nvec_array = np.array(vec_array)\n\n# Extract each component along the axes\ntx, ty, tz = vec_array[:, 0], vec_array[:, 1], vec_array[:, 2]\n\n# 3D scatter plot\nfig = plt.figure()\nax = fig.add_subplot(111, projection='3d')\nax.scatter(tx, ty, tz, color='red', s=20)  # Plot points\n\n# Axis labels and limits\nax.set_xlabel('X')\nax.set_ylabel('Y')\nax.set_zlabel('Z')\n\nax.grid(True)\nplt.title('Translation Vector Endpoints')\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-17T11:04:51.230836Z","iopub.execute_input":"2025-06-17T11:04:51.231302Z","iopub.status.idle":"2025-06-17T11:04:51.377401Z","shell.execute_reply.started":"2025-06-17T11:04:51.231281Z","shell.execute_reply":"2025-06-17T11:04:51.376491Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Convert a string to a list of floats\ndef parse_vector(s):\n    return list(map(float, s.split(';')))\n\n# Convert columns to arrays\npositions = train2['translation_vector'].apply(parse_vector).tolist()\nrotations = train2['rotation_matrix'].apply(parse_vector).tolist()\n\npositions = np.array(positions)\nrotations = np.array(rotations)\n\n# 3D plot\nfig = plt.figure()\nax = fig.add_subplot(111, projection='3d')\n\nfor i in range(len(positions)):\n    pos = positions[i]\n    R = np.array(rotations[i]).reshape(3, 3)  # 3x3 rotation matrix\n\n    # Combine the x, y, z direction vectors\n    combined_vector = R[:, 0] + R[:, 1] + R[:, 2]\n    combined_vector = combined_vector / np.linalg.norm(combined_vector)  # Normalize (optional)\n    scale = 0.3\n    ax.quiver(*pos, *(combined_vector * scale), color='purple')\n\n    # Plot the camera position\n    ax.scatter(*pos, color='black', s=10)\n\n# Axis labels\nax.set_xlabel('X')\nax.set_ylabel('Y')\nax.set_zlabel('Z')\nax.grid(True)\nplt.title('Combined Rotation Vectors from Camera Poses')\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-17T11:04:51.378231Z","iopub.execute_input":"2025-06-17T11:04:51.378617Z","iopub.status.idle":"2025-06-17T11:04:51.767462Z","shell.execute_reply.started":"2025-06-17T11:04:51.378597Z","shell.execute_reply":"2025-06-17T11:04:51.766547Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\npaths=[]\nfor dirname, _, filenames in os.walk('/kaggle/input/image-matching-challenge-2025/train/imc2023_haiper'):\n    for filename in filenames:\n        if filename.split('_')[0]=='fountain':\n            paths+=[(os.path.join(dirname, filename))]\n\n\nnum_images = len(paths)\ncols = 3\nrows = math.ceil(num_images / cols)\n\nfig, axes = plt.subplots(rows, cols, figsize=(cols * 4, rows * 4))\n\nfor i, path in enumerate(paths):\n    img = Image.open(path)\n    row = i // cols\n    col = i % cols\n    axes[row, col].imshow(img)\n    axes[row, col].axis('off')\n\nfor j in range(num_images, rows * cols):\n    row = j // cols\n    col = j % cols\n    axes[row, col].axis('off')\n\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-17T11:04:51.768367Z","iopub.execute_input":"2025-06-17T11:04:51.768657Z","iopub.status.idle":"2025-06-17T11:05:04.716311Z","shell.execute_reply.started":"2025-06-17T11:04:51.768637Z","shell.execute_reply":"2025-06-17T11:05:04.715240Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}