Files
ChArUcoBoardExp/draw.ipynb

142 lines
35 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"from PIL import Image, ImageOps\n",
"from pathlib import Path\n",
"from typing import Optional\n",
"from matplotlib import pyplot as plt\n",
"import logging"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{1: PosixPath('board/charuco_410x410_3x3_s133_m105_face1_no_4_DICT_7X7_1000.png'),\n",
" 4: PosixPath('board/charuco_410x410_3x3_s133_m105_face4_no_16_DICT_7X7_1000.png'),\n",
" 3: PosixPath('board/charuco_410x410_3x3_s133_m105_face3_no_12_DICT_7X7_1000.png'),\n",
" 0: PosixPath('board/charuco_410x410_3x3_s133_m105_face0_no_0_DICT_7X7_1000.png'),\n",
" 5: PosixPath('board/charuco_410x410_3x3_s133_m105_face5_no_20_DICT_7X7_1000.png'),\n",
" 2: PosixPath('board/charuco_410x410_3x3_s133_m105_face2_no_8_DICT_7X7_1000.png')}"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"TILE_SIZE = 1650 # in pixels\n",
"BORDER_SIZE = 200 # in pixels\n",
"BORDER_COLOR = (255, 255, 255)\n",
"BACKGROUND_COLOR = (255, 255, 255)\n",
"IMAGE_DIR = Path(\"board\")\n",
"\n",
"# Define the layout grid (rows of indices, None for empty)\n",
"# fmt: off\n",
"layout:list[list[Optional[int]]] = [\n",
" [None, None, 0, None, None],\n",
" [None, None, 1, None, None],\n",
" [None, 5, 2, 4, None],\n",
" [None, None, 3, None, None],\n",
"]\n",
"# fmt: on\n",
"\n",
"\n",
"\n",
"# charuco_410x410_3x3_s133_m105_face3_no_12_DICT_7X7_1000\n",
"# xxxxxxx_<phy_size>_<grid_size>_<checker_size>_<marker_space>_face<face_idx>_no_<no_idx>_DICT_<dict_size>\n",
"# 0 1 2 3 4 5 6 7 8\n",
"def parse_filename_to_face_idx(filename: str):\n",
" parts = filename.split(\"_\")\n",
" return int(parts[5][len(\"face\") :])\n",
"\n",
"\n",
"image_pathes = list(IMAGE_DIR.glob(\"*.png\"))\n",
"image_indice = map(lambda p: parse_filename_to_face_idx(p.stem), image_pathes)\n",
"images = {k: v for k, v in zip(image_indice, image_pathes)}\n",
"display(images)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgkAAAGiCAYAAABtUVVIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAXKlJREFUeJzt3Qe4E9X2NvCtIkjvvffeexFBEUTl0kS5ooAUpSrlUqWICigiAiIgiigKCiiIgIB0RSkC0pEiqIj0jiDNfM+7/t+OkznJqZPJzOT9PU9IzmRIZubkZNbsvfbad/h8Pp8iIiIiMrnTvICIiIgIGCQQERFRUAwSiIiIKCgGCURERBQUgwQiIiIKikECERERBcUggYiIiIJikEBERERBMUggIiKioBgkEBERkfuChHfeeUcVKFBA3XPPPap69epq8+bNkd4kIiKiqOHYIGHOnDmqT58+avjw4Wrbtm2qfPnyqlGjRurUqVOR3jQiIqKocIdTJ3hCy0HVqlXVpEmT5Od//vlH5c2bV/Xs2VMNHDgw0ptHRETkecmUA924cUNt3bpVDRo0yL/szjvvVA0aNFAbNmwI+n+uX78uNw1Bxblz51TmzJnVHXfcYct2ExERuQHaBy5fvqxy5col51dXBQlnzpxRt2/fVtmzZw9Yjp9//vnnoP9n9OjRasSIETZtIRERkfsdPXpU5cmTx11BQmKg1QE5DNrFixdVvnz55ACkS5cuottGRETkJJcuXZIu/LRp08a6niODhCxZsqi77rpLnTx5MmA5fs6RI0fQ/5MiRQq5mSFAYJBAREQUU1zd8Y4c3ZA8eXJVuXJltWrVqoAcA/xcs2bNiG4bERFRtHBkSwKg66Bdu3aqSpUqqlq1amr8+PHqr7/+Us8880ykN42IiCgqODZIeOKJJ9Tp06fVsGHD1IkTJ1SFChXUsmXLYiQzEhERUZTVSbAiKSN9+vSSwMicBCIiooSfIx2Zk0BERESRxyCBiIiI3JWTQESxQ08h5jWh8KhUqRKrtVLUY5BA5FIYFrxo0aJIb4ZnVaxYkUECRT0GCUQeaFE4dOiQbe+XKVMmW+uVfPfdd5JkZZciRYowOCD6/xgkEHnA7NmzbXuvunXrqokTJ9r2fm+88Ybavn27Le+F4GDo0KG2vBeRGzBIIKIE8+qVtkdHhBMlGoMEIko0zMr6/fffW/669evXV4UKFbL8dYkoYRgkEFGiffvtt+q5556z/HXnzJnDIIHIARgkEJElMmTIEKPpHtXcABXd7rwzeFmW69evq2vXrtmyjUSUMAwSiMgSu3fvDvj56tWrqlixYvJ46dKlKn/+/EH/3yeffKIGDhxoyzYSUcIwSCAiS+TKlUsSGnXyH4IEDROz4flgSY/mFggicg4GCURkqblz58qQRXQvvP7667Lso48+Ujdv3lQ5c+ZUzz//fMD6NWrU8K83YMCAiGwzEQXHIIGILIUqkLNmzVJp06b1F0EqXry4OnDggCpfvnyMIAHLcEMLBIMEImdhkEBEljh8+LDcX7582V82+pdffpHHuXPnliAgX758AetjGZIas2bNGqGtJqLYMEggIkugNQD+/vtvuf/rr7/8yzZv3qwKFCgQkI9QtWpVGdmAIZRvvvlmhLaaiGLDIIGILIGgINSyFClSqFSpUknLgTGxEQHFjRs3ApYTkXMwSCAiS3zxxRdyP2HCBCmyFMwff/yh+vbtK48//vhjSW5Et8MTTzzBIIHIgRgkEJElmjdvLt0J8+fPD7kOEhnnzZvnDxLQwvDuu+/6lxGRszBIICLLpnRGkJAlSxZVr149dfv2bVlmhC4HPAehKjASkXMwSCAiyyZl0tNWIxER+Qjp06cPWAfJiytXrpTHDBKInI9BAhFZAkMeAa0Jd911l9xiW0/fo8WBiJyJQQIR2QZJiq1btw5Ydvr06YhtDxHFjkECEdkGQx63bNkS6c0gonhikEBEllq7dq3kI6A7oVOnTrJsxYoVMiwSQYJe9sEHH8g6pUqVUrVq1ZIhkNOnT4/w1hOREYMEIrLUlClT5Ia5Gy5evCjLSpQo4Z+74aeffvIPgUTFxfvvv19NnDhRljFIIHIWBglEFBZoGdBBgjFJUS/TEChgGYspETkPgwQiCgt0OZQtW1YenzhxQu7379/vX4bgAD799FO1dOnSCG4pEYXCIIGIwgItAyjDbHTz5s0Yy65cuSI3InIeBglElGhVqlRRr776quWvW6ZMGctfk4gSjkECESVapUqV5EZE3sQggYgSjEmGRNGBQQKRy6EM8vvvv2/b+509e1a1b9/etvdr27at6tGjh23vd/ToUdvei8jpGCQQeUCHDh0kWLADCiMNGDBA2aV79+6qWrVqtrWQjBgxwpb3InIDBglEHoKTXLi6Apwwa6Out2A1BFh2BVlEbsIggchDbt26pZo3b27562bLlk3KKEcauh4uXLhg+esuXLgw5KyVRNGMQQKRh+BKe8mSJZa/bv78+ZUToKvj1KlTlr8uEzGJgmOQQORRmDQpffr0QZ87efKk2rZtW8AyTLSEYACBxvLly5WTZcqUSVWvXl0eL1u2LMZJvnHjxvFKwNy8eXPYtpHICxgkEHnUW2+9JcWOQjWvt2jRImBZ165dVbdu3aQq4j333KOcDBNFLV68WB6nSJFCulk0dBvo52KzZs0a1aBBg7BuJ5HbMUgg8iicOHHCD/WchpMsJEuWTJIT3ZDAh5YDvW/YfgQG2CdMIGVMRMQ6aBnB4+TJk8tzN27ckP9vPAZEFByDBCKPateunUqVKlXQ54wzMf74449yEs2ZM6dyC2yzHhb5ww8/SHCDaabHjx8fsF7Pnj3Vhg0bpHsCLQfw8MMPq9OnT3O+CKJ4YJBA5FGHDh2K9zwJbmg9MM8wuXPnTn8uBVpBcuTIEWO9I0eOyHoYnaHt3btXHT9+3NbtJYqaIOHbb79Vb7zxhtq6dav8oS1YsEA1a9bM/zya8YYPH67ee+89GapUu3ZtNWXKFFW0aFH/OufOnZMIf9GiRXIF0LJlSzVhwgSVJk0a/zr4w0YRFVwxZM2aVdbv37+/FftMFBVatWolfztelDt3btW0aVN5rKtNbty4Ue7RvfDuu+/K48qVK6siRYpIV8PUqVNl2RNPPCFdDseOHZPcDCKyMEhABI+kIVR4Myc+wZgxY9TEiRPVRx99pAoWLKiGDh2qGjVqJNG7ToZq06aNBBgYzoQ+w2eeeUY9++yzavbs2fL8pUuXVMOGDSWpCH/Yu3btkvfLkCGDrEdEcevXr1/IxEW3K168uJo0aZI8RgBgzC/AhQqSMGH16tWqXr16MpJBB0wnTpyQlgV0PzBIILI4SMDQolDDi/DHiT7BIUOG+KP8mTNnquzZs6svv/xStW7dWu3bt0+GLKGFQH+Bvf3229JPOHbsWJUrVy41a9YsifRRvAVfAKVLl1bbt29X48aNY5BAFE/IOzhz5kzAssyZM0vr3fXr1yUYN0JLXsqUKaXrQZ9Qz58/78gEP3w/6H3DtobaxmvXrsl6aNXU+4THOAbGvAwisiEnAf1/iNKNw4owThvjmZE8hCAB92gRMF7hYH380W7atEmqxWGdunXr+rORAa0Rr7/+unxpZcyYMcZ740sPN838BUgUbR5//HF19913Byw7ePCgSpcunVxhmydpGj16tLTYoX9/z549/r9N3ffvJPiuQC4FYPtClYx+7rnnpKUSwZHep/r160viIgINIrIxSECAAGg5MMLP+jnd1BewEcmSSfaxcR10VZhfQz8XLEjAFxwnZiH6FwLqUHMfIKA2Vy7EVbeWJUsW/9+mE6GbUm8/AgBsZ7Cqiege1evplgTkRIWjaiORFznzGyARBg0apPr06RPQkpA3b96IbhNRpHMS8uXLF7AM3QlxQSDRt29fefzHH38oJypWrJgkM4NuRVi1alWMIko///xzRLaPyCssDRL0ECSUfDWOucbPFSpU8K9jjuLRn4joXv9/3OP/GOmfgw1z0gVVdFEYIvq/0Q1Vq1ZN8P9DQSKMNnKyPHnyqB49egQsw4grp283UVQHCegiwEkcEb0OCnBFj/5DnW1cs2ZNSRzCHzSGJwH6R3H1omuxY50XX3xRmhR1nypGQiCjOVhXAxHF9OuvvwYMKzZyagtBUqCLBDUTAKOpAHNRpE6dWvKgkDQNTkzEJPJMkIAqZcYiLUhWxMgD5BSgabNXr17q1VdflboIeggkRizoWgolS5ZUDz30kOrcubMMb0QggCsCJDViPXjyySclv6Bjx45qwIABavfu3XKFgFr0RBQ/Tz31VMiEPl2+2GsVJjG8GhccCAwA9RLuu+8+aaksXLiwLPv7778jvKVEHg4StmzZItnBms4DwB/ohx9+KAWPkCyEoYpoMahTp44MeTROGIMhjggMHnjgAX8xJdRWMI6I+Oabb6SYElobcIUwbNgwDn8kSgBk7+tKijqpz/yzcZlb6WRMfJdgRJSeqwHwM757cK9HPwU7BkRkUZCAwiSx/XHhD/Dll1+WWyhoddCFk0IpV66c+u677xK6eUT0/6FmCVr0UCcAQTzMmTNHrrIxzBgtfoDKp/i7RT0SN8JFhrFlBPuiExjxPQIY9mlOatyxY4caPHiwzVtL5C6eGd1ARIFq1aoliYtHjx71L3vwwQelf95YIwCFzNzcmoCTv3mqaBRvM+4TWhKwn0ZOnw6byAkYJBB5FFoL0IpgrLqIpGLMDLlt2zb/MnQHui1fAWWWly5dGtDdoKGl07xPwaAlgYhixyCByKOQRBxsWCQYuwwfeeQR5TY4wevtNnd/Imhw4z4RORGDBCIPQRO7sZy5VcLxmondDqdsC1E0YJBA5CEoT4wRSFYzzwERKRj1FI46B8hjIKKYGCQQeQiGAZYtW1Z5FeqsEJF9GCQQeYCds56i3kDatGltez8UP+K0zkSRwSCByOWQuIfWA7uKA6Hkup3TR2P6akxxbVdOB6aWdvOQUCIrMUgg8gBjLYRwK1SokCpQoICtU157ca4JIjdgkEBEiYYS7OHoCsBEbvGZ1pqIwotBAhEl2rx581Tv3r0tf90ZM2b4J4UjoshhkEBEiYbyzpjILRyvS0SRxyCBiCwxbdo0uZ8+fbratGmTzI2gZ3fFlPEnT54MWH/y5MlS10FD4uVzzz1n81YTUWwYJBCRJTp16iSjAtatWydBAgowde7cWZ4bO3ZsjCABoxZSpEjh/5lBApHzMEggIkts375d7s+dOxfjuTJlykhthWvXrqm9e/f6519AIJE1a1aVJ08e27eXiOLGIIGILFG9evWQs0h+9tlnco8AAXUWoE6dOnLfrVs3NX78eFu3lYjih0ECEVnCGBygPDRuehkeG+/h5s2bco+5GNwwPTVRNGKQQESWWLVqVcDPCAIaNmwYo66C2cKFC9W+ffvCvn1ElHAMEojIEvfdd19AOWMEBKtXr47z/6GaIisqEjkTgwQistTWrVvlpI8uhObNmwc8d/nyZbVy5Up53LRp04DuB1iwYIGt20pEsWOQQESWeuutt9SsWbNUunTpYhRa2rNnj38q6zlz5qjkyZMHDIG86667bN9eIgqNQQIRWTalM+BEj3kXUEzJPJsiWg70nAx4jrMtEjkbgwQiskTFihXlfsCAAerFF1+M0ZUAhQsX9tdTQI0EInI2BglEZIn9+/fLferUqVWxYsWCroMKi6GeIyLnYZBARGGBIZDITzDKli2bat++vTweN26c1EioVKmSatCgQYS2kohiwyCBiMICMzmi68GofPny/iBh8ODB6vr166pHjx4MEogcikECEVkKIxqOHz8u8zTkypUr4LlMmTLJc3o0A1y9elWW6Z+JyDkYJBCRpfr06aMGDhyo0qRJo3bv3h3w3MGDB1Xp0qX9LQ2A4ZKsj0DkTAwSiMhSqLSIG/INMmTIEPAckhrPnz8fsAxdDrgRkfMwSCCisNVN6NKlS8CyYNNIE5FzMUggorCNbpg2bVqkN4OIkoBBAhElWubMmWXEgtXM3RREFBkMEogo0Zo1a6aaNGli+etyDgciZ2CQQERJOpnzhE7kXQwSiDygUKFCtr0Xah0cPnzYtvfLmjWrrftHRP9ikEDkAU899ZSt7/fxxx/b9l41a9aUGxHZj0ECkctFYrplO6sjcjpposiJOZcrEREREVsSiNwPV/UXL1607f3uuecelSNHDtve788///SXcLZD+vTp2XpB9P8xSCDygClTptj2XrVr11ZLly617f3q1Kmjdu7cadv7Yd4JIvo/DBKIPMDOK+3bt2+rFClS2PZ+mAPCzv0jon8xSCCiRDtz5oz6/fffLX/dggULqowZM1r+ukQUxiBh9OjRav78+ernn39WKVOmVLVq1VKvv/66Kl68eMCkLn379lWfffaZzOzWqFEjNXnyZJU9e3b/OvhS6dq1q1qzZo1MJ9uuXTt57WTJ/t2ctWvXypSze/bsUXnz5lVDhgxR7du3T+DuEVE4ffnll6pbt26Wv+7s2bPVY489ZvnrElEYRzesW7dOde/eXW3cuFGtWLFCJnBp2LChTAur9e7dWy1atEjNmzdP1kfSUYsWLQKaKh955BFpPvzhhx/URx99pD788EM1bNgw/zpHjhyRderXr6+2b9+uevXqpTp16qSWL1+ewN0jonD6559/5HsAN/xtm2/6uWC32NbH6xKRy1oSli1bFvAzTu7ZsmVTW7duVXXr1pUM6+nTp8tVwP333y/rzJgxQ5UsWVICixo1aqhvvvlG7d27V61cuVJaFypUqKBeeeUVNWDAAPXSSy+p5MmTq6lTp0pz45tvvimvgf+/fv169dZbb0nLRDDmOekvXbqUmONBRImEv20jtCo++uijIdf/+uuvA1oPoUGDBmHbPiKyOSdBD7tCmVZAsICrAOMfeokSJVS+fPnUhg0bJEjAfdmyZQO6H3DiR/cDuhYqVqwo65i/LLAOWhRCQXfFiBEjkrI7RJQEuDAwDh00tjAGU69evYAESDsLNBFRmIMENAfipI3hUGXKlJFlJ06ckJYA8zSvCAjwnF7HGCDo5/Vzsa2D1oFr165JPoTZoEGDJIdBw7rIZSAi+/ITECRUrVpV5c6dO0aQj/wjozvvZC03Is8GCchN2L17t3QDOAGuSOwclkVEgXTu0Zw5c9Tjjz8e8NykSZNU4cKFI7RlRJRYiQrle/TooRYvXiyjE/LkyeNfjipsSEi8cOFCwPonT570V2jDPX42P6+fi22ddOnSBW1FICLnwHfA1atXpdVPQwtDsBsReShIQJ8hAoQFCxao1atXS3KhUeXKldXdd9+tVq1a5V+2f/9+GfKoZ3HD/a5du9SpU6f862CkBAKAUqVK+dcxvoZehzPBETlf//79VaVKlWSINBFFUXcDuhgwcmHhwoUqbdq0/hwC1DrHFT7uO3bsKLkBSGbEib9nz55yckfSImDIJIKBp59+Wo0ZM0ZeAzUQ8Nq6u6BLly7SPIkvmw4dOkhAMnfuXLVkyZJwHAMistDx48flRkRRFiTo+vDISjbCMEdd6AjDFJGQ1LJly4BiStpdd90lXRUYzYDgIXXq1FJM6eWXX/avgxYKBASouTBhwgTp0nj//fdDDn8kIuf4z3/+I6OajND6GKp7ASOa9JBpInJxkBCfIUqYIe6dd96RWyj58+eXMdKxQSDy008/JWTziMgB2rRpo1q1ahWwDEHDgQMHgq6PLkwGCUTOxLkbiMhSSFxGojFaDvRQZhRdu3z5skzWdPr06UhvIhHFEwcqE5GlMHdL6dKlVbVq1fzL0MWIIdPIZyIi92BLAhFZ6sqVK3KP6qu6ixJJzGhZwD0RuQdbEojIEkguxq169er+uRswUgk3TClNRO7DIIGILIHhyhgCXaRIEX9LwrRp0+TGCdeI3IndDURkiR07dsg95m5BMSXM74Kp3s2jn/AcYPQSuiPQyoD1OMETkfMwSCAiS+huhpkzZ6px48ZJaeaMGTMGrFOoUCGZ5RWQn4BaKiiUNn/+/IhsMxHFjkECEVk2Z4OWLFkyKZymoVUBN/2cEZYb/y8ROQeDBCKy1MiRIyWB8fbt2/5lqMiaKlWqgPWQs0BEzsYggYgshQnccDP64YcfIrY9RJR4DBKIKNHy5cunmjRpYvnr5sqVy/LXJKKEY5BARImGSdcws6vVQk0GRUT2YpBAREk6mfOETuRdDBKIPKBTp062vRcSEPW08XaoU6eOqlKlim3vx6CH6F8MEohcDic1VDW0y8qVK8PSxRDKpk2bVNWqVW17vxEjRtj2XkROxyCByCO8fAVs176x6iNRIAYJRB5y69YtNWrUKMtfN3369OqFF15Qkfbmm2+qv/76y/LXHTJkiLrzTk5lQ2TGIIHIQ1DAaPjw4Za/bv78+R0RJIwZM0adOnXK8tcdPHgwgwSiIBgkEHkcyiPnzp1bHv/xxx9SBhnJh1myZAlY7/z58+ry5cvKDTBRVLZs2QKWYabJCxcu+Os3AAIKTFltlCdPHgkIsDwcAQeRlzB0JvI4BAi6CiImVdL1DfQyfWvbtq1yi2rVqsXY/l69evmDIr2sVq1aMf7v2rVr5bnp06dHYMuJ3IUtCUQeh6Q/HRzoBEBMspQ2bdqA9e6++27lFth+vU862RCtCxr2DftqnkwK0qRJI8+nTJnSxi0mcicGCURRaPPmzTLpktGPP/6o3Khjx46Si1GkSBH18ccfB80tQEDxzjvvyONhw4ZJV8OJEycisLVE7sIggSgK/fbbb2rmzJnKCxAYYFTH0KFD1VNPPRV0HbQy6Of69++vjh8/bvNWErkTgwQij7tx44a0HIBx+mazAgUKqBw5ckjzPQoYuUX16tVlv/LmzSs/Y/t1qwjyMWrUqKEyZcrkX79y5crqzJkz6uLFi2rfvn0R224iN2CQQORxuGquXbu2PMYVdyh9+vRRXbt2laAiderUyi2QiGjMt8DoDb2/y5YtU/fdd1/A+gsWLJD7NWvW2Fo5ksiNGCQQeRT65vWJM7bgwLg+Ev1wknUTnZyI7cZ+6nvjPhnhmLCyIlH8MEgg8qj3339flShRQmoBNGvWTHnd7Nmz1dSpU+MMAFq2bCndDbqmAhGFxiCByKPKlCkjEyMdPXpURYNjx46p77//Ps71kJ/BxEWi+GGQQORRK1asUL/88os6e/asf1mrVq1U8uTJA9abNWuW8oJSpUqpNm3aBCxDYuLJkydldEM0tKYQWY1BApFHvfjiizGWYUppTNZkbqb3Qh/9o48+Kjejhx56SH3zzTcqe/bsDBKIEoFBApFHYX4GlCg2unr1aoxlqD6IIEFXXERin67GiBkXnZ7IeOXKFdl+tJCkSJFCHmOZccgn9kHPS4GRG9g/JDdeu3YtottO5HQMEog86rPPPlPlypULWNa4ceMYkzjt2LFDAgNdSwCjATC3AeDKfPfu3crJKlasKMFAz549Ve/evSUgKF++vDynqyqiy0Uvmz9/vsqYMaP64Ycf1JNPPhnRbSdyOgYJRB6FwkiY4tkISYyY7dEI6+ihkoDH+v+Z8xec6Ndff5VWAeN+HTlyJGAdBA56Wc6cOaX7AfkaRBQ7BglEHocplN9++215/MILL4TsPkCio67MqDl1fgMEBiNHjpTHCe0OGT9+vEzydPjw4TBtHZF3MEgg8jiUHx4yZIg8xtV2hgwZgq63dOlS9dZbbyk3wAle71NCvfbaa5ZvD5FXMUgg8ii0AmAiJ2NNgD/++EOChlAtDm6G/cL+Oj3RkshNGCQQeVTr1q1lJINxeGPNmjUD8g+Mrl+/rtwM1RZnzJgR6c0g8hQGCUQeheGOZnpooBdhYirciMg6DBKIPATDF2fOnGn56yLRzwkmTZqk/v77b8tfFxNBEVFMDBKIPATdC08//bTyKpSVJiL7MEgg8gDkHdhVWhnvEyqvIVzvx2REIhcECVOmTJEbxihD6dKl1bBhw6SKG6AZsG/fvlLpDUlQjRo1UpMnT5bCJdrvv/+uunbtqtasWSNNmO3atVOjR48OmPN97dq1qk+fPmrPnj0qb968MtSpffv21u01kYfgJKr/Bu2QK1cutXjxYtveb+LEiTK1s12Q3ElEiQgS8uTJI2OMixYtKl9MH330kWratKn66aefJGBASdQlS5aoefPmySQyPXr0UC1atPBP34rSqY888ohUgkNJVAzNatu2rdSMHzVqlKyDqmhYp0uXLjI73apVq1SnTp2kShqCDiKKCZMY2aVu3brq4YcftnWiqu3bt9v2fjVq1LC1pYTIM0FCkyZNAn5GxTO0LGzcuFECiOnTp8uMcvfff788j+FIJUuWlOfxh4cvsr1796qVK1dK60KFChXUK6+8ogYMGKBeeuklKQGLYUwFCxZUb775prwG/v/69eulyAuDBCJnQeCvJ1GyEloWmUxI5OKcBHwxoMUAs8SheW7r1q3q5s2bqkGDBv51SpQoofLly6c2bNggQQLuy5YtG9D9gBM/uh/QtYCJWrCO8TX0Or169Yp1e9C9YRzn7fbCMERusHDhQn95ZCuhxfLBBx+0/HWJKMxBAmaHQ1CA/APkFCxYsECVKlVKmgPREmAu+YqAQNd/x70xQNDP6+diWwcnfUzrmjJlyqDbhbyGESNGJHR3iCgJkCuwbds2y1/XPAkVEbkkSChevLgEBCiB+vnnn0vi4bp161SkDRo0SJIdNQQVSHokoshArlF8hmPu37/fn7dERC4PEtBaUKRIEXlcuXJl9eOPP6oJEyaoJ554QqqdXbhwIaA14eTJk5KoCLg3zzKH5/Vz+l4vM66TLl26kK0IkCJFCrkRkTPcc8896v33349zvWnTpjFIIHKoJGcGYfwycgEQMODKAaMRjFcIGPKohxThHt0Vp06dCpieFgEAuiz0OsbX0OtwWBKRO6ROnVplzJhRLhbQ4ogbvicwYgD3epm+oRuRiDzQkoAmfYzHRjLi5cuXZSQDahosX75chjx27NhRmvwzZcokJ/6ePXvKyR1Ji9CwYUMJBtAEOWbMGMk/QA2E7t27+1sBMPQRpVf79++vOnTooFavXq3mzp0rQyuJyPnGjRsnI6Fw8sfQaEBLQYECBdShQ4f8o59im2OCiFwYJKAFAHUNUN8AQUG5cuUkQNBZyBimiGFLLVu2DCimZCwZiyIsGM2A4AFXHMhpePnll/3rYPgjAgLUXEA3BoZWosmSwx+J3AEtCKhrgpFPf/75pyzTwyRv3brlX0ZEHgsSUAchrj7Id955R26h5M+fX3399dexvk69evWkQBMReQtGKqEVEQYPHixBQ61atVSzZs2kQBtqphCRc7BaCRHZJkuWLKpfv35yQ8siVKpUyb+MiJyFEzwRkSVQrl3nGPzyyy9SS0UvQ1IzYATU0aNH5bGekArJi1jfrgmqiCj+GCQQkSV0FyESkTFvC4qt4eQPevgyfq5atao/YIBPP/1UzZ8/P2LbTUShMUggIkukSpVKhjkizwBJi0hixjINLQVIYMRzRlgfNyJyHgYJRBQWGAKJImtGGB6NSq3w3//+V+Z7ISLnYpBARGGB1gFMAmdUvnx5mekVOMsjkfMxSCAiS6CwGmTNmlU98MAD0rWgl2GYI/ISChcu7F+/fv36MVoSzNVWiSiyGCQQkSX0FO9IRBw7dqyMckDlVfjwww9VoUKFJGdBQ9E084iGZMn4lUTkJPyLJCJLYF4GDTUQ0J2ghz7iObQsIEjQ3Qz6Hst1RUYichYGCUQUFqjAunHjRnnct29fmaulWLFiMueL0cKFC9WoUaMitJVEFBsGCUQUFmhNQDVFOHjwoDpw4EDQoY6nT59WW7dujcAWElFcGCQQkaWQrGiuhXDp0iW5P3funJoxY0bAcz/88IOt20dE8ccggYgsNWXKFLkFg5LMmAKeiNyBQQIRJVry5Mll2nir6YRHIoosBglElGitWrXyD320EiozElHkMUggokRLnTq13IjImxgkEHmALlpk19BGnYhoB1RqtHP/iOhfDBKIPKBr1662vReqIk6ePNm290P55rp169r2fkT0LwYJFFaotHf9+vVIb4anKxyiiiGu7u30999/2/ZeSGKMRCIjZrHkJFThkSJFCh5bl2CQQGF18eJFNX369EhvBlGChRrGSUnXuXPnsIyKIesxSKCwwgQ+V65ckXs76/OjSdzOyYLsvLIG477ZfWxxBYihj3ZBS5R5IqhwV4pE6ww+t2CeqTLcUqVKZdt7Yd/s3D98bnFs7fx9UtIwSCBb3Lhxw9YWBcwVYGfRHpQftqtbBV0L5n2bNm2askuVKlXURx99ZNv7tWzZUv38888Ry+/ADJZ2/W6RpLl9+3ZlZ2vJpEmTbHu/Z5991tYAk5KOQQLZAlcOqNFvF1ytZM2a1bb3O3PmjG2tCTiRmNl5bFFy2c5je/nyZVv3zwylpO363aIVIXPmzMpOZ8+ete292ILgPgwSyPPQbByOJlX0qUZ78hWusK9evWr566L2QrRfcaIL6fz585a/Lo4rh5RSfDFIIM/r3r27WrlypeWvi5kLc+TIoaLZvHnz1IABAyx/3alTp6omTZqoaHb8+HHp2rHaww8/rD744APLX5e8iUECeR6ai//880/LX9fOZEGnQitCOI4thh9GOwxxPXnypOWve+HCBctfk7yLQQJFtfz586suXbqE7D8dPHiwPH7mmWdUsWLF5OT18ssv27yV7jB69Gi5nzNnTsjku5w5c6rnn39eHg8dOlTdunXL1m10u7Jly6r27dsHLFu4cKH69ttvA5b17t1b5cmTRwKCV155xeatJC9hkEBRDV+kAwcODHklp4OEJ554QjVq1EhaJRgkBIduBySM7t69O2SQkC1bNv/xfumllxgkJFCRIkVUnz59Yky/bQ4SnnrqKRlx8/vvvzNIoCRhkEBRqVChQjIeHietQ4cOBTyXIUMGlSVLloBlaFLHeigORUlLdNTHW2e643jr0RIHDx6M6Pa5IQn3wIED8rho0aISlAWD4CBNmjSS10CUFAwSKCp988030vS9bds2Vb58+RhNta+++mqMsfMIKihpcILTxxu1M6B169bqzTfflKABJzYKbfXq1apChQr+gCFUkIBjipE3HHJIScUggaISChKh3gAqwJmH8GG4JL5cjV+wnH/CGujCMR9v/A5QH4AntPgly+qkTv0ZDXbc+HklqzBIoKj03HPPSZCAHAPjcD60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RszLcPjwYfXYY49FaAuJKKEYJBCRJSpUqBBy7oZSpUqpwoULy4gHInIPBglEZIkZM2bIPfIQChYsGHSdjBkzqs6dOwd0S5QsWdK/7L333rNte4kobgwSiMgSHTt29Nc/CBUk5MyZU7377rsBy+699165AYMEImdhkEBElsKohgsXLgR0N1y6dEmWxYZDIImch0ECEVmqT58+Mg20ccRC48aNY1RXNGOQQOQ8DBKIyFLnz5+Xm9HJkycjtj1ElHgMEogo0apWrapGjhxp+euWLVvW8tckooRjkEBEiVaxYkW5EZE3MUggogRj/gBRdGCQQOQBmFHRLjly5FALFy607f0qVaqk8ufPb8t7GYtBERGDBCLXw4kN1Q7ttH37dtveK2/evHIjIvsxSCByqTvvvFM9+OCDkd4Mz2KrAhGDBCJXn8T0BEpEROFwZ1helYiIiFyPQQIREREFxSCBiIiIgmKQQEREREExSCAiIqKgGCQQERFRUAwSiIiIKCgGCURERBRdxZT0BDSXLl2K9KYQERE5ij43xjVZm2eDhLNnz8o9a74TEREFd/nyZZU+ffroCxIyZcok97///nusB8BtkR+CnqNHj6p06dIpt/Pa/gD3yR24T87ntf1x2j6hBQEBQq5cuWJdL5mXJ78BBAiR/mVYDfvjpX3y2v4A98kduE/O57X9cdI+xecCmomLREREFBSDBCIiIoquICFFihRq+PDhcu8VXtsnr+0PcJ/cgfvkfF7bH7fu0x2+uMY/EBERUVTybEsCERERJQ2DBCIiIgqKQQIREREFxSCBiIiIgmKQQERERNETJLzzzjuqQIEC6p577lHVq1dXmzdvVk7x7bffqiZNmkgpzDvuuEN9+eWXAc9jsMmwYcNUzpw5VcqUKVWDBg3UwYMHA9Y5d+6catOmjVTsypAhg+rYsaO6cuVKwDo7d+5U9957rxwDlAEdM2ZMWPZn9OjRqmrVqipt2rQqW7ZsqlmzZmr//v0B6/z999+qe/fuKnPmzCpNmjSqZcuW6uTJkwHroHz2I488olKlSiWv069fP3Xr1q2AddauXasqVaokw4eKFCmiPvzww7Ds05QpU1S5cuX8VdFq1qypli5d6tr9MXvttdfks9erVy/X7tNLL70k+2C8lShRwrX7ox07dkw99dRTst34+y9btqzasmWLa78f8D1s/j3hht+N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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create blank canvas\n",
"rows = len(layout)\n",
"cols = len(layout[0])\n",
"canvas = Image.new(\"RGB\", (cols * TILE_SIZE, rows * TILE_SIZE), BACKGROUND_COLOR)\n",
"\n",
"# Paste tiles\n",
"for y, row in enumerate(layout):\n",
" for x, idx in enumerate(row):\n",
" if idx is not None:\n",
" path = images.get(idx)\n",
" if path is not None:\n",
" tile = Image.open(path)\n",
" # for the face index 4, rotate the tile 180 degrees\n",
" if idx == 4:\n",
" tile = tile.rotate(180)\n",
" canvas.paste(tile, (x * TILE_SIZE, y * TILE_SIZE))\n",
" else:\n",
" logging.warning(f\"Missing: {idx}\")\n",
"canvas_with_border = ImageOps.expand(canvas, border=BORDER_SIZE, fill=BORDER_COLOR)\n",
"\n",
"plt.imshow(canvas_with_border)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"canvas_with_border.save(\"merged_uv_layout.png\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}