{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "aac19a2e",
   "metadata": {},
   "source": [
    "# **Spin** calculation\n",
    "\n",
    "IDEA:\n",
    "- take in consideration only the ball for each frame\n",
    "- draw a lot of points on the ball\n",
    "- take the motion of these points between consecutive frames (optical flow)\n",
    "- from this motion we extract the direction of the rotation and so the axis of rotation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1454,
   "id": "b21740cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "import numpy as np\n",
    "import cv2\n",
    "import pandas as pd\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1455,
   "id": "747961da",
   "metadata": {},
   "outputs": [],
   "source": [
    "VIDEO_NUMBER = \"3\"\n",
    "PROJECT_ROOT = Path().resolve().parent.parent\n",
    "INPUT_VIDEO_PATH = str(\n",
    "    PROJECT_ROOT\n",
    "    / \"data\"\n",
    "    / f\"recording_{VIDEO_NUMBER}\"\n",
    "    / f\"Recording_{VIDEO_NUMBER}.mp4\"\n",
    ")\n",
    "INPUT_CSV_PATH = str(\n",
    "    PROJECT_ROOT\n",
    "    / \"data\"\n",
    "    / \"auxiliary_data\"\n",
    "    / \"circle_positions\"\n",
    "    / f\"Adjusted_positions_new_{VIDEO_NUMBER}.csv\"\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1456,
   "id": "5bab471c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load video and CSV\n",
    "cap = cv2.VideoCapture(INPUT_VIDEO_PATH)\n",
    "if not cap.isOpened():\n",
    "    raise IOError(\"Error: Could not open video.\")\n",
    "df = pd.read_csv(INPUT_CSV_PATH)\n",
    "if df.empty:\n",
    "    raise ValueError(\"Error: The CSV file is empty.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0be26a6",
   "metadata": {},
   "source": [
    "Selecting a frame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1457,
   "id": "cd59c302",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Select frame and next frame\n",
    "frame_number = 90\n",
    "cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)\n",
    "ret, frame1 = cap.read()\n",
    "if not ret:\n",
    "    raise IOError(f\"Failed to read frame {frame_number}.\")\n",
    "ret, frame2 = cap.read()\n",
    "if not ret:\n",
    "    raise IOError(f\"Failed to read frame {frame_number + 1}.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1458,
   "id": "4de0d158",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Extract ball center and radius\n",
    "df_row = df.iloc[frame_number]\n",
    "ball_center = np.array([int(df_row[\"x\"]), int(df_row[\"y\"])])\n",
    "ball_radius = int(df_row[\"radius\"])\n",
    "\n",
    "# Compute ROI bounds\n",
    "offset = 2\n",
    "x_min = max(ball_center[0] - ball_radius - offset, 0)\n",
    "x_max = min(ball_center[0] + ball_radius + offset, frame1.shape[1])\n",
    "y_min = max(ball_center[1] - ball_radius - offset, 0)\n",
    "y_max = min(ball_center[1] + ball_radius + offset, frame1.shape[0])\n",
    "\n",
    "# Crop ROI and convert to grayscale\n",
    "roi1 = frame1[y_min:y_max, x_min:x_max]\n",
    "roi2 = frame2[y_min:y_max, x_min:x_max]\n",
    "gray1 = cv2.cvtColor(roi1, cv2.COLOR_BGR2GRAY)\n",
    "gray2 = cv2.cvtColor(roi2, cv2.COLOR_BGR2GRAY)\n",
    "\n",
    "# Compute center in ROI coordinates\n",
    "center_roi = np.array([ball_center[0] - x_min, ball_center[1] - y_min])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1459,
   "id": "eff9eb92",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generate 100 random points inside the circular ROI\n",
    "h, w = gray1.shape\n",
    "points = []\n",
    "while len(points) < 100:\n",
    "    x, y = np.random.randint(0, w), np.random.randint(0, h)\n",
    "    if (x - center_roi[0]) ** 2 + (y - center_roi[1]) ** 2 <= (ball_radius * 0.8) ** 2:\n",
    "        points.append([x, y])\n",
    "p0 = np.array(points, dtype=np.float32).reshape(-1, 1, 2)\n",
    "\n",
    "# Track points to next frame\n",
    "p1, status, _ = cv2.calcOpticalFlowPyrLK(\n",
    "    gray1,\n",
    "    gray2,\n",
    "    p0,\n",
    "    None,\n",
    "    winSize=(15, 15),\n",
    "    maxLevel=2,\n",
    "    criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03),\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1460,
   "id": "82f29cb5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Lift 2D points to 3D on sphere surface\n",
    "old3d = []\n",
    "new3d = []\n",
    "for old_pt, new_pt, s in zip(p0.reshape(-1, 2), p1.reshape(-1, 2), status.reshape(-1)):\n",
    "    if s == 1:\n",
    "        ox, oy = old_pt - center_roi\n",
    "        nx, ny = new_pt - center_roi\n",
    "        oz = np.sqrt(max(ball_radius**2 - ox**2 - oy**2, 0))\n",
    "        nz = np.sqrt(max(ball_radius**2 - nx**2 - ny**2, 0))\n",
    "        old3d.append([ox, oy, oz])\n",
    "        new3d.append([nx, ny, nz])\n",
    "old3d = np.array(old3d)\n",
    "new3d = np.array(new3d)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1461,
   "id": "8be3f5c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Kabsch algorithm to find rotation matrix R\n",
    "# subtract centroids (but both centered at origin already)\n",
    "H = old3d.T @ new3d\n",
    "U, S, Vt = np.linalg.svd(H)\n",
    "R = Vt.T @ U.T\n",
    "# ensure right-handed\n",
    "if np.linalg.det(R) < 0:\n",
    "    Vt[-1, :] *= -1\n",
    "    R = Vt.T @ U.T\n",
    "\n",
    "# extract axis-angle from R\n",
    "theta = np.arccos((np.trace(R) - 1) / 2)\n",
    "axis = np.array([R[2, 1] - R[1, 2], R[0, 2] - R[2, 0], R[1, 0] - R[0, 1]])\n",
    "axis = axis / (2 * np.sin(theta))\n",
    "axis = axis / np.linalg.norm(axis)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1462,
   "id": "ec2c6c71",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAGrCAYAAADn6WHYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAe/lJREFUeJztvXe4FdX1/79mTrsNLh2p9yKIIEqRqjQVFLtGEUsSS9CoGI0ajTUW9IMxFiRGsAaUmNiIiS0WrNjRgEZRBKVaKAIXuNx7T9u/P/hyP6z3WpwZTsby/f7W63l4ePbcvWf2zOw5+5z9nvdannPOkWEYhmH8l/g/dAcMwzCM/zewCcUwDMOIBJtQDMMwjEiwCcUwDMOIBJtQDMMwjEiwCcUwDMOIBJtQDMMwjEiwCcUwDMOIBJtQDMMwjEj4/+2E8sorr5DnefTKK6/80F2JhGuuuYY8z/uhu/GjYL/99qP99tvvO9t/dXU1nXrqqZHs68d03zZv3kxt2rShBx988IfuivE9cOmll9LgwYMj3WdkE8qMGTPI87zGf/F4nDp06ECnnnoqffnll0Xt880336RrrrmGNmzYUHS/pk6dSjNmzCi6/XfNoEGDyPM8mjZt2g/dFcb69evprLPOog4dOlB5eTn16dOHbrrppp3ej3OOZs6cSSNGjKBmzZpRWVkZ7bXXXjRx4kSqra0tun8LFiyga665hpYuXVr0Pr5rtn8etv+3yy67/NBdU5kyZQo1adKETjjhhMZt2yY87d+dd975A/Y2Wl544QUaNmwYlZWVUfPmzWns2LE7HFtPPPEE7b333lRSUkKdO3emq6++mrLZ7Hfex4ceeqjxuK1bt6bx48fT2rVrRb1p06bRcccdR507dybP83b45ef888+nDz74gJ544onoOukiYvr06Y6I3MSJE93MmTPdPffc48aPH+9isZjr2rWrq6ur2+l93nTTTY6I3JIlS4ruV69evdzIkSPF9lwu5+rq6lwulyt63/8tn332mSMiV11d7YYOHfpf7SuTyRR1jXfEkUce6eLxuDv//PPdnXfe6c4++2zXp0+fndpHNpt148aNc0Tkhg8f7iZPnuzuuusu97Of/cz5vu/23HNP98033xTVv0cffdQRkXv55ZfF3xoaGlxDQ0NR+w1DVVWVO+WUUwLrEZE78MAD3cyZM9m/xx57rLHO1Vdf7SJ8DIsmnU671q1bu0mTJrHt2/o3bdo0cR6fffbZD9TbaHnyySed7/tuwIABbsqUKe66665zrVq1ch06dHCrV69mdZ955hnneZ7bf//93d133+3OPfdc5/u+O+uss77TPk6dOtURkRs1apS744473GWXXebKyspc7969xXNfVVXlWrRo4Q4++GAXj8cLjtVx48a54cOHR9bPyCeUuXPnsu2XXHKJIyL38MMP7/Q+v8sJ5cfAVVdd5dq0aeNmzZrlPM/7r84zSjZv3ux833cTJkxg2+vr63dqP5MmTXJE5C666CLxtyeeeML5vu8OPvjgovpYaEL5rtmZCeWcc84pWOfHMqH8/e9/d0TkFi9ezLZv69+aNWtC72vz5s1Rd+87ZY899nDdunVjX0Lmz5/vfN93F154oajbp08fl8lkGrddccUVzvM898knnwQea/Hixa62tnan+tfQ0OCaNWvmRowY4fL5fOP2J5980hGR++Mf/8jqL126tLFeeXl5wbH62GOPOc/z3Oeff75TfdoR37mGMnz4cCIi+vzzz9n2l156iYYPH07l5eXUrFkzOuqoo+iTTz5p/Ps111xDF198MRERdenSpfFn9rafodOnT6cDDjiA2rRpQ6lUivbYYw+xbFRdXU0ff/wxvfrqq43tt62t70hDefTRR6l///5UWlpKrVq1op/97Gdiye7UU0+liooK+vLLL+noo4+miooKat26NV100UWUy+VCX5u//vWvNHbsWDr88MOpsrKS/vrXv7K/19XVUY8ePahHjx5UV1fXuH3dunXUrl072nfffRuPp63Fb/sZ36xZM6qoqKDdd9+dLr/88sB+bbtWDgJRp1Kp0OdWV1dHN910E3Xv3p1uuOEG8fcjjjiCTjnlFHr22Wfp7bffbtxeXV1Nhx9+OD3//PPUt29fKikpoT322IP+/ve/N9aZMWMGHXfccUREtP/++zf2d9u91DSU+vp6uuaaa6h79+5UUlJC7dq1o2OOOYaNy5tvvpn23XdfatmyJZWWllL//v3pscceC33OUZHNZum6666jrl27UiqVourqarr88supoaGhsc6FF15ILVu2ZPfo3HPPJc/z6I9//GPjtlWrVoVaUv3HP/5B1dXV1LVr153q67al7ldffZUmTJhAbdq0oY4dOxIR0bJly2jChAm0++67U2lpKbVs2ZKOO+44sZS0bR+vv/46nXfeedS6dWtq1qwZnXnmmZROp2nDhg108sknU/Pmzal58+b029/+VozNfD5Pt912G/Xq1YtKSkqobdu2dOaZZ9L69esL9n/dunW0YMEC+slPfkLJZLJxe58+fahnz5700EMPNW5bsGABLViwgH75y19SPB5v3D5hwgRyzoUaKzNnzqR27drRWWedRXPnzg2sT0T00Ucf0YYNG+j4449nz/jhhx9OFRUVrI9ERFVVVaF1udGjRxMR0T//+c9Q9YP4zieUbYOnefPmjdtmz55NY8aModWrV9M111xDF154Ib355ps0dOjQxvrHHHMMnXjiiURENHnyZJo5cybNnDmTWrduTURb1wmrqqro8ssvp1tuuYU6depEEyZMoDvuuKPxOLfddht17NiRevTo0dj+iiuu2GFfZ8yYQePGjaNYLEY33HADnXHGGfT3v/+dhg0bJnScXC5HY8aMoZYtW9LNN99MI0eOpFtuuYXuvvvuUNflnXfeocWLF9OJJ55IyWSSjjnmGCGGlpaW0v3330+LFy9m/T7nnHOopqaGZsyYQbFYTN3/xx9/TIcffjg1NDTQxIkT6ZZbbqEjjzyS3njjjcC+lZWV0bhx42jGjBk0b968UOeDvP7667R+/Xo66aST2MO3PSeffDIRET311FNs+6JFi+j444+nQw45hG644QaKx+N03HHH0QsvvEBERCNGjKDzzjuPiIguv/zyxnvbs2dP9Ti5XI4OP/xwuvbaa6l///50yy230K9//Wuqqamhjz76qLHelClTqF+/fjRx4kSaNGlS43Gffvrpoq4B0daJbO3atezf9hODxumnn05XXXUV7b333jR58mQaOXIk3XDDDUzbGD58OK1bt44+/vjjxm1z5swh3/dpzpw5bBvR1mtWiDfffJP23nvvHf593bp17Bzwg3rChAm0YMECuuqqq+jSSy8lIqK5c+fSm2++SSeccAL98Y9/pLPOOotefPFF2m+//WjLli3iGOeeey4tWrSIrr32WjryyCPp7rvvpt/97nd0xBFHUC6Xo0mTJtGwYcPopptuopkzZ7K2Z555Jl188cU0dOhQmjJlCp122mn04IMP0pgxYyiTyezwvLbdi9LSUvG3srIy+uqrr+ibb74hImp8FgYMGMDqtW/fnjp27BjqWTnppJPopz/9KT388MM0aNAg6t27N02ZMoW+/fbbovpYWlpK8+bNo3w+H3hsjcrKSuratWuoz4VQRPI7x/3vktfs2bPdmjVr3IoVK9xjjz3mWrdu7VKplFuxYkVj3b59+7o2bdq4b7/9tnHbBx984HzfdyeffHLjtkJLXlu2bBHbxowZ43bddVe2bUdLXi+//DJbMkmn065NmzZuzz33ZGuSTz31lCMid9VVVzVuO+WUUxr1ou3p16+f69+/v36BgF/96leuU6dOjT9Nn3/+eUdEbt68eaLuZZdd5nzfd6+99lrjUs9tt93G6uDSyeTJk3d6qWIbmzZtcqNHj3bJZNK1bdu2qLXy2267zRGRe/zxx3dYZ926dY6I3DHHHNO4raqqyhGRmzVrVuO2mpoa165dO9evX7/GbYWWvEaOHMnu+Z///GdHRO7WW28VdbdfQsAxlU6n3Z577ukOOOAAtn1nlry0f9OnT2+sg/dt/vz5jojc6aefzvZ10UUXOSJyL730knPOudWrVzsiclOnTnXOObdhwwbn+7477rjjXNu2bRvbnXfeea5FixbsPJFMJuM8z3O/+c1vxN+29Q//VVVVOef+97kfNmyYy2azrK32jL711luOiNwDDzzQuG3bPsaMGcP6uc8++zjP85g+kc1mXceOHdn9nTNnjiMi9+CDD7JjPfvss+r27cnlcq5Zs2Zu1KhRbPvatWtdeXm5IyL33nvvOef+9/No+fLlYj8DBw50Q4YM2eFxkLq6Ovfggw+6UaNGOc/zXCqVcscff7x7/vnnha67Zs0a53meGz9+PNv+6aefNt6PtWvXqscJWvJyzrmDDjrI9ezZM3TfCxH5L5TRo0dT69atqVOnTjR27FgqLy+nJ554ovFn8Ndff03z58+nU089lVq0aNHYrnfv3nTggQfSM888E+o428/WNTU1tHbtWho5ciR98cUXVFNTs9P9fu+992j16tU0YcIEKikpadx+2GGHUY8ePdRvqWeddRYrDx8+nL744ovAY2WzWXr44YfZT9hty3faK5vXXHMN9erVi0455RSaMGECjRw5svEb+o5o1qwZEW39Kbuz315OPvlkWrp0KX366afUunVrGj16NC1fvrzx72+99RZ5nkcvvvjiDvexadMmIiJq0qTJDuts+9vGjRvZ9vbt29NPfvKTxnLTpk3p5JNPpnnz5jV+W9wZZs2aRa1ataJzzz1X/G37pYHtx9T69euppqaGhg8fTv/+9793+pjbOOqoo+iFF15g/8aMGbPD+tvG/4UXXsi2/+Y3vyEiahyHrVu3ph49etBrr71GRERvvPEGxWIxuvjii2nVqlW0aNEiItr6C2XYsGEFl0DWrVtHzjm2ioDMmjWLnQOO0zPOOEP8Wt7+emYyGfr222+pW7du1KxZM/Wajh8/nvVz8ODB5Jyj8ePHN26LxWI0YMAA9pw9+uijVFlZSQceeCD7FdW/f3+qqKigl19+eYfn5fs+nXnmmfTiiy/SZZddRosWLaL333+fxo0bR+l0moiocbl52//a0m9JSQlblg6ipKSETjrpJJo9ezYtWbKELrvsMnrnnXfooIMOol133ZUtE7dq1YrGjRtH999/P91yyy30xRdf0Jw5c+j444+nRCLB+lYMzZs3V98WK4bIJ5Q77riDXnjhBXrsscfo0EMPpbVr17IbsGzZMiIi2n333UXbnj170tq1a0O9TvrGG2/Q6NGjGzWY1q1bN+oDxUwohfrVo0ePxr9vY9ure9vTvHnzwDVbIqLnn3+e1qxZQ4MGDaLFixfT4sWLacmSJbT//vvT3/72NzEBJJNJ+vOf/0xLliyhTZs20fTp0wPXSI8//ngaOnQonX766dS2bVs64YQT6JFHHgmcXN5++216/PHHadKkSdSlSxd69tlniWjrF4VVq1YR0dY13Xg8Tv3799/hfrZNFtsmFo0dTTrdunUT59e9e3cioqJeE/78889p99133+HS2zaeeuopGjJkCJWUlFCLFi2odevWNG3atKLG0zY6duxIo0ePZv/atWu3w/rLli0j3/epW7dubPsuu+xCzZo1Y+Nw+PDhjUtac+bMoQEDBtCAAQOoRYsWNGfOHNq4cSN98MEHjTpmEK5A8tYRI0awcxg6dCj7e5cuXUSburo6uuqqq6hTp06USqWoVatW1Lp1a9qwYYN6TTt37szKlZWVRETUqVMnsX3752zRokVUU1NDbdq0odatW7N/mzdvptWrVxc874kTJ9L48ePpD3/4A3Xv3p0GDBhA8Xi8cSKrqKggov+dILUly/r6+sa/19XV0TfffMP+FaKqqoquvvpqevvtt+mII46gZcuW0Y033sjq3HXXXXTooYfSRRddRF27dqURI0bQXnvtRUcccQTrYzE45yLzQhV+wopg0KBBjWuMRx99NA0bNoxOOukkWrhw4X910tvz+eef06hRo6hHjx506623UqdOnSiZTNIzzzxDkydPLno9cWfYkXYRhm3f7saNG6f+/dVXX6X999+fbXvuueeIaOvAXbRokfoAb09paSm99tpr9PLLL9PTTz9Nzz77LD388MN0wAEH0PPPP7/D/r/55ptERDRkyBAiIurQoQM999xzNGzYMDrwwAPplVdeobvvvpsOPfTQxl9BGtv0jA8//JCOPvpotc6HH35IRER77LFHwXP5PpgzZw4deeSRNGLECJo6dSq1a9eOEokETZ8+Xbws8X0Q5gEfNmwY3XPPPY3fWIcPH06e59GwYcNozpw51L59e8rn84ETSosWLcjzvFBfhnaEtr5/7rnn0vTp0+n888+nffbZhyorK8nzPDrhhBPUZ3RHY1Lbvv3kl8/nCxoy8Ysfkkwm6d5776X/+Z//oc8++4zatm1L3bt3p5NOOolN7tu+CHz99ddikvv6669p0KBBRET08MMP02mnnbbD/m5PNpulZ555hqZPn05PP/00Oefo6KOPpjPOOIPVq6yspH/+85+0fPlyWrp0KVVVVVFVVRXtu+++jS8xFMv69eupVatWRbffnsgnlO3ZJm7vv//+9Kc//YkuvfRSqqqqIiKihQsXivqffvoptWrVisrLy4loxw/Vk08+SQ0NDfTEE0+wbzXaT9uwM+/2/TrggAPY3xYuXNj49/+W2tpa+uc//0nHH388jR07Vvz9vPPOowcffJBNKB9++CFNnDiRTjvtNJo/fz6dfvrp9J///KfxG9yO8H2fRo0aRaNGjaJbb72VJk2aRFdccQW9/PLLjW93INuu14oVKxofmm1LfqNGjaL+/fvT8uXL6a677ip47G1vl/31r3+lK664Qv1QeOCBB4ho69sq27N48WLxremzzz4joq1vgW3fzzB07dqV3nnnHcpkMo1LBMisWbOopKSEnnvuOfaLevr06aGPEwVVVVWUz+dp0aJF7CWDVatW0YYNG9g43DZRvPDCCzR37txGMXzEiBE0bdo0at++PZWXlxf8JUlEFI/HqWvXrrRkyZJIz+Wxxx6jU045hW655ZbGbfX19f+VUVmja9euNHv2bBo6dKg6sYWlbdu21LZtWyLa+iLHK6+8QoMHD278Ity3b18i2ro8vm3yICL66quvaOXKlfTLX/6SiIjGjBnT+ALJjliwYAFNnz6dZs6cSatWraLu3bvTddddR6eeempjHzQ6d+7c+Jm3YcMGev/99+nYY48t+pyJiJYsWUJ9+vT5r/axje/8La/99tuPBg0aRLfddhvV19dTu3btqG/fvnT//fezgfXRRx/R888/T4ceemjjtm0TCw7AbR9O28/6NTU16sNfXl4eagAPGDCA2rRpQ3feeSf7Sfuvf/2LPvnkEzrssMPCnG4gjz/+ONXW1tI555xDY8eOFf8OP/xwmjVrVmMfMpkMnXrqqdS+fXuaMmUKzZgxg1atWkUXXHBBweOsW7dObNv2QBR6y2jUqFFEtHUZYHv37+DBg+nKK6+kpUuX0m677UZ77rlnweOXlZXRRRddRAsXLlTfrHv66adpxowZNGbMmMZfQ9v46quv6PHHH28sb9y4kR544AHq27dvo8t8R2ND49hjj6W1a9fSn/70J/G3bWMoFouR53nste+lS5fSP/7xj8D9R8m28X/bbbex7bfeeisRERuHXbp0oQ4dOtDkyZMpk8k0LkMNHz6cPv/8c3rsscdoyJAhgUt9RET77LMPvffeexGdxVZisZj4Zn777bfv1Kv1YRg3bhzlcjm67rrrxN+y2WxRE9jNN99MX3/9daN2RUTUq1cv6tGjB919993sHKZNm0ae5zV+QWzXrp1Y5tzGK6+8QkOGDKFevXrRHXfcQQcddBC9+uqrtHDhQrrkkksKTibIZZddRtlsNvCzoBA1NTX0+eef07777lv0PrbnO/2Fso2LL76YjjvuOJoxYwadddZZdNNNN9EhhxxC++yzD40fP57q6uro9ttvp8rKSrrmmmsa2237ZnXFFVfQCSecQIlEgo444gg66KCDKJlM0hFHHEFnnnkmbd68me655x5q06YNff311+zY/fv3p2nTptH1119P3bp1ozZt2ohfIEREiUSCbrzxRjrttNNo5MiRdOKJJ9KqVatoypQpVF1d/V/dtO158MEHqWXLlju8gUceeSTdc8899PTTT9MxxxxD119/Pc2fP59efPFFatKkCfXu3ZuuuuoquvLKK2ns2LFsAt6eiRMn0muvvUaHHXYYVVVV0erVq2nq1KnUsWNHGjZs2A7717t3bzrvvPPoj3/8Iw0cOJBOPPFEatasGc2ZM4ceeughGj58OL3++ut0xhln0P3331/wXC+99FKaN28e3XjjjfTWW2/RscceS6WlpfT666/TX/7yF+rZs6e6j+7du9P48eNp7ty51LZtW/rzn/9Mq1atYl8Y+vbtS7FYjG688UaqqamhVCrV+GIDcvLJJ9MDDzxAF154Ib377rs0fPhwqq2tpdmzZ9OECRPoqKOOosMOO4xuvfVWOvjgg+mkk06i1atX0x133EHdunVrXJr7PujTpw+dcsopdPfdd9OGDRto5MiR9O6779L9999PRx99tFgKHT58OD300EO01157NYrqe++9N5WXl9Nnn31GJ510UqjjHnXUUTRz5kz67LPPGvWq/5bDDz+cZs6cSZWVlbTHHnvQW2+9RbNnz6aWLVtGsv9tjBw5ks4880y64YYbaP78+XTQQQdRIpGgRYsW0aOPPkpTpkxRVwO28Ze//IVmzZpFI0aMoIqKCpo9ezY98sgjdPrpp4tv/zfddBMdeeSRdNBBB9EJJ5xAH330Ef3pT3+i008/fYevrW/Pq6++SplMhqZOnUonnXRS4CrDNn7/+9/TRx99RIMHD6Z4PE7/+Mc/6Pnnn6frr7+eBg4cyOo++eST9MEHHxDR1i+kH374IV1//fVEtPXzpXfv3o11Z8+eTc45Ouqoo0L1I5BI3hVzO3bKO7f11byuXbu6rl27Nr5aOHv2bDd06FBXWlrqmjZt6o444gi3YMEC0fa6665zHTp0cL7vs1eIn3jiCde7d29XUlLiqqur3Y033tj4euj2rxl/88037rDDDnNNmjRxRNT4uiG+NryNhx9+2PXr18+lUinXokUL99Of/tStXLmS1TnllFNceXm56GuQ63nVqlUuHo+7n//85zuss2XLFldWVuZ+8pOfuPfff9/F43F37rnnsjrZbNYNHDjQtW/f3q1fv1499osvvuiOOuoo1759e5dMJl379u3diSeeGPoV4Pvuu8/179/flZSUuIqKCjd8+HD30EMPOeecu/zyyx0RuWuvvTZwP7lczk2fPt0NHTrUNW3a1JWUlLhevXq5a6+9VnVUV1VVucMOO8w999xzrnfv3i6VSrkePXq4Rx99VNS955573K677upisRi7l/jasHNbr+sVV1zhunTp4hKJhNtll13c2LFjmUP4vvvuc7vttlvjMadPn67e0+/aKZ/JZNy1117b2NdOnTq5yy67TI1UcMcddzgicmeffTbbPnr0aEdE7sUXXwzsp3Nb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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# prepare visualization overlay\n",
    "mask = np.zeros_like(roi1)\n",
    "# project axis to image plane (ignore z)\n",
    "a2d = axis[:2]\n",
    "a2d = a2d / np.linalg.norm(a2d)\n",
    "# draw axis line through center_roi\n",
    "length = ball_radius\n",
    "pt1 = (center_roi + a2d * length).astype(int)\n",
    "pt2 = (center_roi - a2d * length).astype(int)\n",
    "cv2.line(mask, tuple(pt1), tuple(pt2), (255, 255, 0), 2)\n",
    "\n",
    "# draw tracked vectors\n",
    "for (new_pt,), (old_pt,), s in zip(p1, p0, status):\n",
    "    if s[0] == 1:\n",
    "        c = tuple(old_pt.astype(int))\n",
    "        a = tuple(new_pt.astype(int))\n",
    "        cv2.circle(mask, c, 1, (0, 0, 255), -1)\n",
    "        cv2.circle(mask, a, 1, (255, 0, 0), -1)\n",
    "        cv2.line(mask, c, a, (0, 255, 0), 1)\n",
    "\n",
    "# overlay and display\n",
    "output_roi = cv2.addWeighted(roi1, 1, mask, 1, 0)\n",
    "output_rgb = cv2.cvtColor(output_roi, cv2.COLOR_BGR2RGB)\n",
    "\n",
    "# show the ball center\n",
    "cv2.circle(output_rgb, tuple(center_roi), 1, (0, 0, 255), -1)\n",
    "# show the ball radius\n",
    "cv2.circle(output_rgb, tuple(center_roi), ball_radius, (0, 255, 0), 1)\n",
    "plt.figure(figsize=(5, 5))\n",
    "plt.imshow(output_rgb)\n",
    "plt.axis(\"off\")\n",
    "plt.title(f\"Rotation Axis & Optical Flow (Frame {frame_number}->{frame_number + 1})\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
