07. Analiza wideo: przepływ optyczny, śledzenie obiektów [laboratoria]
\n","
Andrzej Wójtowicz (2021)
\n","
\n","\n","![Logo 2](img/aitech-logotyp-2.jpg)"]},{"cell_type":"code","source":["from google.colab import drive\n","drive.mount('/content/drive')\n","%cd /content/drive/My Drive/aitech-wko-pub"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"eymGeZLkXqCz","executionInfo":{"status":"ok","timestamp":1673869105773,"user_tz":-60,"elapsed":2196,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"43967bcc-373e-4ab2-e362-99eeba17d166"},"id":"eymGeZLkXqCz","execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n","/content/drive/My Drive/aitech-wko-pub\n"]}]},{"cell_type":"markdown","id":"f124f5cd","metadata":{"id":"f124f5cd"},"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":3,"id":"ed69629c","metadata":{"id":"ed69629c","executionInfo":{"status":"ok","timestamp":1673869106063,"user_tz":-60,"elapsed":293,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}}},"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":{"id":"f9ef8d67"},"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":4,"id":"1629fc29","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":421},"id":"1629fc29","executionInfo":{"status":"ok","timestamp":1673869106375,"user_tz":-60,"elapsed":315,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"d2cfed1b-dd06-4042-a05d-e2c32c4e864b"},"outputs":[{"output_type":"execute_result","data":{"text/plain":[""],"text/html":[""]},"metadata":{},"execution_count":4}],"source":["IPython.display.Video(\"vid/bike.mp4\", width=800)"]},{"cell_type":"markdown","id":"aa176c9a","metadata":{"id":"aa176c9a"},"source":["Załadujmy film:"]},{"cell_type":"code","execution_count":5,"id":"2463bd1d","metadata":{"id":"2463bd1d","executionInfo":{"status":"ok","timestamp":1673869106819,"user_tz":-60,"elapsed":448,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}}},"outputs":[],"source":["bike = cv.VideoCapture(\"vid/bike.mp4\")"]},{"cell_type":"markdown","id":"dde041a3","metadata":{"id":"dde041a3"},"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":6,"id":"36492aa6","metadata":{"id":"36492aa6","executionInfo":{"status":"ok","timestamp":1673869107194,"user_tz":-60,"elapsed":378,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}}},"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":{"id":"028dded7"},"source":["Aby sprawdzić w jaki sposób punkty przemieszczają się pomiędzy kolejnymi klatkami filmu, wykorzystamy algorytm Lucasa–Kanade, 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":7,"id":"14b62820","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"14b62820","executionInfo":{"status":"ok","timestamp":1673869112763,"user_tz":-60,"elapsed":5572,"user":{"displayName":"Cezary Gałązkiewicz","userId":"01409497901784152256"}},"outputId":"78971a33-ab4e-42e1-c8e0-7bd89bab3f71"},"outputs":[{"output_type":"display_data","data":{"text/plain":["