{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Ensure compatibility with OpenCV\n", "A major aim of this crate is to provide a fully compatible yet lighweight alternative to OpenCV. With this Jupyter notebook, you are able to generate custom tests for specific images. The python environment requires OpenCV, numpy, and matplotlib installed by Pip or conda." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import cv2 as cv\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# The path to your image\n", "PATH = \"example_image.png\"\n", "\n", "image = cv.imread(PATH, cv.IMREAD_GRAYSCALE)\n", "_, image = cv.threshold(image, 127, 255, 0)\n", "contours, _ = cv.findContours(image, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)\n", "contours = sorted(contours, key=cv.contourArea, reverse=True)\n", "\n", "output = np.zeros((image.shape[0], image.shape[1], 3), dtype=np.uint8)\n", "cv.drawContours(output, contours, -1, (0, 255, 0), 3)\n", "plt.imshow(output);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Select one of the contours" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAR8AAAD7CAYAAABT9ZBtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAaRklEQVR4nO3de7hdZXXv8e9IQgIEMIlgmpskSoBGUKE5CGIVRUugEKBaheIhWjTteTyV9thTQzltH9vjc7TaCqWWliqKiAhSCjG2cmIE7bE1xyDXBBI2F0liSFBJkGtuo3+Md7lXFnvdL+9ca/0++3mf7Dn3XGuOzL332GO+853zNXdHRKTXxuUOQESGk5KPiGSh5CMiWSj5iEgWSj4ikoWSj4hk0ZXkY2aLzGy9mY2Y2bJu7ENE+pt1epyPmY0HNgDvADYBPwDOd/d1Hd2RiPS1CV14zxOAEXd/BMDMvgqcDVRNPmamkY4ifc7drZntu3HaNQvYWLa8Ka3bh5ktNbM1ZramCzGISMF1o/JpiLtfBVwFqnxEhlE3Kp/NwJyy5dlpnYjIL3Qj+fwAmG9m88xsInAesLwL+xGRPtbx0y53321m/x24DRgPXO3uazu9HxHpbx2/1N5SEOrzEel7RbjaJSJSl5KPiGSh5CMiWSj5iEgWSj4ikoWSj4hkoeQjIlko+YhIFko+IpKFko+IZKHkIyJZKPmISBZKPiKShZKPiGSh5CMiWSj5iEgWSj4ikoWSj4hkoeQjIlko+YhIFko+IpKFko+IZKHkIyJZKPmISBZKPiKShZKPiGTR8bnaZQBNAt4CHJqWnwfuAJ7q0f4PTfuflJa3At8FdvVo/9IVSj5S3yHAnwBvSMtbgHPoXfI5AriC0eR3B7AG2NGj/UtXKPkI7AecAsys8vWDgRlpO4hkdBbwamAV3UtChwJvA44FDirb/2zgfKICG8tG4DvAni7FJR1h7p47BswsfxDD7BDgRuDUGtuMByx97sQv9mbgbOCeLsV1AnAL8Aqid7Jy/9V8A/gt4LkuxSVjcnerv9UoVT7DaALwVmBOWt4/fd7oT4OlbQ8hTr+OAlbSfgX0cuAdwIFp+VXAZCLxjbX/auYCFwI70/JjqBIqIndvqRE/rrcD64C1wMVp/TTiR/Gh9O/UBt7L1XrYJuN8HWdXartx9uJNf+xNr30U55gOxHUczsYOxlV6n6/hTCrAcR/w1mwOaafy2Q18xN1/aGYHA3ea2UrgfcAqd/+EmS0DlgEfbWM/0q7xRN/J3LQ8CTic9uteS+99CPAu4BjgNpqvgKYBi4BfJvp2OhVXyauA3yZ+YgFGiEpob5v7kfa0WvmMUb3cShTN64EZad0MYL0qn8ztAJybiWqg1FqpKGpVGntwHsFZ0EJ8r8N5PL1HJ+OqrIRK7cs4+3XhOA9562Xl8wtmNhc4DlgNTHf3LelLTwDTq7xmKbC0E/uXCuOAtxNXowAmEn/9K/tOOsVSOwQ4j/jz8w1ge53XTQN+HTiauKLWrSGvlZXQkcDvMNoHtJ7oQPAu7V/G1oGK5yDgTuA30vL2iq8/pcqnx20izvVEJVFq3agoqlVAIzhHNxDnsTiP9TC+yjhL7Wqc8Q3Eq1az9bTyMbP9gH8CrnP3m9PqrWY2w923mNkMYFs7+5AGGFHpHJWWJxB/3TtVSTwHrCBGFkNcjTqLuAReGYcBU4D3EhXF13lpBTQtvf4oolqqF+eWtP8X0vIsomKaVPUVtZXiLFkAfIjRPqC1xEBGb/H9pTFtVDwGfAm4rGL9p4Bl6fNlwF+q8ulym4DzJbpX6WzFORHHUpuJs6bG9ntT24Bz5BjxLiCukJW2q/fxPZxDy/b/VpynOvj/q6yE/gFn3Bhxq9Vsvax8Tgb+K3Cfmd2d1v0x8AngRjO7CPgR8O429iG1GNHFfwxxpajVSudForLYWOXrzxDVh5ctfwX4ITHO57Ax4gKYCizhpbXvDKLiqTckbQuwnBjM8XzZ/jcCVwIHVHndPOAMRkdE11NZCR0LXEwMnvx2g+8hzevU1a42+42yZ+2+bONxvkDjFUS1j+04p7aw/1k4d9V43711Wr2P/8B5RQtxnYnzTBvHoxTf3xGVVu7vc5+0nvb5SI+VKp3XpuVxRNXT1KB2YuTvcuDRtPwCUaM26+fANcD3gXdSvQJq1FaiB/HZtPx42efNeBi4jLjKBzAfOJPmRnADvB74Q+JXC6LSUyXUObmrHlU+TbRxRH9EsxVE5cfPcU7vYFxzcO5pIY7KjzU4M7pw3M7Feb6FeCqP82VdiG2AmiqfQfVrwPHEX+NmK4pdRKXzUFreSVQHnfI0cDVxhe03eWkFVM9W4GvE1bFnOhhXyQbg04xWPguIq2X1xj1VHueFxCWU1cS4IGlP7qpHlU8DzYj+h1YrnWdxFvcgzsNx7mshvruI/qNeHc/zcV5sIc7S8f9UD2Pto6bKZ9CcRvzFPZ7GK57dRKXzQFreRfz177YdwFXE+J33MPrwr2q2ATcQFc/T3Q1tH2uJa7KlyudYok+o3tXC0vE/EbgU+HdUAbUjd9WjyqdGM5wraL7aeQHn3RnjnoezroE478GZXYDjvIS4+73ZKugTBYi9QE2Vz6BYRPyFPYH6Fc8e4rbee8uW13YvtLqeAj5L9AH9Fi+tgLYB1xHVWC8rnmruBv6c0crnV4g+oVqVkBEj3f4M+Dd0FawVuaseVT5V2mU0/ld4J84FBYi5sr0a58Ex4r0P55UFiK9a+yDN3fn/8QLEXICmyqffnQa8CTipideMI56nc1S9DXtsKmP3+0wHPkLvHgC/DriJ0ef51LOGqGhOIO5Bq1d5vpmonO5AFVAT9Aznovk08YspnXMzcAGjN6Y26neJ08fy5FMrEf0F8KdN7mOAuJ7h3KcWEXNT/WruQAbQa4jEUFn53EVURNWeaPh94BJGE87JxFWxar9ibyPuJ/sWMauH1KTkUxRvBf4odxAD6ijGPiX9MlEVVUs+d6dW8mGiIxrGTkAnp/YCSj4N0GlXbouIv5hvIfoYpHfWAt9kNPn8gKiEqv00Hs/o9+rXqV4BfY8YA3QbQ5WEdNrVb36VuHlReu81qZVcTVRC1abY+WFqe4lHdkD1CuiNxDCCIUo+zerWU3OlUf9CdDDfnjsQ4QTiUXi/Se2O5e8QfzC+QfUqyYiq9q+oPRnjEFPlk9v3UptO9PtA8zeOSmcck9pB1K6A7kxtAo1VQD9BFdAY1OdTFG8kRtaeQ/QrSD73s+8znL9L9AVVOp74vv0a1a+COfAfRLK6lYFOQurz6Vf/ntorgVPyhjKQKh+VWkupAioZx9hXxUp9QAcTyafaft9IDBrdxEAnn2Yp+RTNPwOP5A5iwLweeD+NP9O50puBK4h+ubEqIGmJkk/RlCog6ZxziBHOlZdXjMYqomNT2038cdjLvh3NntbZGPuo3N84NE1zoj4fGXxziStOlU8ufAMxu0ajM7neR/xhWEk8a7rk9cSVsjOAxVTv+1lNzIhxEzEKesCoz0ek0mPA58dY/wzxyI+SepVQqQJ6FriF0Qro7tQOY7Tjeawq60Qi4Y0QN6CW7gcfUqp8ZHi9mhjkWUoUbyIqoXqj3+4jRkP/K/v2Ab2OuGK5GDi7yms9vfY+4HoGqgNalY9Iox5m3wfp7yUqoQlEAqpXAf2U0QpoL3FKdQ+j0zmPY+wK6ATgvzB6Sb+yD2lIaISzSMn/Az5ITALeSDI4HfgccG7F+uXAB4h56ms5P71+SMd1KfmIlIwA1xIjzncSI5xrJaFjiNO04yvW30NMpnjvS14xqlQBXQgc3WK8fU7JR6TSd4jKpdEKSFqiPh+RSiOpHUicGk0gLsdX6wMaTwxg3IPG8DRBlY9INd8mTqu+VGe7s9I27+x6RANFyUekmoeBG4n7t2qdfi0AziOugEFUQhOpfV7hxIjpF6l+9/yAazv5mNl4M7vLzFak5XlmttrMRszsBjOb2H6YIn3kN4hHtFYb61NyLdHhvLLrERVSJyqfixmdmBfgk8Bn3P0IYvq4izqwD5F8dhPPZd5F7QpoAjAJeC3xQLIFdd73bmKQ4sN1thtQbSUfM5tNDKf6XFo2YtRCadznNcRtfSL9ayXwXur3/ZwLfAX1/TSo3atdlxFzLhycll8ObHf30iQlm4jxni9hZkuBpW3uX6T7HkltTp3tjmZox+y0ouXKx8zOBLa5+52tvN7dr3L3he6+sNUYRKR/tVP5nAwsNrMzgP2BQ4DLgSlmNiFVP7OBze2HKTIgnBg9vSu1IdZy5ePul7j7bHefS1xo/La7X0A87+1dabMlxJNrRaTkWuA9xF3xQ6wb43w+CvwPMxsh+oDGepKKyPB6kJgy6bHMcWTWkdsr3P0O4uEAuPsjaO5NEalD93aJ9IITo5lLTZR8RHrmWuAG4KHcgRSDko9Ir4wwUI9NbZduLBWRLFT5iHTbc8S9YS/kDqRYlHxEusmJO9y/DDyaOZaCUfIR6bbHgH/LHUTxqM9HRLJQ5SNSzwHAQam1YjIxm2nJM8Dz7QbV/zRjqUg97wQ+AswADqf6g+TH4sBG4Mdl664gnvszYDRjqUinHEA8q2E+Mcd6tU6KZ1Ibqzoy4JWpQSSjbwLTy7Z5mqGshNTnI1LN6cQzGX6X2tXO14gZLL5MY/N8XUTMZvp1YnbTM9sLs1+p8hGp5hXEnOr1/kRvAdYQT7j6MfFcz0OqbGvEExFLT0XcS1RWM9OyAzuIsUEDTpWPSKd8laiArm/iNUZUVuWV0GmdD62IVPmIlBwITC1bnlJn+58TVcrTaXlrauuJp5cfQvUKqKSyEtoDHEE8+fwpBroC0tUukZJzgD8hJv2DeBTeLKr393yBmEJhG/BE2frpqX2I5qdIcCJxPQn8BXBLk6/PSFe7RJo1GZhGVByvYzT5VPM0sB3YANw7xtdLFdAG4HHgZak1olQJzUzxzAF+Bjzb4Ov7iPp8RE4l+lt+n8Z+I24GziAqn1quTdvd2EJM41I8X0/xDSBVPjK8SiOP5wOvof5vww6iCtkArG3g/beltoGY9wuisplG/UrIiFO+6Sm+ucSp2ABVQOrzkeF1FvBxom9nBvVHLl8L/B/gp0RSadRhaR+kffxP4P0NvtaJS/k/BS4lKqGCUp+PSD0HEWN45gO/TGMVz0+ICuaBFvb3ZGolG4inGkIko0OpXgkZ0f9zGPWvnPUZJR8ZPm8BPkFUI/U6lyGqjf9NnHJ1wueJfiOI5PK/iLngh4ySjwyfg4EjgYkNbr+dqFY61TlQXglZev8hpKtdIpKFko8Mn6eJWUM301g1MxU4mn3vRJe2KfnI8PkOcDbwV8DuBrY/C/gGzY9WlprU5yPD59nUHgLWUf82itI9WkcS44F+QoxgbtcvEVe6pnXgvfqQKh8ZXrcDi4HPEDd01rOYqIA+0KH9/w6wAj3PR2TolCqgEeA+YixNIxXQlDb3+0uMjjM6vM336mOqfES+RfTrXEY83KvbPkBUUIt7sK8CU+Uj8lxqI8BdRFUyh+oV0HTgOKLf58dVthnLzPTaI4HZrQY7ONqqfMxsipndZGYPmtkDZnaSmU0zs5Vm9lD6d2r9dxIpgJVENXIFtSugc4m+mvc1+f7vS687t4XYBlC7p12XA99096OJJ6E8ACwDVrn7fGBVWhYpvueImzh31NnuIKKKafReq1nArxAVz0yam//LiWmW76Rzt3cURMunXWb2MuDNpPzv7juBnWZ2NnBK2uwa4A7go+0EKdLXLgR+j7ito1l7iL6oG6ifFPtMO5XPPOIOlS+Y2V1m9jkzmwxMd/ctaZsnqDIu1MyWmtkaM1vTRgwinbcNWE1UHLVGQM8k5vOaU2MbiEpnBs1XPA+nOEaI/qUXmnh9P3D3lhqwkBgf+oa0fDnx1NntFds91cB7uZpaYdr+OIfh/CHOHrzqx7M4W3H+uM77fbzGe1T72I1zcYpj/wIckwZaszmknatdm4BN7r46Ld9E9O9sNbMZ7r7FzGbQ3GOXRPJ7IbVn6mx3YGqTO7BPJ552WBo5vYeoeJ6s+oq+13LycfcnzGyjmR3l7uuJJ82uS20J8cSUJcScjyJSiwNXAl8sW1cv+fW5dsf5/B5wnZlNJPL2+4l+pBvN7CLgR8C729yHyHB4lnhc6pBoK/m4+91E30+lAX3evoh0ikY4i1Szmbj5dA5xH1a1Ec+HMzq4pNrXq3Hi7vqNaX9DRLNXiFQzETgA+CDwSaoPTCl1UFezf2pj2UuMgvtH4HlgZ0uRFoJmrxDplJ2pPV9nu1rJpRHPM3ADCBuhu9pFJAtVPiL1PA78X2LW0KOoP7lgIxxYDzyW3n8Iqc9HpJ79gEnAfyP6fjqVfD5KjO15EdjVgffMTH0+Ip22K7X1xEPAXk3MZtFKEnJi5oxH0vsN+EDCWlT5iDRqAnEF7GJijvdWk8+lxJ2QO2ls9ow+ocpHpFt2p/YAMYXyEcRc7438ynl63Uj697kuxdhHdLVLpFkrgPOArzT5uq+k163oeER9SZWPSLNKFdBa4JYmXreW+mOGhoj6fERaNZ64EtaoXTQ2P1ifUp+PSK/sYaCTSbepz0dEslDyEZEslHxEJAslHxHJQslHRLJQ8hGRLJR8RCQLJR8RyULJR0SyUPIRkSyUfEQkCyUfEclCyUdEslDyEZEslHxEJAslHxHJQslHRLJoK/mY2R+Y2Vozu9/Mrjez/c1snpmtNrMRM7vBzCZ2KlgRGRwtJx8zmwV8GFjo7scQT7Q9j5jT8TPufgTwFHBRJwIVkcHS7mnXBOAAM5sAHAhsAd4G3JS+fg1wTpv7EJEB1HLycffNwKeJae63ADuAO4Ht7l6ah3ETMGus15vZUjNbY2ZrWo1BRPpXO6ddU4GzgXnATGAysKjR17v7Ve6+0N0XthqDiPSvdk673g486u5Puvsu4GbgZGBKOg0DmA1sbjNGERlA7SSfx4ETzexAMzPgVGAdcDvwrrTNEuDW9kIUkUHU1oylZvYx4D3E5LF3AR8g+ni+CkxL697r7i/WeR/NWCrS55qdsVTTJYtIRzSbfDTCWUSyUPIRkSyUfEQkCyUfEclCyUdEslDyEZEslHxEJAslHxHJQslHRLJQ8hGRLJR8RCQLJR8RyULJR0SyUPIRkSyUfEQkCyUfEclCyUdEslDyEZEslHxEJAslHxHJQslHRLJQ8hGRLJR8RCQLJR8RyULJR0SyUPIRkSyUfEQkCyUfEclCyUdEslDyEZEslHxEJIu6ycfMrjazbWZ2f9m6aWa20sweSv9OTevNzP7GzEbM7F4zO76bwYtI/2qk8vkisKhi3TJglbvPB1alZYDTgfmpLQWu7EyYIjJo6iYfd/8u8LOK1WcD16TPrwHOKVv/JQ/fB6aY2YwOxSoiA6TVPp/p7r4lff4EMD19PgvYWLbdprTuJcxsqZmtMbM1LcYgIn1sQrtv4O5uZt7C664CrgJo5fUi0t9arXy2lk6n0r/b0vrNwJyy7WandSIi+2g1+SwHlqTPlwC3lq2/MF31OhHYUXZ6JiLyC+Ze+4zHzK4HTgEOBbYCfwbcAtwIvBL4EfBud/+ZmRnwt8TVseeA97t73T4dnXaJ9D93t2a2r5t8ekHJR6T/NZt8NMJZRLJQ8hGRLJR8RCQLJR8RyULJR0SyUPIRkSyUfEQkCyUfEclCyUdEslDyEZEslHxEJAslHxHJQslHRLJo+0mGHfIT4Nn0b1EdSnHjK3JsUOz4ihwbFDu+8tgOb/bFhXikBoCZrXH3hbnjqKbI8RU5Nih2fEWODYodX7ux6bRLRLJQ8hGRLIqUfK7KHUAdRY6vyLFBseMrcmxQ7Pjaiq0wfT4iMlyKVPmIyBBR8hGRLAqRfMxskZmtN7MRM1uWOZY5Zna7ma0zs7VmdnFaP83MVprZQ+nfqRljHG9md5nZirQ8z8xWp+N3g5lNzBjbFDO7ycweNLMHzOykgh27P0jf1/vN7Hoz2z/X8TOzq81sm5ndX7ZuzGOV5sL7mxTjvWZ2fKb4PpW+t/ea2T+b2ZSyr12S4ltvZqfVe//sycfMxgOfBU4HFgDnm9mCjCHtBj7i7guAE4EPpXiWAavcfT6wKi3ncjHwQNnyJ4HPuPsRwFPARVmiCpcD33T3o4HXEXEW4tiZ2Szgw8BCdz8GGA+cR77j90Vijrty1Y7V6cD81JYCV2aKbyVwjLu/FtgAXAKQfkfOA16TXvN36Xe7OnfP2oCTgNvKli8BLskdV1k8twLvANYDM9K6GcD6TPHMJn4o3wasAIwYZTphrOPZ49heBjxKupBRtr4ox24WsBGYRozuXwGclvP4AXOB++sdK+AfgPPH2q6X8VV87VzguvT5Pr+3wG3ASbXeO3vlw+gPRMmmtC47M5sLHAesBqb76NTPTwDTM4V1GfBHwN60/HJgu7vvTss5j9884EngC+m08HNmNpmCHDt33wx8Gngc2ALsAO6kOMcPqh+rIv6e/Dbwr+nzpuMrQvIpJDM7CPgn4Pfd/enyr3mk9p6PUTCzM4Ft7n5nr/fdoAnA8cCV7n4ccb/ePqdYuY4dQOo/OZtIkjOBybz0tKIwch6reszsUqKL4rpW36MIyWczMKdseXZal42Z7Ucknuvc/ea0equZzUhfnwFsyxDaycBiM3sM+Cpx6nU5MMXMSjcJ5zx+m4BN7r46Ld9EJKMiHDuAtwOPuvuT7r4LuJk4pkU5flD9WBXm98TM3gecCVyQEiS0EF8Rks8PgPnpisNEotNqea5gzMyAzwMPuPtfl31pObAkfb6E6AvqKXe/xN1nu/tc4jh9290vAG4H3pUzthTfE8BGMzsqrToVWEcBjl3yOHCimR2Yvs+l+Apx/JJqx2o5cGG66nUisKPs9KxnzGwRcdq/2N2fK/vScuA8M5tkZvOIjvH/X/PNetWxVqdT6wyi5/xh4NLMsbyJKHXvBe5O7Qyib2UV8BDwLWBa5jhPAVakz1+VvtEjwNeASRnjej2wJh2/W4CpRTp2wMeAB4H7gWuBSbmOH3A90fe0i6gaL6p2rIgLC59NvyP3EVfscsQ3QvTtlH43/r5s+0tTfOuB0+u9v26vEJEsinDaJSJDSMlHRLJQ8hGRLJR8RCQLJR8RyULJR0SyUPIRkSz+E6z4QuxZe4OCAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# The index of your contour\n", "CONTOUR_INDEX = 2\n", "\n", "contour = contours[CONTOUR_INDEX]\n", "output = np.zeros((image.shape[0], image.shape[1], 3), dtype=np.uint8)\n", "cv.drawContours(output, [contour], -1, (0, 255, 0), 3)\n", "plt.imshow(output);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generate appropiate code for tests" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "let points = [(53, 19), (52, 20), (49, 20), (48, 21), (47, 21), (46, 22), (45, 22), (44, 23), (43, 23), (42, 24), (41, 24), (39, 26), (38, 26), (34, 30), (76, 30), (77, 31), (79, 31), (80, 32), (81, 32), (83, 34), (84, 34), (86, 36), (86, 37), (87, 38), (87, 39), (88, 40), (88, 47), (86, 49), (86, 50), (83, 53), (82, 53), (81, 54), (81, 55), (82, 55), (84, 57), (84, 58), (85, 59), (85, 60), (86, 61), (86, 63), (87, 64), (87, 65), (88, 66), (93, 66), (94, 65), (94, 64), (95, 63), (95, 60), (96, 59), (99, 59), (99, 53), (98, 52), (97, 52), (96, 51), (95, 51), (94, 50), (93, 50), (90, 47), (90, 46), (91, 45), (91, 44), (92, 43), (92, 42), (93, 41), (93, 39), (94, 38), (94, 36), (91, 33), (91, 32), (85, 26), (84, 26), (82, 24), (81, 24), (80, 23), (79, 23), (78, 22), (77, 22), (76, 21), (75, 21), (74, 20), (71, 20), (70, 19), (69, 19), (67, 21), (66, 21), (62, 25), (60, 25), (54, 19)];\n", "[...]\n", "assert_abs_diff_eq!(moments.get::<0, 0>(), 703.0);\n", "assert_abs_diff_eq!(moments.get::<1, 0>(), 52175.166666666664);\n", "assert_abs_diff_eq!(moments.get::<0, 1>(), 25661.5);\n", "assert_abs_diff_eq!(moments.get::<2, 0>(), 4084450.6666666665);\n", "assert_abs_diff_eq!(moments.get::<1, 1>(), 2024477.75);\n", "assert_abs_diff_eq!(moments.get::<0, 2>(), 1071256.0);\n", "assert_abs_diff_eq!(moments.get::<3, 0>(), 332589780.65000004);\n", "assert_abs_diff_eq!(moments.get::<2, 1>(), 166738807.83333334);\n", "assert_abs_diff_eq!(moments.get::<1, 2>(), 89124447.63333333);\n", "assert_abs_diff_eq!(moments.get::<0, 3>(), 50269189.75);\n", "\n", "assert_abs_diff_eq!(central_moments.get::<2, 0>(), 212120.628694484);\n", "assert_abs_diff_eq!(central_moments.get::<1, 1>(), 119935.73091512569);\n", "assert_abs_diff_eq!(central_moments.get::<0, 2>(), 134538.24431009952);\n", "assert_abs_diff_eq!(central_moments.get::<3, 0>(), -2035756.4570507407);\n", "assert_abs_diff_eq!(central_moments.get::<2, 1>(), -158011.91380318906);\n", "assert_abs_diff_eq!(central_moments.get::<1, 2>(), 862112.1277520265);\n", "assert_abs_diff_eq!(central_moments.get::<0, 3>(), 1343240.7361632437);\n", "\n", "assert_abs_diff_eq!(normalized_central_moments.get::<2, 0>(), 0.4292123953519341);\n", "assert_abs_diff_eq!(normalized_central_moments.get::<1, 1>(), 0.24268220715350328);\n", "assert_abs_diff_eq!(normalized_central_moments.get::<0, 2>(), 0.27222945011138916);\n", "assert_abs_diff_eq!(normalized_central_moments.get::<3, 0>(), -0.15535939037876878);\n", "assert_abs_diff_eq!(normalized_central_moments.get::<2, 1>(), -0.012058728594976597);\n", "assert_abs_diff_eq!(normalized_central_moments.get::<1, 2>(), 0.06579235651780115);\n", "assert_abs_diff_eq!(normalized_central_moments.get::<0, 3>(), 0.10250983666512753);\n" ] } ], "source": [ "print(\"let points = [{}];\".format(\", \".join(f\"({point[0][0]}, {point[0][1]})\" for point in contour)))\n", "print(\"[...]\")\n", "for name, value in cv.moments(contour).items():\n", " if len(name) != 3:\n", " continue\n", " print(f\"assert_abs_diff_eq!(moments.get::<{name[1]}, {name[2]}>(), {value});\")\n", "\n", "print(\"\")\n", "\n", "for name, value in cv.moments(contour).items():\n", " if len(name) != 4 or not name.startswith(\"mu\"):\n", " continue\n", " print(f\"assert_abs_diff_eq!(central_moments.get::<{name[2]}, {name[3]}>(), {value});\")\n", "\n", "print(\"\")\n", "\n", "for name, value in cv.moments(contour).items():\n", " if len(name) != 4 or not name.startswith(\"nu\"):\n", " continue\n", " print(f\"assert_abs_diff_eq!(normalized_central_moments.get::<{name[2]}, {name[3]}>(), {value}, epsilon = 10e-7);\")" ] } ], "metadata": { "interpreter": { "hash": "131ed4ac40540f8f84b697a705d058ebf5434e6d375bf2aa4c213a30069b683b" }, "kernelspec": { "display_name": "Python 3.9.6 64-bit ('custom_env': 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.9.6" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }