s444380-wko/wko-07.ipynb

987 lines
7.5 MiB
Plaintext
Raw Normal View History

2023-01-22 20:08:13 +01:00
{
"cells": [
{
"cell_type": "markdown",
"id": "73e26798",
"metadata": {},
"source": [
"![Logo 1](img/aitech-logotyp-1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Widzenie komputerowe </h1>\n",
"<h2> 07. <i>Analiza wideo: przepływ optyczny, śledzenie obiektów</i> [laboratoria]</h2> \n",
"<h3>Andrzej Wójtowicz (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](img/aitech-logotyp-2.jpg)"
]
},
{
"cell_type": "markdown",
"id": "f124f5cd",
"metadata": {},
"source": [
"W poniższych materiałach zobaczymy w jaki sposób możemy przy pomocy przepływu optycznego dokonać stabilizacji obrazu oraz w jaki sposób śledzić obiekty znajdujące się na filmie.\n",
"\n",
"Na początku załadujmy niezbędne biblioteki."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "ed69629c",
"metadata": {},
"outputs": [],
"source": [
"import cv2 as cv\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"import IPython.display"
]
},
{
"cell_type": "markdown",
"id": "f9ef8d67",
"metadata": {},
"source": [
"# Przepływ optyczny\n",
"\n",
"Naszym celem będzie znalezienie na poniższym filmie punktów kluczowych, które pozwolą nam w jakiś sposób sprawdzić jak przemieszcza się rowerzystka:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1629fc29",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video src=\"vid/bike.mp4\" controls width=\"800\" >\n",
" Your browser does not support the <code>video</code> element.\n",
" </video>"
],
"text/plain": [
"<IPython.core.display.Video object>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"IPython.display.Video(\"vid/bike.mp4\", width=800)"
]
},
{
"cell_type": "markdown",
"id": "aa176c9a",
"metadata": {},
"source": [
"Załadujmy film:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "2463bd1d",
"metadata": {},
"outputs": [],
"source": [
"bike = cv.VideoCapture(\"vid/bike.mp4\")"
]
},
{
"cell_type": "markdown",
"id": "dde041a3",
"metadata": {},
"source": [
"Przy pomocy algorytmu Shi-Tomasi (rozwinięcie metody Harrisa) możemy znaleźć narożniki, które dobrze nadają się do śledzenia. W OpenCV algorytm jest zaimplementowany w funkcji [`cv.goodFeaturesToTrack()`](https://docs.opencv.org/4.5.3/dd/d1a/group__imgproc__feature.html#ga1d6bb77486c8f92d79c8793ad995d541):"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "36492aa6",
"metadata": {},
"outputs": [],
"source": [
"corners_num = 100\n",
"corners_colors = np.random.randint(0, 255, (corners_num, 3))\n",
"\n",
"_, frame_1 = bike.read()\n",
"frame_1_gray = cv.cvtColor(frame_1, cv.COLOR_BGR2GRAY)\n",
"keypoints_1 = cv.goodFeaturesToTrack(\n",
" frame_1_gray, mask=None, maxCorners=corners_num,\n",
" qualityLevel=0.3, minDistance=7, blockSize=7)\n",
"\n",
"mask = np.zeros_like(frame_1)\n",
"count = 0"
]
},
{
"cell_type": "markdown",
"id": "028dded7",
"metadata": {},
"source": [
"Aby sprawdzić w jaki sposób punkty przemieszczają się pomiędzy kolejnymi klatkami filmu, wykorzystamy algorytm LucasaKanade, który jest zaimplementowany w funkcji [`cv.calcOpticalFlowPyrLK()`](https://docs.opencv.org/4.5.3/dc/d6b/group__video__track.html#ga473e4b886d0bcc6b65831eb88ed93323):"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "14b62820",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAl8AAAFiCAYAAADIs73zAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9SYxlSZ7ei/3Mznhnv9dn9/CYIzIj58rMGnqonkh2872nJ5ErLgnutGhuesUGBBJcEdCKgMiFAAGCAAl41HsinySOgJrd/brZVZVVlXNmZMbs4bNf9zuf+ZiZFue6+/UpIjKzqroey79CZVw/x44dOzZ+9v3N/iaMMYYLXOACF7jABS5wgQv8QiD/uhNwgQtc4AIXuMAFLvCrhAvydYELXOACF7jABS7wC8QF+brABS5wgQtc4AIX+AXignxd4AIXuMAFLnCBC/wCcUG+LnCBC1zgAhe4wAV+gbggXxe4wAUucIELXOACv0BckK8LXOACF7jABS5wgV8gLsjXBS5wgQtc4AIXuMAvEBfk6wIXuMAFLnCBC1zgF4gL8nWBC1zgAhe4wAUu8AvELzX5+pf/8l9y9epVfN/nu9/9Lu+9995fd5IucIELXOACF7jABb4RfmnJ17/6V/+KP/qjP+Kf/JN/wvvvv8+bb77JH/zBH7C7u/vXnbQLXOACF7jABS5wga8N8ct6sPZ3v/tdvv3tb/Mv/sW/AEBrzcrKCv/wH/5D/tE/+kd/zam7wAUucIELXOACF/h6sP+6E3AW0jTlpz/9KX/8x398eE1Kyd/8m3+TH/zgB2c+kyQJSZIc/q21ptPpMD09jRDi557mC1zgAhe4wAUu8KsLYwzD4ZClpSWkfLZh8ZeSfO3t7aGUYn5+/tj1+fl5vvjiizOf+Wf/7J/xT//pP/1FJO8CF7jABS5wgQtc4Eysra1x6dKlZ4b5pSRfXwd//Md/zB/90R8d/t3v97l8+TL/048fU67Wz31OjP9//OILKmXGoL9CGiUcU+HOs/g+P4yEZxiLjTEgBGEcMRwGVMoVhJA40sayLIwx2FKi0ZhxBnwzcfB4LhpjMEZ9zbiKbzNGYIyh2+2Spglzc7PYjkWapjiWDUKcnQUC8iwnGIXU63WElIDGaF2UlxEYAQbDaNinUvHY3dnFsV2a07NYloNAgFRgFO2dLTZWHzHqd/D9ErfvvEqtNk2uNVESE8RDPv74A+an51hevoJj20jL5r0f/YgsSWi1Zvjud38Ny3KRwkLpnIcPH3H58gpBEGE7Fo7v4bk+aZrQ6XVptZq4jocZ56mYzFsBaE2WZ9iWfbyuoDBaoLRiOBgyNTWFZVln5nJRr8zhkycbgeCc/H0RvMhKhheocOZECsTpljrxSjMRbvxl5sUqdZETZ/YEXwlFEo6n2QCIk/lxdvs9/vbjPYs5fekoD19w5chhaYvz+56DlAgjKEnB5+/9gH/7P/3faVUlxCOCaIg2GqNz4jhGa40yBqM1xhiUAm0Mru/ilaZI7Tq//gf/O773O7+PcB0OO5znpXQcRI7z9MW+UB6rV193RY0w5uzyOafOHr5n/I+eDDaujC+8uHrc931VaP2skeiwRTzn2lnJMQijyIIBm/fv8+n7P8Cyc0plSRqHqEzjlcoEaU6uBFmQYkuFJMOYlDSNGPX7aJMzO9PkysoSaZoyHEXMzs2ytvaU4bCHynLCICSMEnKdIYSk3mhRLpVAZTiOS5ylOJ6LMaDyHMcrIx2XWnOeqzfewqtOMxpFWLZNo1ZFJxFffvYRW08f4tkarSPisE8ehsRhRK/fI5eSzPa4dOsV/tZ/83cYDUJWHz7kwYPPqVVKGAHlxhQzK8vUm9P0el32dvYpuyVaU1N4jkelVCbPUuq1OnEU8n/8P/zvqdVqz83bX0ryNTMzg2VZ7OzsHLu+s7PDwsLCmc94nofneaeul6t1KrXzyddJQvRVYL4h+fp6L4VzKOOY9Iz/DwjbpjcIsBwXx7ZxLAfXcUEbpJQYYTAShDyK6+sl75uTr6IDE8f+LxDUGg36/QFZnlJvThG296hWyzied7rDOUiCAWHZBGFEvVHDsSykKOIzBsIkJgxDtM5w7SrBaMSVy9eI44Rq3cOzbQwQhAG5SiiXXHae9iDP8B0PpXL6oxGlkkscjQiDHs0b16jXPIwR7O13aO9u06hN4fklDBa262FJG8dohLFQedHBN5vT+NUyuTJYqYcXx1i2g+242LaLZUkQkjGfBgl5lhF1ukhL0KjXAUEUhwhsXNdnOBwxMzdHpVJB62d1sPp4vk1m5TdoEy+KZ73DnDHgHtSKo3cdf+LUP4dt5dkwB7E/65sP3jVRx8yxCweBjqdan0kcTrRfc6oFnYrHmNMcSwjx7Pw+55bBHBGEc8JILfCk5Or1WzQaTSwT4HgeSRqS5gqtNVJIbMcmzTOUMQhRUAxLCkqlMrbvo6TL1NQ0jakWuRRH5OuZ3O8k+XrRovzmBJox8frKsYyfM4zJ7Ylq8ddLvr4JNMIojGWTTM9w7dp17j+6SzLMqVab2K5HY2qWd26/AsKiUfaJg30Gg23W1+7TaW8xN93C91xmZqfQKmd7+yH7nX6xTMgIoiglzzOMsChXGli2jWU5XFq+TKXk09nfxnEElmuz1++TCxun1MJx60xPL2BbFQYDyXytwc1bN7EsQ7+zy7DfIxj1SdOQQb9PxbdYWlpERRGPHzxECoGFxGiFCUc8+OgnpHHG0ycPKdsamSYMRwGD/W021x6irGIiL1NDySlRfeUVarNzmHRIMgq5v75KGA6BF+s/fynJl+u6vPPOO/zJn/wJf+fv/B2gqFx/8id/wh/+4R9+pbh+Bs3xufE/DxP6wqnOUsALMZ7jfeWJzvlEz5QrRRCGKKWI4oBy4mG0C7bBlta4gZujyY+R47HnePf/gkk7O71CHlcjjg0UR9cnSVdBFApiKMaJk0JQq1bZ3d2m3+ujlUIIgRwrX+aQlQBGFEOdMdRqVUbDAetrj3GkYbrZJMtyPN9nv7PH7s428/OztLdG9Pd2GdTrzC7MEwUdtvbaNFtThNGIfnef9SdPqFaqWLbD2pMnuH6F5mwLaXKSYEjJtrj76fv025vUqlU2t7aZa5a4fPUq5fIU/X6XMArJc02tUmPp0iL1Ro0p2cDzXMJohDIGz3VxpMHkKZ3+kEq5xlRz6lCpE0IQJwn9Xo+d7R2Wl5cAiKKQwaDHVLNIc7u9y8rK5WcSLwFkWY7SCtf1EPJnMDE4LNTnBRDF+PvMcGfP1s/iW8ceOTcx53/b0ZteKMKvhK+iID5f5ztNyIpR/me9Z2pcPhjmFua4dOkSj7/4Kb5IMGiyLEXlCozBtm2kbTEajbBtCyEBIZFSYkmJVjndbgelNUh7nNlF33PAsQ6IoJjsks767mMXxWneezrQC+FnX+pnx/dCKRPjkMe697NT9Kx0nveur04qBVoZ0jTHLzcYRDm9IOfWSy/z2mtvonJotuao1ut4jiQJuiTpPr1Rl26/j+eXKXkOxijW1tYZDXrEcUqW53S7fYIwIkoUjluhVK7RmpnHsz3Qhnq9Rdm3cWwHIWKkZxMgCY3Hb/7u/4ab11/HtUvovCBww1Gf0XCfJB6BSnCcnFa9xGAPhlnEMFdsbMSULKcgqxqMznF9j6DXYWdzlZdv3+Hy0nfIkoDtjXVqXhllYK/fI45i4ihCKYMoxTy69wW9/X1sLKJRQBhH5Dp5fp6O8UtJvgD+6I/+iL//9/8+7777Lt/5znf45//8nxMEAf/gH/yDrxSPHA/UPw8I8SxDSIFDumHOls4PqMcz33NmjGfENb4VBAH7nX2iOGQ46lMue0ThiLJfxbUdjAbLsgrOogVYCiMMlrRQWiMta4LPiTMI2LO7k2IQFxNWkSJcsQCx6FoPFLoDaG0Yjkb4vkepVMJoPR5+BLZtMTc/x9rTp4RhiO/7aK2wLPvQrGaEGH+/RJOjVYZfdvjiy4dkQZ/pqQZgMTs3RxAEtLdWcUWKJS2yeITJQ9affI7jWWysP+He3YBKuU6zNcP84iIWkpJfZndnF9cdcOXqEo4jeRCN8Gz
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"while True:\n",
" _, frame_2 = bike.read()\n",
" frame_2_gray = cv.cvtColor(frame_2, cv.COLOR_BGR2GRAY)\n",
" count += 1\n",
"\n",
" keypoints_2, status, _ = cv.calcOpticalFlowPyrLK(\n",
" frame_1_gray, frame_2_gray, keypoints_1, None, winSize=(15, 15),\n",
" maxLevel=2, criteria=(cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))\n",
"\n",
" keypoints_2_good = keypoints_2[status==1]\n",
" keypoints_1_good = keypoints_1[status==1]\n",
" \n",
" for i, (kp2, kp1) in enumerate(zip(keypoints_2_good, keypoints_1_good)):\n",
" a, b = kp2.ravel()\n",
" a, b = int(a), int(b)\n",
" c, d = kp1.ravel()\n",
" c, d = int(c), int(d)\n",
" cv.line(mask, (a, b), (c, d), corners_colors[i].tolist(), 8, cv.LINE_AA)\n",
" cv.circle(frame_2, (a ,b), 9, corners_colors[i].tolist(), -1)\n",
" \n",
" display_frame = cv.add(frame_2, mask)\n",
" if count % 5 == 0:\n",
" plt.figure(figsize=(7,7))\n",
" plt.imshow(display_frame[:,:,::-1])\n",
" if count > 40:\n",
" break\n",
"\n",
" frame_1_gray = frame_2_gray.copy()\n",
" keypoints_1 = keypoints_2_good.reshape(-1,1,2)\n",
" \n",
"bike.release()"
]
},
{
"cell_type": "markdown",
"id": "d8c01f59",
"metadata": {},
"source": [
"Możemy zauważyć, że część punktów kluczowych została wykryta poza głównym śledzonym obiektem, jednak mimo wszystko jesteśmy w stanie określić główny ruch przemieszczającego się obiektu."
]
},
{
"cell_type": "markdown",
"id": "879a813e",
"metadata": {},
"source": [
"## Stabilizacja obrazu\n",
"\n",
"Spróbujemy wykorzystać przepływ optyczny do stablizacji cyfrowej filmu nakręconego z ręki:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "d8686953",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video src=\"vid/protest.mp4\" controls width=\"800\" >\n",
" Your browser does not support the <code>video</code> element.\n",
" </video>"
],
"text/plain": [
"<IPython.core.display.Video object>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"IPython.display.Video(\"vid/protest.mp4\", width=800)"
]
},
{
"cell_type": "markdown",
"id": "c3541db4",
"metadata": {},
"source": [
"Załadujmy film oraz przygotujmy film wyjściowy, który będziemy wyświetlać obok oryginalnego, tak aby móc porównać otrzymane wyniki:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0b18aad1",
"metadata": {},
"outputs": [],
"source": [
"cap = cv.VideoCapture(\"vid/protest.mp4\")\n",
"n_frames = int(cap.get(cv.CAP_PROP_FRAME_COUNT))\n",
"width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH)) \n",
"height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))\n",
"fps = cap.get(cv.CAP_PROP_FPS)\n",
"\n",
"out = cv.VideoWriter('vid/gen-protest.avi', cv.VideoWriter_fourcc(*'MJPG'), fps, (width*2, height))"
]
},
{
"cell_type": "markdown",
"id": "27355bd0",
"metadata": {},
"source": [
"Pomiędzy poszczególnymi klatkami filmu znajdujemy punkty kluczowe i śledzimy w jaki sposób się one przemieściły. Na tej podstawie przy pomocy [`cv.estimateAffinePartial2D()`](https://docs.opencv.org/4.5.3/d9/d0c/group__calib3d.html#gad767faff73e9cbd8b9d92b955b50062d) możemy oszacować transformacje (translację oraz obrót), które nastapiły między następującymi po sobie klatkami:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "c00b1e9d",
"metadata": {},
"outputs": [],
"source": [
"_, prev = cap.read()\n",
"prev_gray = cv.cvtColor(prev, cv.COLOR_BGR2GRAY)\n",
"\n",
"transforms = np.zeros((n_frames-1, 3), np.float32)\n",
"\n",
"for i in range(n_frames-2):\n",
" prev_pts = cv.goodFeaturesToTrack(prev_gray, maxCorners=200,\n",
" qualityLevel=0.01, minDistance=30, blockSize=3)\n",
" \n",
" success, curr = cap.read() \n",
" if not success: \n",
" break\n",
" curr_gray = cv.cvtColor(curr, cv.COLOR_BGR2GRAY) \n",
" \n",
" curr_pts, status, _ = cv.calcOpticalFlowPyrLK(prev_gray, curr_gray, prev_pts, None)\n",
" \n",
" idx = np.where(status==1)[0]\n",
" prev_pts = prev_pts[idx]\n",
" curr_pts = curr_pts[idx]\n",
" \n",
" mat, _ = cv.estimateAffinePartial2D(prev_pts, curr_pts)\n",
" # traslation\n",
" dx = mat[0,2]\n",
" dy = mat[1,2]\n",
" # rotation angle\n",
" da = np.arctan2(mat[1,0], mat[0,0])\n",
" \n",
" transforms[i] = [dx,dy,da]\n",
" \n",
" prev_gray = curr_gray"
]
},
{
"cell_type": "markdown",
"id": "ba9fce7d",
"metadata": {},
"source": [
"Przygotujemy też kilka funkcji pomocniczych. Posiadając serię transformacji wygładzimy ich poszczególne komponenty przy pomocy średniej kroczącej."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "0fd89a26",
"metadata": {},
"outputs": [],
"source": [
"def moving_average(values, radius): \n",
" window_size = 2 * radius + 1 \n",
" mask = np.ones(window_size)/window_size \n",
"\n",
" values_padded = np.lib.pad(values, (radius, radius), 'edge') \n",
" values_smoothed = np.convolve(values_padded, mask, mode='same') \n",
" \n",
" return values_smoothed[radius:-radius] # remove padding\n",
"\n",
"def smooth(trajectory, radius=50): \n",
" smoothed_trajectory = np.copy(trajectory) \n",
" for i in range(smoothed_trajectory.shape[1]):\n",
" smoothed_trajectory[:,i] = moving_average(trajectory[:,i], radius)\n",
"\n",
" return smoothed_trajectory"
]
},
{
"cell_type": "markdown",
"id": "9f4d1df0",
"metadata": {},
"source": [
"Możemy teraz policzyć jakie mieliśmy transformacje względem początku filmu, wygładzić je poprzez średnią kroczącą, a następnie nanieść wynikowe różnice na poszczególne transformacje:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "efb52c4d",
"metadata": {},
"outputs": [],
"source": [
"trajectory = np.cumsum(transforms, axis=0)\n",
"smoothed_trajectory = smooth(trajectory) \n",
"\n",
"difference = smoothed_trajectory - trajectory\n",
"transforms_smooth = transforms + difference"
]
},
{
"cell_type": "markdown",
"id": "0ef3b313",
"metadata": {},
"source": [
"Ostatecznie na podstawie wygładzonych transformacji dostosowujemy poszczególne klatki filmu. Dodatkowo poprzez ustabilizowanie obrazu mogą pojawić się czarne obramowania na wynikowym obrazie, zatem poprzez niewielkie powiększenie obrazu zniwelujemy ten efekt:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "b8d4528b",
"metadata": {},
"outputs": [],
"source": [
"cap.set(cv.CAP_PROP_POS_FRAMES, 0) # back to first frame\n",
"\n",
"for i in range(n_frames-2):\n",
" success, frame = cap.read() \n",
" if not success:\n",
" break\n",
"\n",
" dx = transforms_smooth[i,0]\n",
" dy = transforms_smooth[i,1]\n",
" da = transforms_smooth[i,2]\n",
"\n",
" mat = np.zeros((2,3), np.float32)\n",
" mat[0,0] = np.cos(da)\n",
" mat[0,1] = -np.sin(da)\n",
" mat[1,0] = np.sin(da)\n",
" mat[1,1] = np.cos(da)\n",
" mat[0,2] = dx\n",
" mat[1,2] = dy\n",
"\n",
" frame_stabilized = cv.warpAffine(frame, mat, (width, height))\n",
" \n",
" mat = cv.getRotationMatrix2D((width/2, height/2), 0, 1.1)\n",
" frame_stabilized = cv.warpAffine(frame_stabilized, mat, (width, height))\n",
"\n",
" frame_out = cv.hconcat([frame, frame_stabilized]) # frame by frame\n",
" \n",
" out.write(frame_out)\n",
" \n",
"out.release()"
]
},
{
"cell_type": "markdown",
"id": "c204ec3a",
"metadata": {},
"source": [
"Na potrzeby wyświetlenie wynikowego filmu w przeglądarce, użyjemy kodeka H264:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "4b58bce1",
"metadata": {},
"outputs": [],
"source": [
"!ffmpeg -y -hide_banner -loglevel warning -nostats -i vid/gen-protest.avi -vcodec libx264 vid/gen-protest.mp4"
]
},
{
"cell_type": "markdown",
"id": "fce1d5cd",
"metadata": {},
"source": [
"Wynikowy film:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "041e29a5",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video src=\"vid/gen-protest.mp4\" controls width=\"800\" >\n",
" Your browser does not support the <code>video</code> element.\n",
" </video>"
],
"text/plain": [
"<IPython.core.display.Video object>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"IPython.display.Video(\"vid/gen-protest.mp4\", width=800)"
]
},
{
"cell_type": "markdown",
"id": "5fd935d2",
"metadata": {},
"source": [
"# Śledzenie obiektów"
]
},
{
"cell_type": "markdown",
"id": "dbeb1ae1",
"metadata": {},
"source": [
"Załóżmy, że chcemy na poniższym filmie śledzić przemieszczanie się piłkarek:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "7a31e78d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video src=\"vid/football.mp4\" controls width=\"800\" >\n",
" Your browser does not support the <code>video</code> element.\n",
" </video>"
],
"text/plain": [
"<IPython.core.display.Video object>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"IPython.display.Video(\"vid/football.mp4\", width=800)"
]
},
{
"cell_type": "markdown",
"id": "2fc45895",
"metadata": {},
"source": [
"Biblioteka OpenCV posiada [kilka algorytmów](https://docs.opencv.org/4.5.3/dc/d6b/group__tracking__legacy.html) pozwalających na śledzenie obiektów. Poniżej użyjemy algorytmu [*Multiple Instance Learning*](https://docs.opencv.org/4.5.3/d9/dbc/classcv_1_1legacy_1_1TrackerMIL.html):"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "a35e3ad7",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"video = cv.VideoCapture(\"vid/football.mp4\")\n",
"_, frame = video.read()\n",
"\n",
"bbox = (45, 350, 120, 270)\n",
"\n",
"tracker = cv.legacy.TrackerMIL_create()\n",
"tracker.init(frame, bbox)\n",
"\n",
"pt_1 = (int(bbox[0]), int(bbox[1]))\n",
"pt_2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))\n",
"cv.rectangle(frame, pt_1, pt_2, (0, 0, 255), 4, cv.LINE_8)\n",
"\n",
"plt.figure(figsize=(7,7))\n",
"plt.imshow(frame[:,:,::-1]);"
]
},
{
"cell_type": "markdown",
"id": "934dde10",
"metadata": {},
"source": [
"Możemy sprawdzić wyniki pomiędzy poszczególnymi klatkami, jednak tutaj na potrzeby prezentacji dodajmy odstęp co 10 klatek aby można było zauwazyć ruch. Dodatkowo możemy sprawdzić względną prędkość działania algorytmu:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "b7650ee1",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"count = 50\n",
"\n",
"while count > 0:\n",
"\n",
" ok, frame = video.read()\n",
" if not ok:\n",
" break\n",
"\n",
" timer = cv.getTickCount()\n",
" \n",
" ok, bbox = tracker.update(frame)\n",
" \n",
" fps = cv.getTickFrequency() / (cv.getTickCount() - timer);\n",
"\n",
" if ok:\n",
" pt_1 = (int(bbox[0]), int(bbox[1]))\n",
" pt_2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))\n",
" cv.rectangle(frame, pt_1, pt_2, (0,0,255), 4, cv.LINE_8)\n",
" else :\n",
" cv.putText(frame, \"Tracking failure\", (20, 180), \n",
" cv.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), cv.LINE_AA)\n",
"\n",
" cv.putText(frame, \"FPS : \" + str(int(fps)), (20,50), \n",
" cv.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), cv.LINE_AA)\n",
"\n",
" if count % 10 == 0:\n",
" plt.figure(figsize=(7,7))\n",
" plt.imshow(frame[:,:,::-1])\n",
" count -= 1\n",
"\n",
"video.release()"
]
},
{
"cell_type": "markdown",
"id": "bf17ff66",
"metadata": {},
"source": [
"Istnieje też możliwość jednoczesnego śledzenia kilku obiektów:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "d2e56fa9",
"metadata": {},
"outputs": [],
"source": [
"video = cv.VideoCapture(\"vid/football.mp4\")\n",
"_, frame = video.read()\n",
"\n",
"bboxes = [(45, 350, 120, 270), (755, 350, 120, 270)]\n",
"colors = [(0, 0, 255), (0, 255, 0)]\n",
"\n",
"multi_tracker = cv.legacy.MultiTracker_create()\n",
"\n",
"for bbox in bboxes:\n",
" multi_tracker.add(cv.legacy.TrackerMIL_create(), frame, bbox)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "9f989b8a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"count = 50\n",
"\n",
"while count > 0:\n",
"\n",
" ok, frame = video.read()\n",
" if not ok:\n",
" break\n",
"\n",
" timer = cv.getTickCount()\n",
" \n",
" _, boxes = multi_tracker.update(frame)\n",
" \n",
" for i, bbox in enumerate(boxes):\n",
" pt_1 = (int(bbox[0]), int(bbox[1]))\n",
" pt_2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))\n",
" cv.rectangle(frame, pt_1, pt_2, colors[i], 4, cv.LINE_8)\n",
"\n",
" if count % 10 == 0:\n",
" plt.figure(figsize=(7,7))\n",
" plt.imshow(frame[:,:,::-1])\n",
" count -= 1\n",
"\n",
"video.release()"
]
},
{
"cell_type": "markdown",
"id": "b1d84a3a",
"metadata": {},
"source": [
"# Zadanie 1\n",
"\n",
"Dla filmu `vid/football.mp4` porównaj jakość śledzenia dla dostępnych algorytmów. Wyniki zapisz na jednym filmie.\n",
"\n",
"![Porówanie algorytmów śledzenia obiektów](img/football-multi.png)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "e8fd4f64-2a74-4c7a-b199-d134552a520a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 700x700 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"video = cv.VideoCapture(\"vid/football.mp4\")\n",
"_, frame = video.read()\n",
"\n",
"trackers = []\n",
"bbox = (45, 350, 120, 270)\n",
"\n",
"tracker_mil = cv.legacy.TrackerMIL_create()\n",
"tracker_mil.init(frame, bbox)\n",
"trackers.append((tracker_mil, 'MIL'))\n",
"\n",
"tracker_b = cv.legacy.TrackerBoosting_create()\n",
"tracker_b.init(frame, bbox)\n",
"trackers.append((tracker_b, 'BOOSTING'))\n",
"\n",
"tracker_kcf = cv.legacy.TrackerKCF_create()\n",
"tracker_kcf.init(frame, bbox)\n",
"trackers.append((tracker_kcf, 'KCF'))\n",
"\n",
"tracker_tld = cv.legacy.TrackerTLD_create()\n",
"tracker_tld.init(frame, bbox)\n",
"trackers.append((tracker_tld, 'TLD'))\n",
"\n",
"tracker_mf = cv.legacy.TrackerMedianFlow_create()\n",
"tracker_mf.init(frame, bbox)\n",
"trackers.append((tracker_mf, 'MEDIANFLOW'))\n",
"\n",
"tracker_m = cv.legacy.TrackerMOSSE_create()\n",
"tracker_m.init(frame, bbox)\n",
"trackers.append((tracker_m, 'MOOSE'))\n",
"\n",
"tracker_csrt = cv.legacy.TrackerCSRT_create()\n",
"tracker_csrt.init(frame, bbox)\n",
"trackers.append((tracker_csrt, 'CSRT'))\n",
"\n",
"\n",
"\n",
"pt_1 = (int(bbox[0]), int(bbox[1]))\n",
"pt_2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))\n",
"cv.rectangle(frame, pt_1, pt_2, (0, 0, 255), 4, cv.LINE_8)\n",
"\n",
"plt.figure(figsize=(7,7))\n",
"plt.imshow(frame[:,:,::-1]);"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "758b493d-e0c2-4e1c-b62a-f2560a6ef745",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 2000x500 with 8 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"count = 50\n",
"rows, cols = 2, 4\n",
"ok, frame = video.read()\n",
"plt.figure(figsize=(20,5));\n",
"plt.subplot(rows, cols, 1);\n",
"plt.imshow(frame[:,:,::-1]);\n",
"plt.axis('off');\n",
"cnt = 2\n",
"for t in trackers:\n",
" video = cv.VideoCapture(\"vid/football.mp4\")\n",
" count = 50\n",
" while count > 0:\n",
" ok, frame = video.read()\n",
" if not ok:\n",
" break\n",
"\n",
" timer = cv.getTickCount()\n",
"\n",
" ok, bbox = t[0].update(frame)\n",
"\n",
" fps = cv.getTickFrequency() / (cv.getTickCount() - timer);\n",
"\n",
" if ok:\n",
" pt_1 = (int(bbox[0]), int(bbox[1]))\n",
" pt_2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))\n",
" cv.rectangle(frame, pt_1, pt_2, (0,0,255), 4, cv.LINE_8)\n",
" else :\n",
" cv.putText(frame, \"Tracking failure\", (20, 180), \n",
" cv.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), cv.LINE_AA)\n",
"\n",
" cv.putText(frame, f\"{t[1]} FPS : \" + str(int(fps)), (20,50), \n",
" cv.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), cv.LINE_AA)\n",
"\n",
" if count % 26 == 0:\n",
" plt.subplot(rows, cols, cnt);\n",
" plt.imshow(frame[:,:,::-1]);\n",
" plt.axis('off');\n",
" cnt += 1\n",
" count -= 1\n",
"video.release()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8fe51854-6984-4ccf-91b8-c268b907a7d4",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"author": "Andrzej Wójtowicz",
"email": "andre@amu.edu.pl",
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"lang": "pl",
"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.2"
},
"subtitle": "07. Analiza wideo [laboratoria]",
"title": "Widzenie komputerowe",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 5
}