{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "4b4b8127",
   "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": 1,
   "id": "ceacb661",
   "metadata": {},
   "outputs": [],
   "source": [
    "import cv2\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import time\n",
    "from pathlib import Path\n",
    "from IPython.display import clear_output, display"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c263377f",
   "metadata": {},
   "outputs": [],
   "source": [
    "VIDEO_NUMBER = \"2\"\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": 3,
   "id": "2404afc6",
   "metadata": {},
   "outputs": [],
   "source": [
    "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.\")\n",
    "\n",
    "fps = cap.get(cv2.CAP_PROP_FPS)\n",
    "frame_idx = 0\n",
    "\n",
    "# Read first frame\n",
    "ret, prev_frame = cap.read()\n",
    "if not ret:\n",
    "    print(\"Cannot read first frame.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "4ea06de3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9AAAAH6CAYAAADvBqSRAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAffhJREFUeJzt3Xm4JVV57/G3au999tln7tNzN0hDM2gDghOIIogghEeCSFTAAZwxOHGNqEmcwDmJSQyKQuJFYkAIoNcYNXGeEI03GBQNisxD0/OZ91zr/tHpczn9/qp77T49neb7eR7+4O1VtapWrarqtXef30lCCMEAAAAAAMA2pXv6AAAAAAAAmAtYQAMAAAAAEIEFNAAAAAAAEVhAAwAAAAAQgQU0AAAAAAARWEADAAAAABCBBTQAAAAAABFYQAMAAAAAEIEFNAAAAAAAEVhAY5/w+c9/3pIksfvuu29PHwoAALvcihUr7FWvetVO29+rXvUqW7FixU7b3+72/e9/35Ikse9///t7+lAA7ONYQKMjv/71r+0Vr3iFLV++3Mrlsi1btsxe/vKX269//es9fWh7xAc+8AFLkkT+99nPfnZPH95OsXr1anv3u99tJ510kvX392/zLyhZltlnP/tZO/roo62vr88WL15sp59+uv3kJz+Z0e5Vr3pV7rglSWIPP/zwLjufG264wV7xilfYIYccYkmS2HOf+9zctnfddZede+65tt9++1lPT4898YlPtMsuu8ympqZmtIs9bwDYnrvvvtsuvPBCO+igg6y7u9sGBgbs2c9+tn3yk5+0arW6pw9vp1qxYsWMZ/+iRYvsOc95jn35y1/ercfxyCOP2Ac+8AH7r//6r6j2Wz60V/+9+93v3rUHu5tMTEzY+9//fvuDP/gDGx4etiRJ7POf/3xu+3/+53+2Zz7zmTY0NGTz58+3E0880b72ta/NaLOtvzMlSWK33HLLLjufb37zm/ba177WjjjiCCsUCtv8sGj16tX2hje8wQ488ECrVCq2cuVKe/vb324bNmxwbWPOG/ue4p4+AMwdX/rSl+y8886z4eFhe+1rX2sHHnig3Xffffa5z33ObrrpJrv++uvtRS960Z4+zD3iM5/5jPX19c2oHXvssXvoaHau3/72t/bxj3/cDjnkEDvyyCPt1ltvzW17ySWX2F//9V/bK17xCrvoootsZGTErrzySjvxxBPtlltusWOOOcbMzC688EI75ZRTZmwbQrA3vvGNtmLFClu+fPkuO5/PfOYz9p//+Z/2jGc8Q74Mt3jwwQftmGOOscHBQXvzm99sw8PDduutt9r73/9++8///E/7yle+Mt029rwBYFu+9rWv2Ute8hIrl8t2/vnn2xFHHGGNRsN+/OMf2yWXXGK//vWv7aqrrjKzzc/mNJ3734McffTR9id/8idmtnkhe+WVV9rZZ59tn/nMZ+yNb3xj9H5OOOEEq1ar1tXV1fExPPLII3bppZfaihUr7Oijj47e7rLLLrMDDzxwRu2II47ouP+90fr16+2yyy6zJzzhCXbUUUdt85v9yy+/3N761rfaC17wAvvYxz5mtVrNPv/5z9sZZ5xhN998s5199tlmZnb22WfbwQcf7Lb/sz/7M5uYmLBnPOMZu+p07LrrrrMbbrjBnvrUp9qyZcty201MTNhxxx1nk5OTdtFFF9n+++9vt99+u33qU5+y733ve/af//mf0/dd7HljHxSACL///e9DT09PeOITnxjWrl0748/WrVsXnvjEJ4be3t5w991379bjmpiYCCGEcPXVVwczC/fee+9u7f/9739/MLOwbt266G22HPNcMTY2FjZs2BBCCOHGG28MZha+973vuXbNZjNUKpXw4he/eEb9nnvuCWYW3vrWt26znx/96EfBzMKHP/zhqOP65S9/GXcCW3nggQdCu90OIYRw+OGHhxNPPFG2+/CHPxzMLNxxxx0z6ueff34ws7Bx48YQwuzPGwBC2PzM6OvrC0984hPDI4884v78rrvuCn/7t3/b0T47ed9ccMEF4YADDuho/3nuvffe3HfFYx1wwAHhBS94wYza6tWrQ29vbzj00EN3yrHE+PnPfx7MLFx99dVR7bf8nePnP/95dB/VanX63TMX1Gq1sHr16hDC9sfnkEMOCc94xjNClmXTtdHR0dDX1xfOPPPMbfbzwAMPhCRJwutf//qo47rjjjt2aBwffvjh0Gg0QgghvOAFL8id69dee20ws/Cv//qvM+rve9/7gpmF2267bbo2m/PG3Db3P7rEbvGXf/mXNjU1ZVdddZUtXLhwxp8tWLDArrzySpucnLS/+Iu/MDOzm266yZIksR/84AduX1deeaUlSWJ33HHHdO3OO++0F7/4xTY8PGzd3d329Kc/3f7lX/5lxnZb/snUD37wA7vooots0aJFtt9+++Ue81e+8hV7wQteYMuWLbNyuWwrV660D37wg9Zut6fbvP/977dSqWTr1q1z27/hDW+woaEhq9VqcYMkbOuY77//frvooovssMMOs0qlYvPnz7eXvOQl7ue4t+zjxz/+sb31rW+1hQsX2tDQkF144YXWaDRsZGTEzj//fJs3b57NmzfP3vnOd1oIYcY+siyzv/3bv7XDDz/curu7bfHixXbhhRfapk2btnsO/f39Njw8vN12zWbTqtWqLV68eEZ90aJFlqapVSqVbW5/3XXXWZIk9rKXvWy7fZmZ/eEf/qGtWrXKPvGJT9jatWujtjEz23///aO+tRkbGzMzc+ezdOlSS9N0+luO2Z43AJiZ/cVf/IVNTEzY5z73OVu6dKn784MPPtje9ra3Tf//1j8Dvb135De+8Q078cQTrb+/3wYGBuwZz3iGXXfddds8ptm8O3bUkiVL7ElPepLde++907Vf/OIXdvrpp9vAwID19fXZySefbD/96U9nbKd+Bvq5z32uHXHEEfab3/zGTjrpJOvp6bHly5dP/11ly3Zbvvl89atfPf3Pibf1z5W3Z8uxXH/99fae97zHli9fbj09PTY2NmYbN260d7zjHXbkkUdaX1+fDQwM2Omnn26333673Mc///M/26WXXmrLly+3/v5+e/GLX2yjo6NWr9ft4osvtkWLFllfX5+9+tWvtnq97o7ln/7pn+xpT3uaVSoVGx4etnPPPdcefPDB7Z5DuVy2JUuWRJ3v2NiYLVq0yJIkma5tuVbbewd+8YtftBCCvfzlL4/q601vepMdeOCB9oEPfMAeeOCBqG3MzJYtW2alUmm77bb17jezGeczm/PGHLenV/CYG5YtWxZWrFixzTYrVqwI++23XwghhKmpqdDX1xcuuugi1+6kk04Khx9++PT/33HHHWFwcDCsWrUqfPzjHw+f+tSnwgknnBCSJAlf+tKXpttt+cR31apV4cQTTwyXX355+NjHPjbjzx77DfRZZ50VXvrSl4a//Mu/DJ/5zGfCS17ykmBm4R3veMd0m7vuuiuYWbj88stnHGO9Xg/z5s0Lr3nNa7Z5zlu+gf7tb38b1q1bN/3flm8nt3XMN954YzjqqKPC+973vnDVVVeFP/uzPwvz5s0LBxxwQJicnHTnffTRR4c/+IM/CJ/+9KfDK1/5ymBm4Z3vfGc4/vjjw8te9rJwxRVXhDPOOCOYWbjmmmtmHOfrXve6UCwWw+tf//rw2c9+NrzrXe8Kvb294RnPeMb0J7IxtvUNdAghHHvssaG3tzf80z/9U7j//vvD7bffHl784heH+fPnb/NfJzQajTB//vzw7Gc/O/pYbrrppnDKKaeENE1DqVQKZ599dvj6178eWq1W9D629Q30N77xjWBm4cwzzwy/+MUvwgMPPBCuv/76MDAwEC6++OIZbXf0vAFgi+XLl4eDDjoouv0BBxwQLrjggun/3947MkmScMQRR4QPf/jD4dOf/nR43eteF175yldOb6++gd7Rd8dsvoFuNBph8eLFYcmSJSGEzX9H6O3tDUuXLg0f/OAHw8c+9rFw4IEHhnK5HH76059Ob/e9733P9XniiSeGZcuWhf333z+87W1vC1dccUV43vOeF8wsfP3rXw8hhPDoo4+Gyy67LJhZeMMb3hC+8IUvhC984QvbfHZvGetvf/vbM979W/412pZjWbVqVTj66KPDX//1X4ePfvSjYXJyMvz85z8PK1euDO9+97vDlVdeGS677LKwfPnyMDg4GB5++GF3PkcffXQ47rjjwt/93d+Ft771rSFJknDuueeGl73sZeH000+f8XeCSy+9dMZxfuhDHwpJkoRzzjknXHHFFeHSSy8NCxYsCCtWrAibNm3a5rV5rO19A33OOeeEQqEQ/u7v/i7ce++94b//+7/DRRddFCqVSvjJT36yzX0/+clPDvvvv/+Mb3G35Tvf+U4466yzQqlUCmmahlNPPTXccMMNoV6vR5/Ptr6B/vWvfx3SNA3Petazwq233hoefPDB8LWvfS3st99+4ayzzprRdjbnjbmNBTS2a2RkJJhZeOELX7jNdmeeeWYwszA2NhZCCOG8884LixYtmrGgWb16dUjTNFx22WXTtZNPPjkceeSRoVarTdeyLAvPetazwiGHHDJd2/LCOv74490iSS2gp6am3DFeeOGFoaenZ0Zfxx13XDj22GNntPvSl74U9fLfsoDe+r8tD+ZtHbM6vltvvTWYWfjHf/xHd26nnXbajBfMcccdF5IkCW984xuna61WK+y3334zFoVb/mn0tddeO6Ovf/u3f5P1bdneAvquu+4KT33qU2eMxUEHHRTuvPPObe73q1/9ajCzcMUVV0Qfyxb3339/uPTSS8OBBx4YzCzst99+4T3veU+45557trvtthbQIYTwwQ9+MFQqlRnn8+d//ueu3Y6eNwCEsPmffca8Zx8rbwG99ftmZGQk9Pf3h2OPPTZUq9UZ+3jsO2XrBfRs3h2dLKBPPfXU6cXn7bffHs4999xgZuEtb3lLCGHzh+FdXV0zFrSPPPJI6O/vDyeccMJ0LW8BvfU7tV6vhyVLloQ/+qM/mq7t6D/hVv899lgOOugg966v1WrunyDfe++9oVwuz/i70ZZ9HHHEETM+rDjvvPNCkiTh9NNPn7GP4447bsb1u++++0KhUHA/FvWrX/0qFIvF6B+XCmH747NmzZpw8sknzxiHBQsWbHcReccdd0x/GdCptWvXhk984hPhiCOOCGYW5s+fHy6++OLwq1/9arvbbmsBHUII//AP/xCGhoZmnM8FF1wQms3mjHY7et6Y+/gn3Niu8fFxM9v8T3m3Zcufb/nnL+ecc46tXbt2xj+nuummmyzLMjvnnHPMzGzjxo323e9+11760pfa+Pi4rV+/3tavX28bNmyw0047ze666y6XyPz617/eCoXCdo/7sf98Zsu+n/Oc59jU1JTdeeed0392/vnn289+9jO7++67p2vXXnut7b///nbiiSdutx8zs5tvvtm+9a1vTf937bXXbveYH3t8zWbTNmzYYAcffLANDQ3Zbbfd5vp47WtfO+OfCR177LEWQrDXvva107VCoWBPf/rT7Z577pmu3XjjjTY4OGjPf/7zp8d3/fr19rSnPc36+vrse9/7XtQ5xujv77fDDz/c3vSmN9mXvvQlu+KKK6zVatlZZ51l69evz93uuuuus1KpZC996Us77vMJT3iCve9977O7777bvvOd79iJJ55on/jEJ2zlypV2yimn2A9/+MMdPp8VK1bYCSecYFdddZXdfPPN9prXvMY+8pGP2Kc+9akZ7Xb0vAHA7P+/N7f3no2x9fvmW9/6lo2Pj9u73/1u6+7untH2se+UrXXy7piYmJjRZss/8R4dHZ1RHx0ddf1885vftIULF9rChQvtqKOOshtvvNFe+cpX2sc//nFrt9v2zW9+08466yw76KCDprdZunSpvexlL7Mf//jH02OXp6+vz17xildM/39XV5cdc8wxM96TO+rTn/70jHf/t771rRl/fsEFF7h/ylsul6d/jKjdbtuGDRusr6/PDjvsMPnuP//882f80+Mt7/7XvOY1M9ode+yx9uCDD1qr1TKzzcGvWZbZS1/60hnXYMmSJXbIIYfs1Hd/T0+PHXbYYXbBBRfYjTfeaP/7f/9vW7p0qZ199tn2+9//Pne7LX9Xiv3n24+1cOFCe/vb326/+tWv7Gc/+5m95CUvsc9//vN25JFH2rHHHjurJPfly5fbMcccY3/7t39rX/7yl+3tb3+7XXvttS5hfUfPG3MfKdzYri0v9C0L6TxbL7T/4A/+wAYHB+2GG26wk08+2cw2/wqho48+2g499FAzM/v9739vIQR773vfa+9973vlfteuXTsjlXnrxMs8v/71r+0973mPffe733Uv2Me+xM855xy7+OKL7dprr7X3ve99Njo6av/6r/9q/+t//a9t/uXisU444QRbsGBB7p+rY65Wq/bRj37Urr76anv44Ydn/Nyy+kvGE57whBn/Pzg4aGabf6Z36/pjfz7trrvustHRUVu0aJE8tk5+fnhbWq2WnXLKKfbc5z7XLr/88un6KaecYocffrj95V/+pX384x93201MTNhXvvIVO+2002z+/Pkz/mzjxo3WaDSm/79SqUyf99aSJLHnPe959rznPc++853v2Pnnn2/f+c537IgjjrATTjih4/O5/vrr7Q1veIP97ne/m/45wrPPPtuyLLN3vetddt5559n8+fN3+LwBYIuBgQEz2/57NsbW75stHw53mg7dybvjzW9+s11zzTWuzVlnnTXj/0888USX5nzsscfahz70IUuSxHp6euxJT3qSDQ0NmZnZo48+alNTU3bYYYe5fT/pSU+yLMvswQcftMMPPzz3PPbbbz/3Lp83b5798pe/zN0m1jHHHGNPf/rTc/9cvfuzLLNPfvKTdsUVV9i99947I5dl63egWWfv/izLbHR01ObPn2933XWXhRDskEMOkccW8/PAsV7ykpdYsVi0r371q9O1F77whXbIIYfYn//5n9sNN9zgtgkh2HXXXWdHHHGEPfnJT57xZ6OjozN+ZVtXV9c2s1iOOeYYO+aYY+z1r3+9vfzlL7f/+I//sGuuuWaHfjPMLbfcYmeccYb99Kc/nb62Z511lg0MDNill15qr3nNa2zVqlU7fN7YN7CAxnYNDg7a0qVLt/uy+eUvf2nLly+f/otAuVy2s846y7785S/bFVdcYWvWrLFbbrnFPvKRj0xvk2WZmZm94x3vsNNOO03ud+tfeRATzDAyMmInnniiDQwM2GWXXWYrV6607u5uu+222+xd73rXdL9mm1+kZ5xxxvQC+qabbrJ6vT7jE+vZUsf8lre8xa6++mq7+OKL7bjjjrPBwUFLksTOPffcGce3Rd637qr+2MV4lmW2aNEi9634FluHwu2oH/7wh3bHHXfYX//1X8+oH3LIIfakJz0p9/c7/p//839sampKfgJ99tlnzwiiu+CCC3KDXdauXWv/9E//ZFdffbXdcccdtnjxYrvkkkvsj//4j3fofK644gp7ylOe4oLqzjzzTPv85z9vv/jFL6a/4d6R8waALQYGBmzZsmUzwjV31M4KL+rk3fHOd75zxjtzzZo19opXvML+6q/+yo466qjp+rx589x+FixY4H6t4c6U9+587HtyV1HX4iMf+Yi9973vtde85jX2wQ9+0IaHhy1NU7v44otn/e43+//nlWWZJUli3/jGN2TbrX/15o6655577N/+7d+mf73aFsPDw3b88cfnvgNvueUWu//+++2jH/2o+7O3ve1tMz6QUR+8bDE2NmbXX3+9XX311fbTn/7UBgcH7Y//+I93+N1/5ZVX2uLFi90HI2eeeaZ94AMfsJ/85Ce2atWqHT5v7BtYQCPKGWecYX//939vP/7xj+344493f/6jH/3I7rvvPrvwwgtn1M855xy75ppr7Dvf+Y7993//t4UQpv/5tplN/5OsUqm0U1+g3//+923Dhg32pS99aca3j49N9Xys888/3174whfaz3/+c7v22mvtKU95yjY/0d4ZbrrpJrvgggvsE5/4xHStVqvZyMjITu1n5cqV9u1vf9ue/exn79JUyDVr1piZzfg0fYtmszn9z8q2du2111pfX5+deeaZ7s8+8YlPzPg2fevf3dhqtezrX/+6XX311fa1r33Nsiyz0047zS677DI744wzZvUJ+5o1a+Rf9prN5nTfW9qZdX7eAPBYZ5xxhl111VV266232nHHHbfT9rty5UozM7vjjjvk7+Dd1nax745Vq1ZNfytnZtO/TeJpT3uaPfe5z+34mLdYuHCh9fT02G9/+1v3Z3feeaelaeq+id0Rsf/abGe46aab7KSTTrLPfe5zM+ojIyPb/JdsnVq5cqWFEOzAAw+c/ld/u8Js3v15v3lj6w9ktn4XhxDse9/7nl199dV28803W7VatRNOOMGuueYae8lLXjKrv+usWbMm91zMePdjM34GGlEuueQSq1QqduGFF9qGDRtm/NnGjRvtjW98o/X09Ngll1wy489OOeUUGx4ethtuuMFuuOEGO+aYY2b8k6ZFixbZc5/7XLvyyitt9erVrl/166VibPm09bGfMDcaDbviiitk+9NPP90WLFhgH//4x+0HP/jBTv32eVvHuPUn4Jdffrl8GM/GS1/6Umu32/bBD37Q/Vmr1dppC/YtL+jrr79+Rv22226z3/72t/aUpzzFbbNu3Tr79re/bS960Yusp6fH/fnTnvY0O+WUU6b/e+xf0D7wgQ/YfvvtZy984Qvt9ttvt/e97312//3329e+9jV70YteNOt/nnbooYfaL37xC/vd7343o/7FL37R0jSd/idnO3LeALC1d77zndbb22uve93rpv9y/lh33323ffKTn+x4v6eeeqr19/fbRz/6UfdrGbf1LezuendsS6FQsFNPPdW+8pWvzPgVj2vWrLHrrrvOjj/++Ol/9TYbvb29Zma77Zy2Hvcbb7zR5b3M1tlnn22FQsEuvfRS118Iwf1dbkcdfPDBlqap3XDDDTP6eeihh+xHP/qRfAc2m0278cYb7fjjj3f/RN1s8wcyj333P+1pT5v+s8985jN20EEH2cknn2zf/va37S1veYv97ne/sx/84Ad2/vnnz/qLgkMPPdTWrFnjvvH+4he/aGY2fT47ct7Yd/ANNKIccsghds0119jLX/5yO/LII+21r32tHXjggXbffffZ5z73OVu/fr198YtfnP6ke4tSqWRnn322XX/99TY5OWl/9Vd/5fb96U9/2o4//ng78sgj7fWvf70ddNBBtmbNGrv11lvtoYcecr8bMcaznvUsmzdvnl1wwQX21re+1ZIksS984Qu5f1kolUp27rnn2qc+9SkrFAp23nnnddxnp8444wz7whe+YIODg7Zq1Sq79dZb7dvf/rb8GajZOPHEE+3CCy+0j370o/Zf//Vfduqpp1qpVLK77rrLbrzxRvvkJz9pL37xi7e5jw996ENmtvnnys3MvvCFL9iPf/xjMzN7z3veY2abF7vPf/7z7ZprrrGxsTE79dRTbfXq1Xb55ZdbpVKxiy++2O33hhtusFartUMBItdff72ddNJJ9trXvtZOPvnk6G8Q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",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "End of video or cannot read frame.\n",
      "Done.\n"
     ]
    }
   ],
   "source": [
    "while True:\n",
    "    # Read next frame\n",
    "    ret, curr_frame = cap.read()\n",
    "    if not ret:\n",
    "        print(\"End of video or cannot read frame.\")\n",
    "        break\n",
    "\n",
    "    # Retrieve detection for this frame_idx\n",
    "    if frame_idx >= len(df):\n",
    "        print(f\"No CSV entry for frame {frame_idx}, skipping.\")\n",
    "        prev_frame = curr_frame\n",
    "        frame_idx += 1\n",
    "        continue\n",
    "    row = df.iloc[frame_idx]\n",
    "    if pd.isna(row[\"x\"]) or pd.isna(row[\"y\"]) or pd.isna(row[\"radius\"]):\n",
    "        # print(f\"Missing detection at frame {frame_idx}, skipping.\")\n",
    "        prev_frame = curr_frame\n",
    "        frame_idx += 1\n",
    "        continue\n",
    "\n",
    "    # Ball parameters\n",
    "    ball_center = np.array([int(row[\"x\"]), int(row[\"y\"])])\n",
    "    ball_radius = int(row[\"radius\"])\n",
    "\n",
    "    # Define 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, prev_frame.shape[1])\n",
    "    y_min = max(ball_center[1] - ball_radius - offset, 0)\n",
    "    y_max = min(ball_center[1] + ball_radius + offset, prev_frame.shape[0])\n",
    "\n",
    "    # Crop\n",
    "    roi1 = prev_frame[y_min:y_max, x_min:x_max]\n",
    "    roi2 = curr_frame[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",
    "    # Center in ROI\n",
    "    center_roi = np.array([ball_center[0] - x_min, ball_center[1] - y_min])\n",
    "\n",
    "    # Sample points inside circle\n",
    "    h, w = gray1.shape\n",
    "    pts = []\n",
    "    while len(pts) < 500:\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 <= (\n",
    "            ball_radius - 5\n",
    "        ) ** 2:\n",
    "            pts.append([x, y])\n",
    "    p0 = np.array(pts, dtype=np.float32).reshape(-1, 1, 2)\n",
    "\n",
    "    # Optical flow\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",
    "    )\n",
    "\n",
    "    # Lift to 3D\n",
    "    old3d, new3d = [], []\n",
    "    for o, n, s in zip(p0.reshape(-1, 2), p1.reshape(-1, 2), status.reshape(-1)):\n",
    "        if s == 1:\n",
    "            ox, oy = o - center_roi\n",
    "            nx, ny = n - 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, new3d = np.array(old3d), np.array(new3d)\n",
    "\n",
    "    if len(old3d) < 3:\n",
    "        print(f\"Insufficient points at frame {frame_idx}, skipping axis.\")\n",
    "        prev_frame = curr_frame\n",
    "        frame_idx += 1\n",
    "        continue\n",
    "\n",
    "    # Kabsch algorithm for rotation\n",
    "    H = old3d.T @ new3d\n",
    "    U, S, Vt = np.linalg.svd(H)\n",
    "    R = Vt.T @ U.T\n",
    "    if np.linalg.det(R) < 0:\n",
    "        Vt[-1, :] *= -1\n",
    "        R = Vt.T @ U.T\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)\n",
    "\n",
    "    # Visualization mask on ROI\n",
    "    mask = np.zeros_like(roi2)\n",
    "    # Project equator line\n",
    "    if axis[2] != 0:\n",
    "        equator_dir = axis[:2] / np.linalg.norm(axis[:2])\n",
    "        pA = (center_roi + equator_dir * ball_radius).astype(int)\n",
    "        pB = (center_roi - equator_dir * ball_radius).astype(int)\n",
    "        cv2.line(mask, tuple(pA), tuple(pB), (255, 255, 0), 2)\n",
    "\n",
    "        rotation_pt = (-axis * ball_radius)[:2] + center_roi\n",
    "        rot_pt_int = tuple(rotation_pt.astype(int))\n",
    "        # cv2.circle(mask, rot_pt_int, 4, (0,255,0), -1)\n",
    "\n",
    "    # Overlay on ROI2\n",
    "    overlay = cv2.addWeighted(roi2, 1, mask, 1, 0)\n",
    "    overlay_rgb = cv2.cvtColor(overlay, cv2.COLOR_BGR2RGB)\n",
    "\n",
    "    # Create blank circle image with point\n",
    "    circle_img = np.zeros_like(roi2)\n",
    "    # Draw circle outline\n",
    "    cv2.circle(circle_img, tuple(center_roi.astype(int)), ball_radius, (0, 255, 0), -1)\n",
    "    # Draw detected rotation point\n",
    "    cv2.circle(circle_img, rot_pt_int, 3, (0, 0, 255), -1)\n",
    "    circle_rgb = cv2.cvtColor(circle_img, cv2.COLOR_BGR2RGB)\n",
    "\n",
    "    # Display side by side\n",
    "    clear_output(wait=True)\n",
    "    fig, axs = plt.subplots(1, 2, figsize=(10, 5))\n",
    "    for ax, img, title in zip(\n",
    "        axs, [overlay_rgb, circle_rgb], [\"Overlay\", \"Circle+Point\"]\n",
    "    ):\n",
    "        ax.imshow(img)\n",
    "        ax.set_title(f\"{title} Frame {frame_idx}->{frame_idx + 1}\")\n",
    "        ax.axis(\"off\")\n",
    "    plt.tight_layout()\n",
    "    plt.show()\n",
    "    display(plt.gcf())\n",
    "    plt.close()\n",
    "    time.sleep(1 / fps)\n",
    "\n",
    "    prev_frame = curr_frame\n",
    "    frame_idx += 1\n",
    "\n",
    "cap.release()\n",
    "print(\"Done.\")"
   ]
  }
 ],
 "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
}
