{"id":117,"date":"2022-07-27T08:59:58","date_gmt":"2022-07-27T08:59:58","guid":{"rendered":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/?post_type=chapter&#038;p=117"},"modified":"2022-12-16T07:53:42","modified_gmt":"2022-12-16T07:53:42","slug":"elementy-uczenia-maszynowego","status":"web-only","type":"chapter","link":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/chapter\/elementy-uczenia-maszynowego\/","title":{"raw":"Identyfikacja obiekt\u00f3w","rendered":"Identyfikacja obiekt\u00f3w"},"content":{"raw":"<p style=\"text-align: justify\"><a href=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji.avi\"><\/a>Wa\u017cnym elementem analizy obrazu jest wychwycenie pewnych <strong>charakterystycznych cech<\/strong>. Nie tylko kolory lub kszta\u0142ty mog\u0105 by\u0107 u\u017cyteczne w tym zadaniu. Okazuje si\u0119, \u017ce ca\u0142kiem dobrze spisuj\u0105 si\u0119 charakterystyczne punkty obrazu zwi\u0105zane z kraw\u0119dziami czy rogami. Znalezione punkty charakterystyczne nazywamy <strong>punktami kluczowymi<\/strong> (keypoint). Ka\u017cdy punkt kluczowy mo\u017cemy opisa\u0107 za pomoc\u0105 <strong>deskryptora<\/strong>.<\/p>\r\n<p style=\"text-align: justify\">Ka\u017cdy z nas intuicyjnie czuje co mo\u017cemy nazwa\u0107 rogiem, jednak istnieje kilka definicji oraz metod wyznaczania dobrych punkt\u00f3w kluczowych w tym rog\u00f3w obrazu. W zadaniu wykrycia rog\u00f3w mo\u017cemy wykorzysta\u0107 <strong>metod\u0119 Harrisa<\/strong> lub <strong>Shi i Tomasiego<\/strong>. Natomiast w praktyce zadanie wykrycia dobrych punkt\u00f3w kluczowych, mo\u017cemy zrealizowa\u0107 z wykorzystaniem funkcji goodFeaturesToTrack. W wyniku dzia\u0142ania funkcji otrzymujemy list\u0119 punkt\u00f3w kluczowych spe\u0142niaj\u0105cych pewne kryteria.<\/p>\r\n<p style=\"text-align: justify\">Na listingu 1 zaprezentowano przyk\u0142ad programu wykorzystuj\u0105cy funkcj\u0119 goodFeaturesToTrack do znalezienia punkt\u00f3w kluczowych. Opr\u00f3cz obrazu wej\u015bciowego na kt\u00f3rym chcemy wyszuka\u0107 punkt\u00f3w charakterystycznych, nale\u017cy poda\u0107 liczb\u0119 szukanych punkt\u00f3w, oraz jako\u015b\u0107 punkt\u00f3w qualityLevel w zakresie 0-1 oraz minimalny dystans pomi\u0119dzy kolejnymi punktami. Na rysunku 1 zaprezentowano przyk\u0142ad wykrycia rog\u00f3w dla prostej grafiki natomiast na rysunku 2 zaprezentowano wynik detekcji rog\u00f3w dla zdj\u0119cia.<\/p>\r\n&nbsp;\r\n\r\nListing 1. Przyk\u0142ad znalezienia rog\u00f3w z wykorzystaniem funkcji goodFeaturesToTrack.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport numpy as np\r\nimport cv2 as cv\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv.imread('box_a.jpg')\r\ngray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)\r\n\r\ncorners = cv.goodFeaturesToTrack(gray,55,0.01,10)\r\ncorners = np.int0(corners)\r\n\r\nfor i in corners:\r\n   x,y = i.ravel()\r\n   cv.circle(img,(x,y),3,255,-1)\r\n\r\nplt.imshow(img),plt.show()\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_343\" align=\"aligncenter\" width=\"1024\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features-1024x565.png\" alt=\"\" class=\"wp-image-343 size-large\" width=\"1024\" height=\"565\" \/> Rysunek 1. Przyk\u0142ad znalezienia rog\u00f3w dla grafiki.[\/caption]\r\n\r\n&nbsp;\r\n\r\n[caption id=\"attachment_344\" align=\"aligncenter\" width=\"620\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/lewandowski_rogi.png\" alt=\"\" class=\"wp-image-344 size-full\" width=\"620\" height=\"413\" \/> Rysunek 2. Przyk\u0142ad znalezienia rog\u00f3w dla zdj\u0119cia.[\/caption]\r\n<p style=\"text-align: justify\">Nie tylko same punkty charakterystyczne mog\u0105 by\u0107 u\u017cyteczne. Jedn\u0105 z koncepcji jest poszukiwanie pewnych obszar\u00f3w obrazu podobnych do plamy (<strong>blob<\/strong>). Biblioteka OpenCV wspiera wykrywanie plam z wykorzystaniem funkcji SimpleBlobDetector. Przyk\u0142ad programu do detekcji plam zaprezentowano na listingu 2. Wynik dzia\u0142ania programu zaprezentowano na rysunku 3.<\/p>\r\nListing 2. Przyk\u0142ad programu wykrywaj\u0105cego plamy na obrazie\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nimage = cv2.imread('lewandowski.jpg', 0)\r\n\r\nparams = cv2.SimpleBlobDetector_Params()\r\n\r\nparams.filterByArea = True\r\nparams.minArea = 20\r\n\r\ndetector = cv2.SimpleBlobDetector_create(params)\r\nkeypoints = detector.detect(image)\r\n\r\nblank = np.zeros((1, 1))\r\nblobs = cv2.drawKeypoints(image, keypoints, blank, (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)\r\n\r\ncv2.imshow(&amp;amp;quot;Blobs&amp;amp;quot;, blobs)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncv2.imwrite('wynik_plamy.jpg',blobs)\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_348\" align=\"aligncenter\" width=\"620\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_plamy.jpg\" alt=\"\" class=\"wp-image-348 size-full\" width=\"620\" height=\"413\" \/> Rysunek 3. Wynik programu wykrywaj\u0105cego plamy o zadanych parametrach.[\/caption]\r\n\r\n&nbsp;\r\n<p style=\"text-align: justify\">Istnieje mo\u017cliwo\u015b\u0107 wykrycia plam o zadanych parametrach. Na przyk\u0142ad mo\u017cemy zdefiniowa\u0107 wielko\u015b\u0107 plamy, podobie\u0144stwo do ko\u0142a. W zale\u017cno\u015bci od ustawie\u0144, mo\u017cliwe jest wykrycie interesuj\u0105cych plam na obrazie. Przyk\u0142ad listingu wykrywaj\u0105cego wszystkie plamy zaprezentowano na listingu 3. Program wykrywaj\u0105cy plamy zbli\u017cone kszta\u0142tem do okr\u0119gu zaprezentowano na listingu 4. Wyniki programu wykrywaj\u0105cego wszystkie plamy oraz plamy o kszta\u0142cie ko\u0142a zaprezentowano na rysunkach 4 oraz 5. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119 oraz przeanalizowa\u0107 w dokumentacji na mo\u017cliwe opcje wykrywania plam.<\/p>\r\n&nbsp;\r\n\r\nListing 3. Przyk\u0142ad programu wykrywaj\u0105cego wszystkie plamy\r\n\r\n[code lang=\"python\"]\r\nimport cv2\r\nimport numpy as np\r\n\r\nimage = cv2.imread('plamy.jpg', 0)\r\nimg=cv2.imread('plamy.jpg',1)\r\n\r\nparams = cv2.SimpleBlobDetector_Params()\r\n\r\n#params.filterByArea = True\r\nparams.minArea = 10\r\n\r\ndetector = cv2.SimpleBlobDetector_create(params)\r\nkeypoints = detector.detect(image)\r\n\r\nblank = np.zeros((1, 1))\r\nblobs = cv2.drawKeypoints(img, keypoints, blank, (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)\r\n\r\ncv2.imshow('plamy', blobs)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncv2.imwrite('plamy_wykryte.jpg',blobs)\r\n[\/code]\r\n\r\n&nbsp;\r\n\r\nListing 3. Przyk\u0142ad programu wykrywaj\u0105cego plamy w kszta\u0142cie ko\u0142a\r\n\r\n[code lang=\"python\"]\r\nimport cv2\r\nimport numpy as np\r\n\r\nimage = cv2.imread('plamy.jpg', 0)\r\nimg=cv2.imread('plamy.jpg',1)\r\n\r\nparams = cv2.SimpleBlobDetector_Params()\r\n\r\nparams.filterByArea = True\r\nparams.minArea = 10\r\n\r\nparams.filterByCircularity = True\r\nparams.minCircularity = 0.88\r\n\r\n\r\nparams.filterByConvexity = True\r\nparams.minConvexity = 0.2\r\n\r\nparams.filterByInertia = True\r\nparams.minInertiaRatio = 0.01\r\n\r\ndetector = cv2.SimpleBlobDetector_create(params)\r\nkeypoints = detector.detect(image)\r\n\r\nblank = np.zeros((1, 1))\r\nblobs = cv2.drawKeypoints(img, keypoints, blank, (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)\r\n\r\ncv2.imshow('Plamy', blobs)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncv2.imwrite('plamy_wykryte_kola.jpg',blobs)\r\n[\/code]\r\n\r\n&nbsp;\r\n\r\n[caption id=\"attachment_351\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte.jpg\" alt=\"\" class=\"wp-image-351 size-full\" width=\"640\" height=\"427\" \/> Rysunek 4. Wynik programu wykrywaj\u0105cego plamy o zadanych parametrach.[\/caption]\r\n\r\n&nbsp;\r\n\r\n[caption id=\"attachment_352\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte_kola.jpg\" alt=\"\" class=\"wp-image-352 size-full\" width=\"640\" height=\"427\" \/> Rysunek 5. Wynik programu wykrywaj\u0105cego plamy o zadanych parametrach w kszta\u0142cie okr\u0119gu.[\/caption]\r\n<p style=\"text-align: justify\">Opracowano wiele technik wykrywania punkt\u00f3w kluczowych i wyznaczania deskryptor\u00f3w. Do najpopularniejszych nale\u017c\u0105 metoda <strong>FAST<\/strong> (<strong>Features from Accelerated Segments Test<\/strong>). Metoda bazuje na koncepcji por\u00f3wnywania punkt\u00f3w wok\u00f3\u0142 danego punktu. Je\u015bli otaczaj\u0105ce piksele s\u0105 podobne, to zapewne nie jest to dobry punkt charakterystyczny i nie b\u0119dzie dobrym kandydatem na cech\u0119 obrazu.\u00a0 Algorytm FAST jest rozwini\u0119ciem algorytmu <strong>SUSAN<\/strong>, jednak por\u00f3wnuje tylko punkty le\u017c\u0105ce na pier\u015bcieniu otaczaj\u0105cym punkt. Druga r\u00f3\u017cnica polega na tym, \u017ce punkty s\u0105 klasyfikowane jako ja\u015bniejsze i ciemniejsze ni\u017c rozwa\u017cany punkt a nast\u0119pnie zliczane. Bardziej zaawansowan\u0105 metod\u0105 detekcji cech jest <strong>SIFT<\/strong> (<strong>Scale Invariant Transform<\/strong>). Metoda SIFT wymaga wi\u0119kszej mocy obliczeniowej w por\u00f3wnaniu do innych metod. Nazwa metody pochodzi on wykrywania pewnych cech zwi\u0105zanych z niezmienno\u015bci\u0105 wzgl\u0119dem skali. Na pocz\u0105tku obliczany jest zbi\u00f3r splot\u00f3w pomi\u0119dzy obrazem wej\u015bciowym a gausowskimi j\u0105drami o wi\u0119kszym rozmiarze. Nast\u0119pnie obliczana jest kombinacja splot\u00f3w z bezpo\u015brednim nast\u0119pc\u0105. W praktyce, je\u015bli chcemy znale\u017a\u0107 punkty charakterystyczne na obrazie wideo zale\u017cy nam na szybkim dzia\u0142aniu. W zadaniu tym sprawdzi\u0107 si\u0119 mo\u017ce detektor cech <strong>ORB<\/strong>. W pierwszym etapie wykrywane s\u0105 punkty charakterystyczne z wykorzystaniem algorytmu FAST a nast\u0119pnie wyznaczane deskryptory z wykorzystaniem <strong>rog\u00f3w Harrisa<\/strong>. Przyk\u0142ad wykorzystania algorytmu ORB do znalezienia punkt\u00f3w charakterystycznych zaprezentowano na listingu 4. W tym celu obraz wej\u015bciowy poddano modyfikacjom polegaj\u0105cym na obrocie, przeskalowaniu. Do wyznaczenia punkt\u00f3w kluczowych oraz cech s\u0142u\u017cy funkcja detectAndCompute() a do por\u00f3wnania punkt\u00f3w kluczowych match(). Program \u0142\u0105czy liniami 10 najlepszych dopasowa\u0144. Wynik dzia\u0142ania programu zaprezentowano na rysunku 6. Na rysunku 7 oraz 8 zaprezentowano por\u00f3wnanie obraz\u00f3w twarzy dla tej samej i innej osoby. Jak wida\u0107, wyznaczone cechy nie zawsze s\u0105 dobrymi deskryptorami.<\/p>\r\nListing 4. Przyk\u0142ad programu por\u00f3wnuj\u0105cego punkty kluczowe w obrazach\r\n\r\n[code lang=\"python\"]\r\nimport numpy as np\r\nimport cv2\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg1 = cv2.imread('greece.jpg',0) # queryImage\r\nimg2 = cv2.imread('greece1.jpg',0) # trainImage\r\n\r\norb = cv2.ORB_create()\r\n\r\nkp1, des1 = orb.detectAndCompute(img1,None)\r\nkp2, des2 = orb.detectAndCompute(img2,None)\r\n\r\nbf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)\r\n\r\nmatches = bf.match(des1,des2)\r\n\r\nmatches = sorted(matches, key = lambda x:x.distance)\r\n\r\nimg3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10] ,None, flags=2)\r\n\r\nplt.imshow(img3),plt.show()\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_369\" align=\"alignnone\" width=\"1162\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_.png\" alt=\"\" class=\"wp-image-369 size-full\" width=\"1162\" height=\"426\" \/> Rysunek 6. Wynik programu por\u00f3wnuj\u0105cego punkty charakterystyczne.[\/caption]\r\n\r\n&nbsp;\r\n\r\n[caption id=\"attachment_371\" align=\"alignnone\" width=\"1280\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_.jpg\" alt=\"\" class=\"wp-image-371 size-full\" width=\"1280\" height=\"480\" \/> Rysunek 7. Por\u00f3wnanie punkt\u00f3w dla obrazu twarzy tej samej osoby [FEI Face Database].[\/caption][caption id=\"attachment_373\" align=\"alignnone\" width=\"1280\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_.jpg\" alt=\"\" class=\"wp-image-373 size-full\" width=\"1280\" height=\"480\" \/> Rysunek 8. Por\u00f3wnanie punkt\u00f3w dla obrazu r\u00f3\u017cnych os\u00f3b [FEI Face Database].[\/caption]&nbsp;\r\n<p style=\"text-align: justify\">Wa\u017cnym elementem analizy obraz\u00f3w jest <strong>detekcja obiekt\u00f3w<\/strong>. Celem detekcji jest wykrycie na obrazie danego obiektu oraz wskazanie miejsca wykrytego obiektu. Nale\u017cy zaznaczy\u0107, \u017ce detekcja obiekt\u00f3w na obrazie jest dynamicznie rozwijaj\u0105c\u0105 si\u0119 dziedzin\u0105. W chwili obecnej rozwijane s\u0105 z bardzo dobrym skutkiem techniki wykorzystuj\u0105ce uczenie g\u0142\u0119bokie (deep learning) a w szczeg\u00f3lno\u015bci konwolucyjne sieci nieuronowe (convolutional neural network -CNN). W bibliotece OpenCV popularn\u0105 metod\u0105 detekcji jest wykorzystanie <strong>klasyfikator\u00f3w kaskadowych<\/strong> oraz<strong> cech Haara<\/strong>. Od metod detekcji wymaga si\u0119 szybkiego dzia\u0142ania oraz dobrej trafno\u015bci. Umo\u017cliwia to wykrycie obiektu na obrazie wideo oraz poprawn\u0105 klasyfikacj\u0119 obiekt\u00f3w. W\u0142a\u015bciwo\u015bci takie posiada w\u0142a\u015bnie klasyfikator kaskadowy z cechami Haara.<\/p>\r\n<p style=\"text-align: justify\">Cechy Haara to nic innego jak pewne proste wzorce. Przyk\u0142ad takich wzorc\u00f3w zaprezentowano na rysunku 9. Cechy Haar\u2019a mo\u017cemy interpretowa\u0107 jako pewn\u0105 informacj\u0119 o zmianie warto\u015bci kontrastu pomi\u0119dzy prostok\u0105tnymi grupami pikseli. S\u0105siednie grupy o podobnej jasno\u015bci tworz\u0105 cech\u0119 Haar\u2019a. Warto\u015b\u0107 cechy dla danego szablonu to r\u00f3\u017cnica sumy pikseli w miejscu bia\u0142ego prostok\u0105tna i sumy pikseli w miejscu czarnego prostok\u0105ta. W wyniku takiego dopasowania szablonu do fragmentu obrazu dostajemy jedn\u0105 warto\u015b\u0107 skalarn\u0105. Cechy s\u0105 skalowane i przesuwane w ka\u017cdym poszukiwanym fragmencie obrazu. Uwzgl\u0119dniaj\u0105c wszystkie typy cech Haar\u2019a oraz ich po\u0142o\u017cenia i skale, dla pewnego fragmentu obrazu obliczanych jest oko\u0142o kilkaset tysi\u0119cy cech. Jest to zbyt wiele cech i nie ka\u017cda z nich jest u\u017cyteczna. Dlatego stosujemy<strong> technik\u0119 Adaboost<\/strong>. Polega ona na tym, \u017ce stosujemy wiele s\u0142abych klasyfikator\u00f3w u\u0142o\u017conych w kaskadzie. W ko\u0144cowym wyniku otrzymujemy bardzo dobry klasyfikator, kt\u00f3ry umo\u017cliwia skuteczn\u0105 detekcj\u0119 obiektu.<\/p>\r\n&nbsp;\r\n\r\n[caption id=\"attachment_383\" align=\"aligncenter\" width=\"205\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/cechy_haara-205x300.png\" alt=\"\" class=\"wp-image-383 size-medium\" width=\"205\" height=\"300\" \/> Rysunek 9. Cechy Haara.[\/caption]\r\n<p style=\"text-align: justify\">Wa\u017cnym elementem wp\u0142ywaj\u0105cym na skuteczno\u015b\u0107 wykrywania obiekt\u00f3w jest trenowanie klasyfikatora. W praktyce, nale\u017cy przygotowa\u0107 r\u00f3\u017cnorodny zestaw obraz\u00f3w przyk\u0142adowych zawieraj\u0105cych obiekty, kt\u00f3re chcemy wykry\u0107 oraz zestaw obraz\u00f3w, kt\u00f3re nie zawieraj\u0105 obiekt\u00f3w. Im liczniejsza liczba przyk\u0142ad\u00f3w do trenowania tym lepiej, jednak szacuje si\u0119, \u017ce dla niekt\u00f3rych zastosowa\u0144 wystarcz\u0105 setki a w niekt\u00f3rych tysi\u0105ce przyk\u0142ad\u00f3w trenuj\u0105cych. Trenowanie klasyfikatora do do\u015b\u0107 d\u0142ugi proces. W wyniku wytrenowania powstaje regu\u0142a decyzyjna (klasyfikator) kt\u00f3ry zostaje zapisany w postaci pliku .xml. W internecie mo\u017cna znale\u017a\u0107 wytrenowane klasyfikatory wykrywaj\u0105ce obiekty takie jak: twarz, oczy, usta, samochody itp. Nale\u017cy jednak zwr\u00f3ci\u0107 szczeg\u00f3ln\u0105 uwag\u0119 i sprawdzi\u0107 w praktyce dzia\u0142anie detektora. Chodzi tu o liczb\u0119 fa\u0142szywych detekcji oraz liczb\u0119 poprawnych detekcji.<\/p>\r\n<p style=\"text-align: justify\">Na listingu 5 zaprezentowano przyk\u0142ad programu wykrywaj\u0105cego twarz oraz oczy u\u017cytkownika. Klasyfikator za\u0142adowany jest w postaci pliku xml, s\u0142u\u017cy do tego funkcja CascadeClassifier(). Nast\u0119pnie funkcja detectMultiScale(), wykrywa na obrazie twarz oraz zwraca wsp\u00f3\u0142rz\u0119dne wykrytego obiektu. Funkcja wymaga podania obrazu w odcieniach szaro\u015bci, na kt\u00f3rym chcemy wykry\u0107 obiekt. Nast\u0119pnie nale\u017cy zadeklarowa\u0107 parametr scaleFactor. Ustalenie tego parametru na warto\u015b\u0107 scaleFactor = 1.07 oznacza zmniejszenie rozmiaru wej\u015bciowego o 7%, co zwi\u0119ksza szans\u0119 na wykrycie twarzy przez model. Im wi\u0119ksza warto\u015b\u0107 tym jako\u015b\u0107 wykrytych obiekt\u00f3w jest wy\u017csza. Kolejny parametr to minNeighbors. Patametr ten deklaruje minimaln\u0105 liczb\u0119 s\u0105siaduj\u0105cych obszar\u00f3w, kt\u00f3re zaklasyfikowano obiekt. Parametr wp\u0142ywa na jako\u015b\u0107 wykrytych twarzy. Wy\u017csza warto\u015b\u0107 powoduje mniej wykrywalno\u015bci, ale o wy\u017cszej jako\u015bci. Mo\u017cemy te\u017c zadeklarowa\u0107 parametr\u00a0 minSize. Jest to minimalny rozmiar obszaru zawieraj\u0105cy wykryty obiekt. Od zadeklarowanych parametr\u00f3w detekcji zale\u017cy jako\u015b\u0107 dzia\u0142ania detektora. Na rysunku 10 zaprezentowano przyk\u0142ad dzia\u0142ania detektora dla twarzy na wprost kamery, za\u015b na rysunku 11 twarzy obr\u00f3conej.<\/p>\r\nListing 5. Przyk\u0142ad programu wykorzystuj\u0105cego cechy Haara i klasyfikator kaskadowy.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport numpy as np\r\nimport cv2\r\n\r\nface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')\r\neye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')\r\n\r\nimg = cv2.imread('2-05.jpg')\r\ngray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r\n\r\nfaces = face_cascade.detectMultiScale(gray, 1.2, 10)\r\nfor (x,y,w,h) in faces:\r\n   cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)\r\n   roi_gray = gray[y:y+h, x:x+w]\r\n   roi_color = img[y:y+h, x:x+w]\r\n\r\n   eyes = eye_cascade.detectMultiScale(roi_gray)\r\n      for (ex,ey,ew,eh) in eyes:\r\n          cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)\r\n\r\ncv2.imshow('img',img)\r\ncv2.imwrite('wynikdetekcji_.jpg', img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n[\/code]\r\n\r\n[caption id=\"attachment_390\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji_.jpg\" alt=\"\" class=\"wp-image-390 size-full\" width=\"640\" height=\"480\" \/> Rysunek 10. Przyk\u0142ad detekcji twarzy i oczu.[\/caption]\r\n\r\n&nbsp;\r\n\r\n[caption id=\"attachment_393\" align=\"aligncenter\" width=\"640\"]<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji2_.jpg\" alt=\"\" class=\"wp-image-393 size-full\" width=\"640\" height=\"480\" \/> Rysunek 11. Przyk\u0142ad detekcji twarzy i oczu dla twarzy obr\u00f3conej.[\/caption]\r\n<p style=\"text-align: justify\">Wytrenowane klasyfikatory kaskadowe Haara mo\u017cemy wytrenowa\u0107 samemu oraz mo\u017cemy wykorzysta\u0107 jeden z og\u00f3lnodost\u0119pnych klasyfikator\u00f3w. Na listingu 6 zaprezentowano przyk\u0142ad programu wykrywaj\u0105cego znak STOP na obrazie. W tym przypadku skorzystano z wytrenowanego klasyfikatora. Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119, \u017ce dobrane parametry detekcji w funkcji detectMultiScale() mog\u0105 by\u0107 dobre dla jednego zdj\u0119cia, natomiast niepoprawnie dobrane mog\u0105 skutkowa\u0107 niepoprawnym dzia\u0142aniem detekcji. Na rysunku 12 zaprezentowano wynik detekcji znaku STOP.<\/p>\r\n&nbsp;\r\n\r\nListing 6. Program do wykrywania znak\u00f3w stop na obrazie.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport numpy as np\r\nimport cv2\r\n\r\nstopsign_cascade = cv2.CascadeClassifier('stop_sign_classifier_2.xml')\r\n\r\nimg = cv2.imread('stop.jpg')\r\ngray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r\n\r\nfaces = stopsign_cascade.detectMultiScale(gray, 1.5, 5)\r\nfor (x,y,w,h) in faces:\r\n   cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),15)\r\n   roi_gray = gray[y:y+h, x:x+w]\r\n   roi_color = img[y:y+h, x:x+w]\r\n\r\nscale_percent = 30 # percent of original size\r\nwidth = int(img.shape[1] * scale_percent \/ 100)\r\nheight = int(img.shape[0] * scale_percent \/ 100)\r\ndim = (width, height)\r\n\r\nimg = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)\r\ncv2.imshow('img',img)\r\n\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n[\/code]\r\n\r\n<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji.jpg\" alt=\"\" class=\"alignnone wp-image-396 size-full\" width=\"907\" height=\"680\" \/>\r\n\r\nRysunek 12. Przyk\u0142ad detekcji znaku STOP.\r\n\r\n&nbsp;\r\n\r\n<strong>Zadanie 1.<\/strong>\r\n\r\nNapisz program, wykrywaj\u0105cy twarz na obrazie zarejestrowanym bezpo\u015brednio z kamery. Sprawd\u017a, czy detekcja op\u00f3\u017ania akwizycj\u0119 i czy program pozwala na p\u0142ynne dzia\u0142anie. Pochyl g\u0142ow\u0119, w prz\u00f3d ty\u0142 na boki, przys\u0142o\u0144 twarz r\u0119k\u0105. Sprawd\u017a jak wp\u0142ywa to na detekcj\u0119 twarzy.\r\n\r\n<strong>Odpowied\u017a 1.<\/strong>\r\n\r\nProgram do wykrywania twarzy oraz oczu na obrazie wideo zaprezentowano na listingu 7. Klasyfikatory kaskadowe, umo\u017cliwiaj\u0105 szybk\u0105 detekcj\u0119 i nie wp\u0142ywaj\u0105 na p\u0142ynno\u015b\u0107 dzia\u0142ania programu w przypadku dobrania w\u0142a\u015bciwych parametr\u00f3w detekcji.\r\n\r\n&nbsp;\r\n\r\nListing 7. Program do wykrywania twarzy na obrazie z kamery.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport numpy as np\r\nimport cv2\r\n\r\nface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')\r\neye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')\r\n\r\nvid = cv2.VideoCapture(0, cv2.CAP_DSHOW)\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n   img = frame\r\n\r\n   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r\n\r\n   faces = face_cascade.detectMultiScale(gray, 1.2, 6)\r\n   if len(faces) !=0:\r\n      for (x,y,w,h) in faces:\r\n         cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)\r\n         roi_gray = gray[y:y+h, x:x+w]\r\n         roi_color = img[y:y+h, x:x+w]\r\n\r\ncv2.imshow('img',img)\r\nif cv2.waitKey(1) &amp;amp;amp; 0xFF == ord('q'):\r\nbreak\r\n\r\nvid.release()\r\ncv2.destroyAllWindows()\r\n\r\n[\/code]\r\n\r\n<strong>Zadanie 2.<\/strong>\r\n<p style=\"text-align: justify\">Napisz program, wykrywaj\u0105cy punkty charakterystyczne na obrazie zarejestrowanym bezpo\u015brednio z kamery. Sprawd\u017a, czy detekcja punkt\u00f3w op\u00f3\u017ania akwizycj\u0119 i czy program pozwala na p\u0142ynne dzia\u0142anie.\u00a0 Poruszaj kamer\u0105. sprawd\u017a czy punkty si\u0119 zmieniaj\u0105.<\/p>\r\n<strong>Odpowied\u017a 2.<\/strong>\r\n<p style=\"text-align: justify\">Program do wykrywania punkt\u00f3w charakterystycznych zaprezentowano na listingu 8. Funkcja goodFeaturesToTrack, umo\u017cliwiaj\u0105 szybk\u0105 detekcj\u0119 i nie wp\u0142ywaj\u0105 na p\u0142ynno\u015b\u0107 dzia\u0142ania programu.<\/p>\r\n\r\n<pre><\/pre>\r\nListing 8. Program do wykrywania punkt\u00f3w charakterystycznych na obrazie z kamery.\r\n\r\n[code lang=\"python\"]\r\nimport numpy as np\r\nimport cv2\r\n\r\nvid = cv2.VideoCapture(0, cv2.CAP_DSHOW)\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n   img = frame\r\n\r\n   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r\n   corners = cv2.goodFeaturesToTrack(gray,55,0.01,10)\r\n   corners = np.int0(corners)\r\n\r\n   for i in corners:\r\n      x,y = i.ravel()\r\n      cv2.circle(img,(x,y),3,255,-1)\r\n\r\n\r\ncv2.imshow('img',img)\r\nif cv2.waitKey(1) &amp;amp;amp; 0xFF == ord('q'):\r\n   break\r\n\r\nvid.release()\r\ncv2.destroyAllWindows()\r\n\r\n[\/code]\r\n\r\n<strong>Zadanie 3.<\/strong>\r\n<p style=\"text-align: justify\">Napisz program, wykrywaj\u0105cy punkty charakterystyczne na obrazie wideo zarejestrowanym w trakcie przejazdu pojazd\u00f3w. Zapisz plik wynikowy jako plik wideo. Zwr\u00f3\u0107 uwag\u0119 na pojawiaj\u0105ce si\u0119 punkty charakterystyczne.<\/p>\r\n<strong>Odpowied\u017a 3.<\/strong>\r\n<p style=\"text-align: justify\">Program do wykrywania punkt\u00f3w charakterystycznych w obrazie wideo zaprezentowano na listingu 9.\u00a0 Do wczytania obrazu s\u0142u\u017cy funkcja VideoCapture(). Do zapisania obrazu wideo wykorzystujemy funkcj\u0119 VideoWriter(). Wynik dzia\u0142ania programu mo\u017cna zobaczy\u0107 na Filmie 1.<\/p>\r\n\r\n<pre><\/pre>\r\nListing 9. Program do wykrywania punkt\u00f3w charakterystycznych na obrazie z kamery.\r\n\r\n[code lang=\"python\"]\r\nimport cv2\r\nimport numpy as np\r\n\r\ncap = cv2.VideoCapture('samochody.avi')\r\n\r\nframe_width = int(cap.get(3))\r\nframe_height = int(cap.get(4))\r\nsize = (frame_width, frame_height)\r\nfourcc = cv2.VideoWriter_fourcc(*'XVID')\r\nresult = cv2.VideoWriter('wynik_detekcji.avi',fourcc,25.0,size)\r\n\r\nwhile(1):\r\n\r\n   ret, frame = cap.read()\r\n\r\n      if ret == True:\r\n\r\n         gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\r\n         corners = cv2.goodFeaturesToTrack(gray,55,0.01,10)\r\n         corners = np.int0(corners)\r\n\r\n        for i in corners:\r\n           x,y = i.ravel()\r\n        cv2.circle(frame,(x,y),3,255,-1)\r\n\r\n        cv2.imshow('res',frame)\r\n        result.write(frame)\r\n\r\n        k = cv2.waitKey(5) &amp;amp;amp; 0xFF\r\n           if k == 27:\r\n              break\r\n           else:\r\n              break\r\n\r\ncv2.destroyAllWindows()\r\ncap.release();\r\nresult.release();\r\n\r\n\r\n[\/code]\r\n\r\nFilm 1. Przyk\u0142ad detekcji punkt\u00f3w charakterystycznych dla ruchu drogowego.\r\n\r\n[h5p id=\"1\"]\r\n\r\n&nbsp;\r\n\r\n<strong>Zadanie 4.<\/strong>\r\n<p style=\"text-align: justify\">Napisz program, wykrywaj\u0105cy punkty charakterystyczne na obrazie wideo twarzy. Zapisz plik wynikowy jako plik wideo. Zwr\u00f3\u0107 uwag\u0119 na pojawiaj\u0105ce si\u0119 punkty charakterystyczne.<\/p>\r\n<strong>Odpowied\u017a 4.<\/strong>\r\n<p style=\"text-align: justify\">Program do wykrywania punkt\u00f3w charakterystycznych w obrazie wideo zaprezentowano na listingu 9.\u00a0 Wynik dzia\u0142ania programu mo\u017cna zaobserwowa\u0107 na Filmie 2.<\/p>\r\n\r\n<pre><\/pre>\r\nFilm 2. Przyk\u0142ad detekcji punkt\u00f3w charakterystycznych dla twarzy.\r\n\r\n[h5p id=\"2\"]\r\n\r\n&nbsp;\r\n\r\n<strong>Zadanie 5.<\/strong>\r\n\r\nNapisz program, wykrywaj\u0105cy twarz wideo twarzy. Zapisz plik wynikowy jako plik wideo.\r\n\r\n<strong>Odpowied\u017a 5.<\/strong>\r\n\r\nProgram do przetwarzania obrazu wideo zaprezentowano na listingu 9.\u00a0 Do detekcji twarzy nale\u017cy zastosowa\u0107 klasyfikator kaskadowy Haara. Wynik dzia\u0142ania programu mo\u017cna zaobserwowa\u0107 na Filmie 3.\r\n<pre><\/pre>\r\nFilm 3. Przyk\u0142ad detekcji twarzy.\r\n\r\n[h5p id=\"3\"]","rendered":"<p style=\"text-align: justify\"><a href=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji.avi\"><\/a>Wa\u017cnym elementem analizy obrazu jest wychwycenie pewnych <strong>charakterystycznych cech<\/strong>. Nie tylko kolory lub kszta\u0142ty mog\u0105 by\u0107 u\u017cyteczne w tym zadaniu. Okazuje si\u0119, \u017ce ca\u0142kiem dobrze spisuj\u0105 si\u0119 charakterystyczne punkty obrazu zwi\u0105zane z kraw\u0119dziami czy rogami. Znalezione punkty charakterystyczne nazywamy <strong>punktami kluczowymi<\/strong> (keypoint). Ka\u017cdy punkt kluczowy mo\u017cemy opisa\u0107 za pomoc\u0105 <strong>deskryptora<\/strong>.<\/p>\n<p style=\"text-align: justify\">Ka\u017cdy z nas intuicyjnie czuje co mo\u017cemy nazwa\u0107 rogiem, jednak istnieje kilka definicji oraz metod wyznaczania dobrych punkt\u00f3w kluczowych w tym rog\u00f3w obrazu. W zadaniu wykrycia rog\u00f3w mo\u017cemy wykorzysta\u0107 <strong>metod\u0119 Harrisa<\/strong> lub <strong>Shi i Tomasiego<\/strong>. Natomiast w praktyce zadanie wykrycia dobrych punkt\u00f3w kluczowych, mo\u017cemy zrealizowa\u0107 z wykorzystaniem funkcji goodFeaturesToTrack. W wyniku dzia\u0142ania funkcji otrzymujemy list\u0119 punkt\u00f3w kluczowych spe\u0142niaj\u0105cych pewne kryteria.<\/p>\n<p style=\"text-align: justify\">Na listingu 1 zaprezentowano przyk\u0142ad programu wykorzystuj\u0105cy funkcj\u0119 goodFeaturesToTrack do znalezienia punkt\u00f3w kluczowych. Opr\u00f3cz obrazu wej\u015bciowego na kt\u00f3rym chcemy wyszuka\u0107 punkt\u00f3w charakterystycznych, nale\u017cy poda\u0107 liczb\u0119 szukanych punkt\u00f3w, oraz jako\u015b\u0107 punkt\u00f3w qualityLevel w zakresie 0-1 oraz minimalny dystans pomi\u0119dzy kolejnymi punktami. Na rysunku 1 zaprezentowano przyk\u0142ad wykrycia rog\u00f3w dla prostej grafiki natomiast na rysunku 2 zaprezentowano wynik detekcji rog\u00f3w dla zdj\u0119cia.<\/p>\n<p>&nbsp;<\/p>\n<p>Listing 1. Przyk\u0142ad znalezienia rog\u00f3w z wykorzystaniem funkcji goodFeaturesToTrack.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport numpy as np\r\nimport cv2 as cv\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg = cv.imread('box_a.jpg')\r\ngray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)\r\n\r\ncorners = cv.goodFeaturesToTrack(gray,55,0.01,10)\r\ncorners = np.int0(corners)\r\n\r\nfor i in corners:\r\n   x,y = i.ravel()\r\n   cv.circle(img,(x,y),3,255,-1)\r\n\r\nplt.imshow(img),plt.show()\r\n\r\n<\/pre>\n<figure id=\"attachment_343\" aria-describedby=\"caption-attachment-343\" style=\"width: 1024px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features-1024x565.png\" alt=\"\" class=\"wp-image-343 size-large\" width=\"1024\" height=\"565\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features-1024x565.png 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features-300x166.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features-768x424.png 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features-65x36.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features-225x124.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features-350x193.png 350w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/box_a_features.png 1214w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption id=\"caption-attachment-343\" class=\"wp-caption-text\">Rysunek 1. Przyk\u0142ad znalezienia rog\u00f3w dla grafiki.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_344\" aria-describedby=\"caption-attachment-344\" style=\"width: 620px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/lewandowski_rogi.png\" alt=\"\" class=\"wp-image-344 size-full\" width=\"620\" height=\"413\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/lewandowski_rogi.png 620w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/lewandowski_rogi-300x200.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/lewandowski_rogi-65x43.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/lewandowski_rogi-225x150.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/lewandowski_rogi-350x233.png 350w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><figcaption id=\"caption-attachment-344\" class=\"wp-caption-text\">Rysunek 2. Przyk\u0142ad znalezienia rog\u00f3w dla zdj\u0119cia.<\/figcaption><\/figure>\n<p style=\"text-align: justify\">Nie tylko same punkty charakterystyczne mog\u0105 by\u0107 u\u017cyteczne. Jedn\u0105 z koncepcji jest poszukiwanie pewnych obszar\u00f3w obrazu podobnych do plamy (<strong>blob<\/strong>). Biblioteka OpenCV wspiera wykrywanie plam z wykorzystaniem funkcji SimpleBlobDetector. Przyk\u0142ad programu do detekcji plam zaprezentowano na listingu 2. Wynik dzia\u0142ania programu zaprezentowano na rysunku 3.<\/p>\n<p>Listing 2. Przyk\u0142ad programu wykrywaj\u0105cego plamy na obrazie<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nimage = cv2.imread('lewandowski.jpg', 0)\r\n\r\nparams = cv2.SimpleBlobDetector_Params()\r\n\r\nparams.filterByArea = True\r\nparams.minArea = 20\r\n\r\ndetector = cv2.SimpleBlobDetector_create(params)\r\nkeypoints = detector.detect(image)\r\n\r\nblank = np.zeros((1, 1))\r\nblobs = cv2.drawKeypoints(image, keypoints, blank, (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)\r\n\r\ncv2.imshow(&amp;amp;quot;Blobs&amp;amp;quot;, blobs)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncv2.imwrite('wynik_plamy.jpg',blobs)\r\n\r\n<\/pre>\n<figure id=\"attachment_348\" aria-describedby=\"caption-attachment-348\" style=\"width: 620px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_plamy.jpg\" alt=\"\" class=\"wp-image-348 size-full\" width=\"620\" height=\"413\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_plamy.jpg 620w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_plamy-300x200.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_plamy-65x43.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_plamy-225x150.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_plamy-350x233.jpg 350w\" sizes=\"(max-width: 620px) 100vw, 620px\" \/><figcaption id=\"caption-attachment-348\" class=\"wp-caption-text\">Rysunek 3. Wynik programu wykrywaj\u0105cego plamy o zadanych parametrach.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">Istnieje mo\u017cliwo\u015b\u0107 wykrycia plam o zadanych parametrach. Na przyk\u0142ad mo\u017cemy zdefiniowa\u0107 wielko\u015b\u0107 plamy, podobie\u0144stwo do ko\u0142a. W zale\u017cno\u015bci od ustawie\u0144, mo\u017cliwe jest wykrycie interesuj\u0105cych plam na obrazie. Przyk\u0142ad listingu wykrywaj\u0105cego wszystkie plamy zaprezentowano na listingu 3. Program wykrywaj\u0105cy plamy zbli\u017cone kszta\u0142tem do okr\u0119gu zaprezentowano na listingu 4. Wyniki programu wykrywaj\u0105cego wszystkie plamy oraz plamy o kszta\u0142cie ko\u0142a zaprezentowano na rysunkach 4 oraz 5. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119 oraz przeanalizowa\u0107 w dokumentacji na mo\u017cliwe opcje wykrywania plam.<\/p>\n<p>&nbsp;<\/p>\n<p>Listing 3. Przyk\u0142ad programu wykrywaj\u0105cego wszystkie plamy<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport cv2\r\nimport numpy as np\r\n\r\nimage = cv2.imread('plamy.jpg', 0)\r\nimg=cv2.imread('plamy.jpg',1)\r\n\r\nparams = cv2.SimpleBlobDetector_Params()\r\n\r\n#params.filterByArea = True\r\nparams.minArea = 10\r\n\r\ndetector = cv2.SimpleBlobDetector_create(params)\r\nkeypoints = detector.detect(image)\r\n\r\nblank = np.zeros((1, 1))\r\nblobs = cv2.drawKeypoints(img, keypoints, blank, (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)\r\n\r\ncv2.imshow('plamy', blobs)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncv2.imwrite('plamy_wykryte.jpg',blobs)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Listing 3. Przyk\u0142ad programu wykrywaj\u0105cego plamy w kszta\u0142cie ko\u0142a<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport cv2\r\nimport numpy as np\r\n\r\nimage = cv2.imread('plamy.jpg', 0)\r\nimg=cv2.imread('plamy.jpg',1)\r\n\r\nparams = cv2.SimpleBlobDetector_Params()\r\n\r\nparams.filterByArea = True\r\nparams.minArea = 10\r\n\r\nparams.filterByCircularity = True\r\nparams.minCircularity = 0.88\r\n\r\n\r\nparams.filterByConvexity = True\r\nparams.minConvexity = 0.2\r\n\r\nparams.filterByInertia = True\r\nparams.minInertiaRatio = 0.01\r\n\r\ndetector = cv2.SimpleBlobDetector_create(params)\r\nkeypoints = detector.detect(image)\r\n\r\nblank = np.zeros((1, 1))\r\nblobs = cv2.drawKeypoints(img, keypoints, blank, (0, 0, 255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)\r\n\r\ncv2.imshow('Plamy', blobs)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\ncv2.imwrite('plamy_wykryte_kola.jpg',blobs)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_351\" aria-describedby=\"caption-attachment-351\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte.jpg\" alt=\"\" class=\"wp-image-351 size-full\" width=\"640\" height=\"427\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte-300x200.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte-65x43.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte-225x150.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte-350x234.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-351\" class=\"wp-caption-text\">Rysunek 4. Wynik programu wykrywaj\u0105cego plamy o zadanych parametrach.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_352\" aria-describedby=\"caption-attachment-352\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte_kola.jpg\" alt=\"\" class=\"wp-image-352 size-full\" width=\"640\" height=\"427\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte_kola.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte_kola-300x200.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte_kola-65x43.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte_kola-225x150.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/plamy_wykryte_kola-350x234.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-352\" class=\"wp-caption-text\">Rysunek 5. Wynik programu wykrywaj\u0105cego plamy o zadanych parametrach w kszta\u0142cie okr\u0119gu.<\/figcaption><\/figure>\n<p style=\"text-align: justify\">Opracowano wiele technik wykrywania punkt\u00f3w kluczowych i wyznaczania deskryptor\u00f3w. Do najpopularniejszych nale\u017c\u0105 metoda <strong>FAST<\/strong> (<strong>Features from Accelerated Segments Test<\/strong>). Metoda bazuje na koncepcji por\u00f3wnywania punkt\u00f3w wok\u00f3\u0142 danego punktu. Je\u015bli otaczaj\u0105ce piksele s\u0105 podobne, to zapewne nie jest to dobry punkt charakterystyczny i nie b\u0119dzie dobrym kandydatem na cech\u0119 obrazu.\u00a0 Algorytm FAST jest rozwini\u0119ciem algorytmu <strong>SUSAN<\/strong>, jednak por\u00f3wnuje tylko punkty le\u017c\u0105ce na pier\u015bcieniu otaczaj\u0105cym punkt. Druga r\u00f3\u017cnica polega na tym, \u017ce punkty s\u0105 klasyfikowane jako ja\u015bniejsze i ciemniejsze ni\u017c rozwa\u017cany punkt a nast\u0119pnie zliczane. Bardziej zaawansowan\u0105 metod\u0105 detekcji cech jest <strong>SIFT<\/strong> (<strong>Scale Invariant Transform<\/strong>). Metoda SIFT wymaga wi\u0119kszej mocy obliczeniowej w por\u00f3wnaniu do innych metod. Nazwa metody pochodzi on wykrywania pewnych cech zwi\u0105zanych z niezmienno\u015bci\u0105 wzgl\u0119dem skali. Na pocz\u0105tku obliczany jest zbi\u00f3r splot\u00f3w pomi\u0119dzy obrazem wej\u015bciowym a gausowskimi j\u0105drami o wi\u0119kszym rozmiarze. Nast\u0119pnie obliczana jest kombinacja splot\u00f3w z bezpo\u015brednim nast\u0119pc\u0105. W praktyce, je\u015bli chcemy znale\u017a\u0107 punkty charakterystyczne na obrazie wideo zale\u017cy nam na szybkim dzia\u0142aniu. W zadaniu tym sprawdzi\u0107 si\u0119 mo\u017ce detektor cech <strong>ORB<\/strong>. W pierwszym etapie wykrywane s\u0105 punkty charakterystyczne z wykorzystaniem algorytmu FAST a nast\u0119pnie wyznaczane deskryptory z wykorzystaniem <strong>rog\u00f3w Harrisa<\/strong>. Przyk\u0142ad wykorzystania algorytmu ORB do znalezienia punkt\u00f3w charakterystycznych zaprezentowano na listingu 4. W tym celu obraz wej\u015bciowy poddano modyfikacjom polegaj\u0105cym na obrocie, przeskalowaniu. Do wyznaczenia punkt\u00f3w kluczowych oraz cech s\u0142u\u017cy funkcja detectAndCompute() a do por\u00f3wnania punkt\u00f3w kluczowych match(). Program \u0142\u0105czy liniami 10 najlepszych dopasowa\u0144. Wynik dzia\u0142ania programu zaprezentowano na rysunku 6. Na rysunku 7 oraz 8 zaprezentowano por\u00f3wnanie obraz\u00f3w twarzy dla tej samej i innej osoby. Jak wida\u0107, wyznaczone cechy nie zawsze s\u0105 dobrymi deskryptorami.<\/p>\n<p>Listing 4. Przyk\u0142ad programu por\u00f3wnuj\u0105cego punkty kluczowe w obrazach<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport numpy as np\r\nimport cv2\r\nfrom matplotlib import pyplot as plt\r\n\r\nimg1 = cv2.imread('greece.jpg',0) # queryImage\r\nimg2 = cv2.imread('greece1.jpg',0) # trainImage\r\n\r\norb = cv2.ORB_create()\r\n\r\nkp1, des1 = orb.detectAndCompute(img1,None)\r\nkp2, des2 = orb.detectAndCompute(img2,None)\r\n\r\nbf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)\r\n\r\nmatches = bf.match(des1,des2)\r\n\r\nmatches = sorted(matches, key = lambda x:x.distance)\r\n\r\nimg3 = cv2.drawMatches(img1,kp1,img2,kp2,matches&#x5b;:10] ,None, flags=2)\r\n\r\nplt.imshow(img3),plt.show()\r\n\r\n<\/pre>\n<figure id=\"attachment_369\" aria-describedby=\"caption-attachment-369\" style=\"width: 1162px\" class=\"wp-caption alignnone\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_.png\" alt=\"\" class=\"wp-image-369 size-full\" width=\"1162\" height=\"426\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_.png 1162w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-300x110.png 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-1024x375.png 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-768x282.png 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-65x24.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-225x82.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-350x128.png 350w\" sizes=\"(max-width: 1162px) 100vw, 1162px\" \/><figcaption id=\"caption-attachment-369\" class=\"wp-caption-text\">Rysunek 6. Wynik programu por\u00f3wnuj\u0105cego punkty charakterystyczne.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_371\" aria-describedby=\"caption-attachment-371\" style=\"width: 1280px\" class=\"wp-caption alignnone\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_.jpg\" alt=\"\" class=\"wp-image-371 size-full\" width=\"1280\" height=\"480\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_.jpg 1280w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-300x113.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-1024x384.jpg 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-768x288.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-65x24.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-225x84.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow_-350x131.jpg 350w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption id=\"caption-attachment-371\" class=\"wp-caption-text\">Rysunek 7. Por\u00f3wnanie punkt\u00f3w dla obrazu twarzy tej samej osoby [FEI Face Database].<\/figcaption><\/figure>\n<figure id=\"attachment_373\" aria-describedby=\"caption-attachment-373\" style=\"width: 1280px\" class=\"wp-caption alignnone\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_.jpg\" alt=\"\" class=\"wp-image-373 size-full\" width=\"1280\" height=\"480\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_.jpg 1280w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_-300x113.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_-1024x384.jpg 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_-768x288.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_-65x24.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_-225x84.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/porownanie_obrazow2_-350x131.jpg 350w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption id=\"caption-attachment-373\" class=\"wp-caption-text\">Rysunek 8. Por\u00f3wnanie punkt\u00f3w dla obrazu r\u00f3\u017cnych os\u00f3b [FEI Face Database].<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">Wa\u017cnym elementem analizy obraz\u00f3w jest <strong>detekcja obiekt\u00f3w<\/strong>. Celem detekcji jest wykrycie na obrazie danego obiektu oraz wskazanie miejsca wykrytego obiektu. Nale\u017cy zaznaczy\u0107, \u017ce detekcja obiekt\u00f3w na obrazie jest dynamicznie rozwijaj\u0105c\u0105 si\u0119 dziedzin\u0105. W chwili obecnej rozwijane s\u0105 z bardzo dobrym skutkiem techniki wykorzystuj\u0105ce uczenie g\u0142\u0119bokie (deep learning) a w szczeg\u00f3lno\u015bci konwolucyjne sieci nieuronowe (convolutional neural network -CNN). W bibliotece OpenCV popularn\u0105 metod\u0105 detekcji jest wykorzystanie <strong>klasyfikator\u00f3w kaskadowych<\/strong> oraz<strong> cech Haara<\/strong>. Od metod detekcji wymaga si\u0119 szybkiego dzia\u0142ania oraz dobrej trafno\u015bci. Umo\u017cliwia to wykrycie obiektu na obrazie wideo oraz poprawn\u0105 klasyfikacj\u0119 obiekt\u00f3w. W\u0142a\u015bciwo\u015bci takie posiada w\u0142a\u015bnie klasyfikator kaskadowy z cechami Haara.<\/p>\n<p style=\"text-align: justify\">Cechy Haara to nic innego jak pewne proste wzorce. Przyk\u0142ad takich wzorc\u00f3w zaprezentowano na rysunku 9. Cechy Haar\u2019a mo\u017cemy interpretowa\u0107 jako pewn\u0105 informacj\u0119 o zmianie warto\u015bci kontrastu pomi\u0119dzy prostok\u0105tnymi grupami pikseli. S\u0105siednie grupy o podobnej jasno\u015bci tworz\u0105 cech\u0119 Haar\u2019a. Warto\u015b\u0107 cechy dla danego szablonu to r\u00f3\u017cnica sumy pikseli w miejscu bia\u0142ego prostok\u0105tna i sumy pikseli w miejscu czarnego prostok\u0105ta. W wyniku takiego dopasowania szablonu do fragmentu obrazu dostajemy jedn\u0105 warto\u015b\u0107 skalarn\u0105. Cechy s\u0105 skalowane i przesuwane w ka\u017cdym poszukiwanym fragmencie obrazu. Uwzgl\u0119dniaj\u0105c wszystkie typy cech Haar\u2019a oraz ich po\u0142o\u017cenia i skale, dla pewnego fragmentu obrazu obliczanych jest oko\u0142o kilkaset tysi\u0119cy cech. Jest to zbyt wiele cech i nie ka\u017cda z nich jest u\u017cyteczna. Dlatego stosujemy<strong> technik\u0119 Adaboost<\/strong>. Polega ona na tym, \u017ce stosujemy wiele s\u0142abych klasyfikator\u00f3w u\u0142o\u017conych w kaskadzie. W ko\u0144cowym wyniku otrzymujemy bardzo dobry klasyfikator, kt\u00f3ry umo\u017cliwia skuteczn\u0105 detekcj\u0119 obiektu.<\/p>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_383\" aria-describedby=\"caption-attachment-383\" style=\"width: 205px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/cechy_haara-205x300.png\" alt=\"\" class=\"wp-image-383 size-medium\" width=\"205\" height=\"300\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/cechy_haara-205x300.png 205w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/cechy_haara-65x95.png 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/cechy_haara-225x330.png 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/cechy_haara.png 281w\" sizes=\"(max-width: 205px) 100vw, 205px\" \/><figcaption id=\"caption-attachment-383\" class=\"wp-caption-text\">Rysunek 9. Cechy Haara.<\/figcaption><\/figure>\n<p style=\"text-align: justify\">Wa\u017cnym elementem wp\u0142ywaj\u0105cym na skuteczno\u015b\u0107 wykrywania obiekt\u00f3w jest trenowanie klasyfikatora. W praktyce, nale\u017cy przygotowa\u0107 r\u00f3\u017cnorodny zestaw obraz\u00f3w przyk\u0142adowych zawieraj\u0105cych obiekty, kt\u00f3re chcemy wykry\u0107 oraz zestaw obraz\u00f3w, kt\u00f3re nie zawieraj\u0105 obiekt\u00f3w. Im liczniejsza liczba przyk\u0142ad\u00f3w do trenowania tym lepiej, jednak szacuje si\u0119, \u017ce dla niekt\u00f3rych zastosowa\u0144 wystarcz\u0105 setki a w niekt\u00f3rych tysi\u0105ce przyk\u0142ad\u00f3w trenuj\u0105cych. Trenowanie klasyfikatora do do\u015b\u0107 d\u0142ugi proces. W wyniku wytrenowania powstaje regu\u0142a decyzyjna (klasyfikator) kt\u00f3ry zostaje zapisany w postaci pliku .xml. W internecie mo\u017cna znale\u017a\u0107 wytrenowane klasyfikatory wykrywaj\u0105ce obiekty takie jak: twarz, oczy, usta, samochody itp. Nale\u017cy jednak zwr\u00f3ci\u0107 szczeg\u00f3ln\u0105 uwag\u0119 i sprawdzi\u0107 w praktyce dzia\u0142anie detektora. Chodzi tu o liczb\u0119 fa\u0142szywych detekcji oraz liczb\u0119 poprawnych detekcji.<\/p>\n<p style=\"text-align: justify\">Na listingu 5 zaprezentowano przyk\u0142ad programu wykrywaj\u0105cego twarz oraz oczy u\u017cytkownika. Klasyfikator za\u0142adowany jest w postaci pliku xml, s\u0142u\u017cy do tego funkcja CascadeClassifier(). Nast\u0119pnie funkcja detectMultiScale(), wykrywa na obrazie twarz oraz zwraca wsp\u00f3\u0142rz\u0119dne wykrytego obiektu. Funkcja wymaga podania obrazu w odcieniach szaro\u015bci, na kt\u00f3rym chcemy wykry\u0107 obiekt. Nast\u0119pnie nale\u017cy zadeklarowa\u0107 parametr scaleFactor. Ustalenie tego parametru na warto\u015b\u0107 scaleFactor = 1.07 oznacza zmniejszenie rozmiaru wej\u015bciowego o 7%, co zwi\u0119ksza szans\u0119 na wykrycie twarzy przez model. Im wi\u0119ksza warto\u015b\u0107 tym jako\u015b\u0107 wykrytych obiekt\u00f3w jest wy\u017csza. Kolejny parametr to minNeighbors. Patametr ten deklaruje minimaln\u0105 liczb\u0119 s\u0105siaduj\u0105cych obszar\u00f3w, kt\u00f3re zaklasyfikowano obiekt. Parametr wp\u0142ywa na jako\u015b\u0107 wykrytych twarzy. Wy\u017csza warto\u015b\u0107 powoduje mniej wykrywalno\u015bci, ale o wy\u017cszej jako\u015bci. Mo\u017cemy te\u017c zadeklarowa\u0107 parametr\u00a0 minSize. Jest to minimalny rozmiar obszaru zawieraj\u0105cy wykryty obiekt. Od zadeklarowanych parametr\u00f3w detekcji zale\u017cy jako\u015b\u0107 dzia\u0142ania detektora. Na rysunku 10 zaprezentowano przyk\u0142ad dzia\u0142ania detektora dla twarzy na wprost kamery, za\u015b na rysunku 11 twarzy obr\u00f3conej.<\/p>\n<p>Listing 5. Przyk\u0142ad programu wykorzystuj\u0105cego cechy Haara i klasyfikator kaskadowy.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport numpy as np\r\nimport cv2\r\n\r\nface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')\r\neye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')\r\n\r\nimg = cv2.imread('2-05.jpg')\r\ngray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r\n\r\nfaces = face_cascade.detectMultiScale(gray, 1.2, 10)\r\nfor (x,y,w,h) in faces:\r\n   cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)\r\n   roi_gray = gray&#x5b;y:y+h, x:x+w]\r\n   roi_color = img&#x5b;y:y+h, x:x+w]\r\n\r\n   eyes = eye_cascade.detectMultiScale(roi_gray)\r\n      for (ex,ey,ew,eh) in eyes:\r\n          cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)\r\n\r\ncv2.imshow('img',img)\r\ncv2.imwrite('wynikdetekcji_.jpg', img)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<figure id=\"attachment_390\" aria-describedby=\"caption-attachment-390\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji_.jpg\" alt=\"\" class=\"wp-image-390 size-full\" width=\"640\" height=\"480\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji_.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji_-300x225.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji_-65x49.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji_-225x169.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji_-350x263.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-390\" class=\"wp-caption-text\">Rysunek 10. Przyk\u0142ad detekcji twarzy i oczu.<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_393\" aria-describedby=\"caption-attachment-393\" style=\"width: 640px\" class=\"wp-caption aligncenter\"><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji2_.jpg\" alt=\"\" class=\"wp-image-393 size-full\" width=\"640\" height=\"480\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji2_.jpg 640w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji2_-300x225.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji2_-65x49.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji2_-225x169.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynikdetekcji2_-350x263.jpg 350w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><figcaption id=\"caption-attachment-393\" class=\"wp-caption-text\">Rysunek 11. Przyk\u0142ad detekcji twarzy i oczu dla twarzy obr\u00f3conej.<\/figcaption><\/figure>\n<p style=\"text-align: justify\">Wytrenowane klasyfikatory kaskadowe Haara mo\u017cemy wytrenowa\u0107 samemu oraz mo\u017cemy wykorzysta\u0107 jeden z og\u00f3lnodost\u0119pnych klasyfikator\u00f3w. Na listingu 6 zaprezentowano przyk\u0142ad programu wykrywaj\u0105cego znak STOP na obrazie. W tym przypadku skorzystano z wytrenowanego klasyfikatora. Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119, \u017ce dobrane parametry detekcji w funkcji detectMultiScale() mog\u0105 by\u0107 dobre dla jednego zdj\u0119cia, natomiast niepoprawnie dobrane mog\u0105 skutkowa\u0107 niepoprawnym dzia\u0142aniem detekcji. Na rysunku 12 zaprezentowano wynik detekcji znaku STOP.<\/p>\n<p>&nbsp;<\/p>\n<p>Listing 6. Program do wykrywania znak\u00f3w stop na obrazie.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport numpy as np\r\nimport cv2\r\n\r\nstopsign_cascade = cv2.CascadeClassifier('stop_sign_classifier_2.xml')\r\n\r\nimg = cv2.imread('stop.jpg')\r\ngray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r\n\r\nfaces = stopsign_cascade.detectMultiScale(gray, 1.5, 5)\r\nfor (x,y,w,h) in faces:\r\n   cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),15)\r\n   roi_gray = gray&#x5b;y:y+h, x:x+w]\r\n   roi_color = img&#x5b;y:y+h, x:x+w]\r\n\r\nscale_percent = 30 # percent of original size\r\nwidth = int(img.shape&#x5b;1] * scale_percent \/ 100)\r\nheight = int(img.shape&#x5b;0] * scale_percent \/ 100)\r\ndim = (width, height)\r\n\r\nimg = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)\r\ncv2.imshow('img',img)\r\n\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<p><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji.jpg\" alt=\"\" class=\"alignnone wp-image-396 size-full\" width=\"907\" height=\"680\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji.jpg 907w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-300x225.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-768x576.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-65x49.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-225x169.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wynik_detekcji-350x262.jpg 350w\" sizes=\"(max-width: 907px) 100vw, 907px\" \/><\/p>\n<p>Rysunek 12. Przyk\u0142ad detekcji znaku STOP.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Zadanie 1.<\/strong><\/p>\n<p>Napisz program, wykrywaj\u0105cy twarz na obrazie zarejestrowanym bezpo\u015brednio z kamery. Sprawd\u017a, czy detekcja op\u00f3\u017ania akwizycj\u0119 i czy program pozwala na p\u0142ynne dzia\u0142anie. Pochyl g\u0142ow\u0119, w prz\u00f3d ty\u0142 na boki, przys\u0142o\u0144 twarz r\u0119k\u0105. Sprawd\u017a jak wp\u0142ywa to na detekcj\u0119 twarzy.<\/p>\n<p><strong>Odpowied\u017a 1.<\/strong><\/p>\n<p>Program do wykrywania twarzy oraz oczu na obrazie wideo zaprezentowano na listingu 7. Klasyfikatory kaskadowe, umo\u017cliwiaj\u0105 szybk\u0105 detekcj\u0119 i nie wp\u0142ywaj\u0105 na p\u0142ynno\u015b\u0107 dzia\u0142ania programu w przypadku dobrania w\u0142a\u015bciwych parametr\u00f3w detekcji.<\/p>\n<p>&nbsp;<\/p>\n<p>Listing 7. Program do wykrywania twarzy na obrazie z kamery.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport numpy as np\r\nimport cv2\r\n\r\nface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')\r\neye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')\r\n\r\nvid = cv2.VideoCapture(0, cv2.CAP_DSHOW)\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n   img = frame\r\n\r\n   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r\n\r\n   faces = face_cascade.detectMultiScale(gray, 1.2, 6)\r\n   if len(faces) !=0:\r\n      for (x,y,w,h) in faces:\r\n         cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)\r\n         roi_gray = gray&#x5b;y:y+h, x:x+w]\r\n         roi_color = img&#x5b;y:y+h, x:x+w]\r\n\r\ncv2.imshow('img',img)\r\nif cv2.waitKey(1) &amp;amp;amp; 0xFF == ord('q'):\r\nbreak\r\n\r\nvid.release()\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<p><strong>Zadanie 2.<\/strong><\/p>\n<p style=\"text-align: justify\">Napisz program, wykrywaj\u0105cy punkty charakterystyczne na obrazie zarejestrowanym bezpo\u015brednio z kamery. Sprawd\u017a, czy detekcja punkt\u00f3w op\u00f3\u017ania akwizycj\u0119 i czy program pozwala na p\u0142ynne dzia\u0142anie.\u00a0 Poruszaj kamer\u0105. sprawd\u017a czy punkty si\u0119 zmieniaj\u0105.<\/p>\n<p><strong>Odpowied\u017a 2.<\/strong><\/p>\n<p style=\"text-align: justify\">Program do wykrywania punkt\u00f3w charakterystycznych zaprezentowano na listingu 8. Funkcja goodFeaturesToTrack, umo\u017cliwiaj\u0105 szybk\u0105 detekcj\u0119 i nie wp\u0142ywaj\u0105 na p\u0142ynno\u015b\u0107 dzia\u0142ania programu.<\/p>\n<pre><\/pre>\n<p>Listing 8. Program do wykrywania punkt\u00f3w charakterystycznych na obrazie z kamery.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport numpy as np\r\nimport cv2\r\n\r\nvid = cv2.VideoCapture(0, cv2.CAP_DSHOW)\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n   img = frame\r\n\r\n   gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\r\n   corners = cv2.goodFeaturesToTrack(gray,55,0.01,10)\r\n   corners = np.int0(corners)\r\n\r\n   for i in corners:\r\n      x,y = i.ravel()\r\n      cv2.circle(img,(x,y),3,255,-1)\r\n\r\n\r\ncv2.imshow('img',img)\r\nif cv2.waitKey(1) &amp;amp;amp; 0xFF == ord('q'):\r\n   break\r\n\r\nvid.release()\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<p><strong>Zadanie 3.<\/strong><\/p>\n<p style=\"text-align: justify\">Napisz program, wykrywaj\u0105cy punkty charakterystyczne na obrazie wideo zarejestrowanym w trakcie przejazdu pojazd\u00f3w. Zapisz plik wynikowy jako plik wideo. Zwr\u00f3\u0107 uwag\u0119 na pojawiaj\u0105ce si\u0119 punkty charakterystyczne.<\/p>\n<p><strong>Odpowied\u017a 3.<\/strong><\/p>\n<p style=\"text-align: justify\">Program do wykrywania punkt\u00f3w charakterystycznych w obrazie wideo zaprezentowano na listingu 9.\u00a0 Do wczytania obrazu s\u0142u\u017cy funkcja VideoCapture(). Do zapisania obrazu wideo wykorzystujemy funkcj\u0119 VideoWriter(). Wynik dzia\u0142ania programu mo\u017cna zobaczy\u0107 na Filmie 1.<\/p>\n<pre><\/pre>\n<p>Listing 9. Program do wykrywania punkt\u00f3w charakterystycznych na obrazie z kamery.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport cv2\r\nimport numpy as np\r\n\r\ncap = cv2.VideoCapture('samochody.avi')\r\n\r\nframe_width = int(cap.get(3))\r\nframe_height = int(cap.get(4))\r\nsize = (frame_width, frame_height)\r\nfourcc = cv2.VideoWriter_fourcc(*'XVID')\r\nresult = cv2.VideoWriter('wynik_detekcji.avi',fourcc,25.0,size)\r\n\r\nwhile(1):\r\n\r\n   ret, frame = cap.read()\r\n\r\n      if ret == True:\r\n\r\n         gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\r\n         corners = cv2.goodFeaturesToTrack(gray,55,0.01,10)\r\n         corners = np.int0(corners)\r\n\r\n        for i in corners:\r\n           x,y = i.ravel()\r\n        cv2.circle(frame,(x,y),3,255,-1)\r\n\r\n        cv2.imshow('res',frame)\r\n        result.write(frame)\r\n\r\n        k = cv2.waitKey(5) &amp;amp;amp; 0xFF\r\n           if k == 27:\r\n              break\r\n           else:\r\n              break\r\n\r\ncv2.destroyAllWindows()\r\ncap.release();\r\nresult.release();\r\n\r\n\r\n<\/pre>\n<p>Film 1. Przyk\u0142ad detekcji punkt\u00f3w charakterystycznych dla ruchu drogowego.<\/p>\n<div id=\"h5p-1\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-1\" class=\"h5p-iframe\" data-content-id=\"1\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Detekcja punkt\u00f3w kluczowych\"><\/iframe><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p><strong>Zadanie 4.<\/strong><\/p>\n<p style=\"text-align: justify\">Napisz program, wykrywaj\u0105cy punkty charakterystyczne na obrazie wideo twarzy. Zapisz plik wynikowy jako plik wideo. Zwr\u00f3\u0107 uwag\u0119 na pojawiaj\u0105ce si\u0119 punkty charakterystyczne.<\/p>\n<p><strong>Odpowied\u017a 4.<\/strong><\/p>\n<p style=\"text-align: justify\">Program do wykrywania punkt\u00f3w charakterystycznych w obrazie wideo zaprezentowano na listingu 9.\u00a0 Wynik dzia\u0142ania programu mo\u017cna zaobserwowa\u0107 na Filmie 2.<\/p>\n<pre><\/pre>\n<p>Film 2. Przyk\u0142ad detekcji punkt\u00f3w charakterystycznych dla twarzy.<\/p>\n<div id=\"h5p-2\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-2\" class=\"h5p-iframe\" data-content-id=\"2\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Detekcja punkt\u00f3w charakterystycznych obrazu z twarz\u0105\"><\/iframe><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p><strong>Zadanie 5.<\/strong><\/p>\n<p>Napisz program, wykrywaj\u0105cy twarz wideo twarzy. Zapisz plik wynikowy jako plik wideo.<\/p>\n<p><strong>Odpowied\u017a 5.<\/strong><\/p>\n<p>Program do przetwarzania obrazu wideo zaprezentowano na listingu 9.\u00a0 Do detekcji twarzy nale\u017cy zastosowa\u0107 klasyfikator kaskadowy Haara. Wynik dzia\u0142ania programu mo\u017cna zaobserwowa\u0107 na Filmie 3.<\/p>\n<pre><\/pre>\n<p>Film 3. Przyk\u0142ad detekcji twarzy.<\/p>\n<div id=\"h5p-3\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-3\" class=\"h5p-iframe\" data-content-id=\"3\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"Detekcja twarzy\"><\/iframe><\/div>\n<\/div>\n","protected":false},"author":49,"menu_order":5,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"part":3,"_links":{"self":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/117"}],"collection":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/users\/49"}],"version-history":[{"count":65,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/117\/revisions"}],"predecessor-version":[{"id":495,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/117\/revisions\/495"}],"part":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/parts\/3"}],"metadata":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/117\/metadata\/"}],"wp:attachment":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/media?parent=117"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapter-type?post=117"},{"taxonomy":"contributor","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/contributor?post=117"},{"taxonomy":"license","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/license?post=117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}