{"id":125,"date":"2022-07-27T09:02:20","date_gmt":"2022-07-27T09:02:20","guid":{"rendered":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/?post_type=chapter&#038;p=125"},"modified":"2022-12-16T07:58:21","modified_gmt":"2022-12-16T07:58:21","slug":"przyklady-wykorzystania-systemow-wizyjnych-w-praktyce","status":"web-only","type":"chapter","link":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/chapter\/przyklady-wykorzystania-systemow-wizyjnych-w-praktyce\/","title":{"raw":"Przyk\u0142ady wykorzystania system\u00f3w wizyjnych","rendered":"Przyk\u0142ady wykorzystania system\u00f3w wizyjnych"},"content":{"raw":"<p style=\"text-align: justify\">W rozdziale tym zostan\u0105 zaprezentowane przyk\u0142ady wykorzystania system\u00f3w wizyjnych. Wszystkie potrzebne elementy zwi\u0105zane z przetwarzaniem i analiz\u0105 obraz\u00f3w zosta\u0142y zaprezentowane w poprzednich rozdzia\u0142ach podr\u0119cznika.<\/p>\r\n<p style=\"text-align: justify\">Przyk\u0142ad pierwszy, dotyczy pr\u00f3by zaprojektowania systemu, kt\u00f3ry w spos\u00f3b automatyczny zlicza powierzchni\u0119 zabudowa\u0144 oraz powierzchni\u0119 zielon\u0105 na dostarczonych zdj\u0119ciach lotniczych\/satelitarnych. Wa\u017cnym aspektem projektowania jest spos\u00f3b rejestracji i normalizacji zgromadzonych zdj\u0119\u0107. W wielu zastosowaniach, mamy wp\u0142yw na te aspekty. Mo\u017cemy zmienia\u0107 odleg\u0142o\u015b\u0107 i u\u0142o\u017cenie kamery wzgl\u0119dem rejestrowanego obiektu. W wielu zastosowaniach mo\u017cemy do\u015bwietli\u0107 rejestrowane obiekty. W przypadku zdj\u0119\u0107 lotniczych lub satelitarnych, jeste\u015bmy ograniczeni w tym zakresie. Musimy wzi\u0105\u0107 pod uwag\u0119 nas\u0142onecznienie w trakcie rejestracji, przejrzysto\u015b\u0107 atmosfery zwi\u0105zan\u0105 z zachmurzeniem oraz zanieczyszczeniami powietrza. Na r\u00f3\u017cnorodno\u015b\u0107 rejestracji, wp\u0142yw mo\u017ce mie\u0107 pora dnia, zmienny k\u0105t padania promieni s\u0142onecznych i w rezultacie cie\u0144 obiekt\u00f3w. To tylko niekt\u00f3re aspekty, kt\u00f3re powoduj\u0105, \u017ce ka\u017cde zdj\u0119cie lotnicze mo\u017ce by\u0107 unikatowe. Dla takiego szerokiego spektrum mo\u017cliwych rejestracji wyzwaniem staje si\u0119 znalezienie pewnego uniwersalnego algorytmu.<\/p>\r\n<p style=\"text-align: justify\">Przyk\u0142ad zdj\u0119\u0107 lotniczych prezentuj\u0105cych wybrane obszary zaprezentowano na rysunkach 1-3. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, na zaprezentowan\u0105 szczeg\u00f3\u0142owo\u015b\u0107 zdj\u0119\u0107 oraz na skal\u0119. Warto przyjrze\u0107 si\u0119 zdj\u0119ciom i zastanowi\u0107 si\u0119, czy jeste\u015bmy w stanie oceni\u0107, czy ka\u017cdy z fragment\u00f3w obrazu mo\u017cemy jednoznacznie przypisa\u0107 do teren\u00f3w zabudowy czy teren\u00f3w zieleni. Czy wykorzystujemy do tego, sam rozk\u0142ad kolor\u00f3w, jasno\u015b\u0107 obiekt\u00f3w a mo\u017ce sami nie jeste\u015bmy w stanie oceni\u0107 czy jest to fragment terenu zielonego czy zabudowania.<\/p>\r\n&nbsp;\r\n\r\n<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-1024x551.jpg\" alt=\"\" class=\"aligncenter wp-image-425 size-large\" width=\"1024\" height=\"551\" \/> Rysunek 1. Zdj\u0119cie lotnicze A, teren parku Pola Mokotowskie. \u0179r\u00f3d\u0142o Ortomapa https:\/\/mapa.um.warszawa.pl\/.\r\n\r\n&nbsp;\r\n\r\n<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-1024x556.jpg\" alt=\"\" class=\"aligncenter wp-image-426 size-large\" width=\"1024\" height=\"556\" \/>\r\n\r\nRysunek 2. Zdj\u0119cie lotnicze B, teren parku Pola Mokotowskie oraz zabudowa\u0144 wok\u00f3\u0142 Metra Politechnika. \u0179r\u00f3d\u0142o Ortomapa https:\/\/mapa.um.warszawa.pl\/.\r\n\r\n&nbsp;\r\n\r\n<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-1024x553.jpg\" alt=\"\" class=\"aligncenter wp-image-427 size-large\" width=\"1024\" height=\"553\" \/>\r\n\r\nRysunek 3. Zdj\u0119cie lotnicze C, teren Kampusu Politechniki Warszawskiej. \u0179r\u00f3d\u0142o Ortomapa https:\/\/mapa.um.warszawa.pl\/.\r\n\r\n&nbsp;\r\n<p style=\"text-align: justify\">Jedn\u0105 z metod rozwi\u0105zania, mo\u017ce by\u0107 pr\u00f3ba wyodr\u0119bnienia zakres\u00f3w kolor\u00f3w a nast\u0119pnie zliczenie poszczeg\u00f3lnych pikseli. Przy odpowiednim doborze zakres\u00f3w jeste\u015bmy w stanie wyodr\u0119bni\u0107 powierzchni\u0119 teren\u00f3w zielonych oraz zabudowa\u0144. Przyk\u0142ad programu zaprezentowano na listingu 1. Wa\u017cnym elementem jest skalowanie obliczonych warto\u015bci pikseli na rzeczywist\u0105 powierzchni\u0119. W tym celu, bazuj\u0105c na do\u0142\u0105czonej skali jeste\u015bmy w stanie obliczy\u0107 powierzchni\u0119 przypadaj\u0105ca na dany piksel. W przyk\u0142adzie, za t\u0105 warto\u015b\u0107 odpowiada zmienna <em>mSq<\/em>. Warto\u015b\u0107 ta jest inna dla zdj\u0119\u0107 A, B, C. W przyk\u0142adzie wykorzystano konwersje obrazu na sk\u0142adowe HSV. Eksperymentalnie dobrano progi dla teren\u00f3w zielonych oraz zabudowa\u0144. Na rysunku 4 zaprezentowano piksele wyodr\u0119bnione dla zabudowa\u0144. Na rysunku 5 zaprezentowano piksele wyodr\u0119bnione dla teren\u00f3w zielonych. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, dla jakich fragment\u00f3w obrazu dokonano poprawnej i b\u0142\u0119dnej segmentacji. W wyniku oblicze\u0144, oszacowano powierzchni\u0119 obszaru zielonego na 0.046 km<sup>2<\/sup>, obszaru zabudowa\u0144 na 0.064km<sup>2<\/sup>.<\/p>\r\nListing 1. Program do zliczania powierzchni zabudowa\u0144 oraz teren\u00f3w zielonych.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nmPerPixel = 0.3571428571428571\r\nmSq = mPerPixel**2\r\n\r\nframe = cv2.imread('C.jpg')\r\nhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\r\n\r\nheight, width = hsv.shape[:2]\r\nheight = height*mPerPixel\r\nwidth = width*mPerPixel\r\n\r\nlower_blue = np.array([80,20,10])\r\nupper_blue = np.array([130,80,255])\r\n\r\nlower_green = np.array([10,20,0])\r\nupper_green = np.array([80,255,255])\r\n\r\nmaskBlue = cv2.inRange(hsv, lower_blue, upper_blue)\r\nresBlue = cv2.bitwise_and(frame,frame, mask= maskBlue)\r\n\r\nmaskGreen = cv2.inRange(hsv, lower_green, upper_green)\r\nmaskGreen = cv2.subtract(maskGreen, maskBlue)\r\nresGreen = cv2.bitwise_and(frame,frame, mask= maskGreen)\r\n\r\nnumGreen = cv2.countNonZero(maskGreen)\r\nmGreen = numGreen*mSq\r\n\r\nnumBlue = cv2.countNonZero(maskBlue)\r\nmBlue = numBlue*mSq\r\n\r\nprint('Obszar zielony: ',mGreen\/1000000,'km2, obszar budynk\u00f3w: ',mBlue\/1000000,'km2')\r\n\r\ncv2.imshow('Oryginal',frame)\r\n\r\ncv2.imshow('Budynki',resBlue)\r\ncv2.imshow('Tereny zielone',resGreen)\r\ncv2.imwrite('Budynki.jpg',resBlue);\r\ncv2.imwrite('Zielen.jpg',resGreen);\r\n\r\n#cv2.imshow('Zakres szarosci',resGrey)\r\nprint('Obszar ca\u0142ego obrazu: ',height*width\/1000000,'km2')\r\n\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\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\/Budynki-1024x510.jpg\" alt=\"\" class=\"aligncenter wp-image-432 size-large\" width=\"1024\" height=\"510\" \/>\r\nRysunek 4. Piksele wyodr\u0119bnione dla zabudowa\u0144.\r\n\r\n<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen.jpg\" alt=\"\" class=\"alignnone wp-image-433 size-full\" width=\"1703\" height=\"849\" \/>\r\nRysunek 5. Piksele wyodr\u0119bnione dla teren\u00f3w zielonych.\r\n<p style=\"text-align: justify\">Kolejny przyk\u0142ad wykorzystania system\u00f3w wizyjnych, mo\u017ce dotyczy\u0107 wspomagania zliczania monet. Na rysunku 6 zaprezentowano zdj\u0119cie z kilkoma losowo u\u0142o\u017conymi monetami. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, na nier\u00f3wne do\u015bwietlenie i dobicie \u015bwiat\u0142a. Warto zauwa\u017cy\u0107, \u017ce znajduj\u0105 si\u0119 tam monety o r\u00f3\u017cnej wielko\u015bci. Problem detekcji jest nieco trudniejszy bo wyst\u0119puje tu niejednorodne t\u0142o.<\/p>\r\n&nbsp;\r\n\r\n<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-768x1024.jpg\" alt=\"\" class=\"wp-image-444 size-large aligncenter\" width=\"768\" height=\"1024\" \/>\r\n<p style=\"text-align: center\">Rysunek 6. Zdj\u0119cie monet.<\/p>\r\n<p style=\"text-align: justify\">Przyk\u0142ad programu do zliczania, mo\u017ce obejmowa\u0107 przetworzenie wst\u0119pne oraz zastosowanie transformaty Hough'a do wykrycia okr\u0119g\u00f3w. Na listingu 2 zaprezentowano program do zliczania monet. W proponowanym systemie, wykorzystujemy obraz o ocienianiach szaro\u015bci. Obraz jest skalowany oraz dokonywana jest operacja wyr\u00f3wnania histogramu. W kolejnym kroku wej\u015bciowy obraz poddawany jest operacji rozmycia z wykorzystaniem filtru medianowego. Do detekcji monet wykorzystano transformat\u0119 Hough'a z odpowiednio dobranymi parametrami. W konsoli program wy\u015bwietla liczb\u0119 wykrytych okr\u0119g\u00f3w (monet).<\/p>\r\nListing 2. Program do zliczania monet.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nimg = cv2.imread('11.jpg',0)\r\n\r\nscale = 0.2\r\n\r\nwidth = int(img.shape[1] * scale)\r\nheight = int(img.shape[0] * scale)\r\ndim = (width, height)\r\n\r\nimg = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)\r\n\r\ncv2.imshow('org',img)\r\n\r\nimg = cv2.equalizeHist(img)\r\ncimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)\r\n\r\nimg = cv2.medianBlur(img, 5)\r\n\r\ncircles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,30,\r\nparam1=50,param2=30,minRadius=20,maxRadius=35)\r\n\r\ncircles = np.uint16(np.around(circles))\r\nfor i in circles[0,:]:\r\n   cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)\r\n   cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)\r\n\r\nprint(len(circles[0,:]))\r\n\r\ncv2.imshow('detected circles',cimg)\r\ncv2.imwrite('liczba_monet.jpg',cimg)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n[\/code]\r\n\r\n&nbsp;\r\n\r\n<img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/liczba_monet.jpg\" alt=\"\" class=\"aligncenter wp-image-447 size-full\" width=\"600\" height=\"800\" \/>\r\n\r\nRysunek 7. Wynik detekcji z wykorzystaniem zaproponowanego algorytmu.\r\n<p style=\"text-align: justify\">Kolejnym przyk\u0142adem systemu b\u0119dzie detekcja koloru na prezentowanej planszy. Zadaniem programu b\u0119dzie ci\u0105g\u0142a akwizycja obrazu z kamery oraz analiza obrazu i zliczenie poszczeg\u00f3lnych sk\u0142adowych kolor\u00f3w R, G, B. Wizualizacja zawarto\u015bci kolor\u00f3w dla poszczeg\u00f3lnych kolor\u00f3w b\u0119dzie wizualizowana z wykorzystaniem wysoko\u015bci s\u0142upk\u00f3w: czerwonego, niebieskiego, zielonego. Na listingu 3 zaprezentowano listing programu do detekcji prezentowanego koloru. Zarejestrowana klatka obrazu jest poddawana prostym operacjom a w efekcie, nast\u0119puje zliczenie poszczeg\u00f3lnych element\u00f3w macierzy. Z wykorzystaniem funkcji split() nast\u0119puje roz\u0142o\u017cenie macierzy na poszczeg\u00f3lne sk\u0142adowe R, B, G obrazu. Wa\u017cnym elementem jest normalizacja zliczonych pikseli. W tym celu, suma dla poszczeg\u00f3lnych sk\u0142adowych pikselu R, G, B jest dzielona przez sum\u0119 dla wszystkich sk\u0142adowych.\u00a0 Dla ka\u017cdej analizowanej klatki wy\u015bwietlany jest prostok\u0105t, kt\u00f3ry reprezentuje sum\u0119 pikseli dla poszczeg\u00f3lnych kolor\u00f3w. Przyk\u0142ad dzia\u0142ania programu zaprezentowano na filmie 1. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, na jako\u015b\u0107 wykrycia koloru oraz zaprezentowany kolor w trakcie zmiany u\u0142o\u017cenia planszy z kolorem. Prosz\u0119 si\u0119 zastanowi\u0107 jakie czynniki mog\u0105 mie\u0107 wp\u0142yw na dzia\u0142anie systemu. Prosz\u0119 uwzgl\u0119dni\u0107, o\u015bwietlenie, odleg\u0142o\u015b\u0107, k\u0105t wzgl\u0119dem kamery i o\u015bwietlenia.<\/p>\r\nListing 3. Program do wykrywania koloru.\r\n\r\n[code lang=\"python\"]\r\nimport cv2\r\nlabels = ('Blue', 'Green', 'Red')\r\nvid = cv2.VideoCapture(0)\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n\r\n   b,g,r = cv2.split(frame);\r\n\r\n   print(b.sum(), g.sum(), r.sum())\r\n\r\n   suma = b.sum()+g.sum()+r.sum()\r\n\r\n   bsuma = (b.sum()*100)\r\n   gsuma = (g.sum()*100)\r\n   rsuma = (r.sum()*100)\r\n\r\n   bsuma = (bsuma\/suma)\r\n   gsuma = (gsuma\/suma)\r\n   rsuma = (rsuma\/suma)\r\n\r\n   frame = cv2.rectangle(frame, (5,100), (205,100), (0, 0, 0), 1)\r\n   frame = cv2.rectangle(frame, (5,100), (55,(100-int(bsuma))), (255, 0, 0), -1)\r\n   frame = cv2.rectangle(frame, (105,100), (155,(100-int(gsuma))), (0, 255, 0), -1)\r\n   frame = cv2.rectangle(frame, (205,100), (255,(100-int(rsuma))), (0, 0, 255), -1)\r\n\r\n    cv2.imshow('frame', frame)\r\n\r\n   if cv2.waitKey(1) &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[video width=\"632\" height=\"504\" mp4=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wykrywanie_koloru.mp4\"][\/video]\r\n<p style=\"text-align: center\">Film 1. Przyk\u0142ad dzia\u0142ania systemu do detekcji kolor\u00f3w.<\/p>\r\n&nbsp;\r\n<p style=\"text-align: justify\">Przyk\u0142adem systemu, kt\u00f3ry w spos\u00f3b automatyczny wykrywa u\u017cytkownika przed komputerem mo\u017ce by\u0107 zastosowanie detekcji twarzy. Opr\u00f3cz wykrycia i wskazania wykrytej twarzy na obrazie, program wzbogacono o informacj\u0119 o czasie wykrycia lub braku wykrycia u\u017cytkownika. Po prostej modyfikacji program, mo\u017ce pe\u0142ni\u0107 rol\u0119 \"liczenia\" czasu uwagi u\u017cytkownika. Ka\u017cde odchylenie g\u0142owy, mo\u017ce oznacza\u0107 mniejsz\u0105 uwag\u0119 u\u017cytkownika. Na listingu 4 zaprezentowano program do detekcji u\u017cytkownika przed ekranem komputera. Do wykrycia twarzy zastosowano klasyfikator Haara'a. Natomiast najwa\u017cniejszym elementem programu jest warunek wypisania na ekranie godziny oraz informacji o braku lub pojawieniu si\u0119 u\u017cytkownika. Przyk\u0142ad dzia\u0142ania programu zaprezentowano na filmie 2.<\/p>\r\nListing 4. Program do detekcji u\u017cytkownika.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\nfrom datetime import datetime\r\n\r\nvid = cv2.VideoCapture(0,cv2.CAP_DSHOW)\r\nfont = cv2.FONT_HERSHEY_SIMPLEX\r\n\r\nface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n\r\n   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\r\n\r\n   faces = face_cascade.detectMultiScale(gray, 1.13, 20)\r\n   for (x,y,w,h) in faces:\r\n      cv2.rectangle(frame,(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 = frame[y:y+h, x:x+w]\r\n\r\n   if not any(map(len, faces)):\r\n      text = 'Brak uzytkownika, '+datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;)\r\n      cv2.putText(frame,text,(30,30), font, 0.6, (0, 0, 255), 1, cv2.LINE_AA)\r\n   else:\r\n      text = 'Uzytkownik wykryty, '+datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;)\r\n      cv2.putText(frame,text,(30,30), font, 0.7, (0, 255, 0), 1, cv2.LINE_AA)\r\n\r\n   cv2.imshow('frame', frame)\r\n\r\n   if cv2.waitKey(1) &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&nbsp;\r\n\r\n[video width=\"632\" height=\"504\" mp4=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcj_uzytkownika.mp4\"][\/video]\r\n<p style=\"text-align: center\">Film 2. Przyk\u0142ad dzia\u0142ania systemu do detekcji u\u017cytkownika.<\/p>\r\n<p style=\"text-align: justify\">Wa\u017cnym elementem systemu, mo\u017ce by\u0107 wykrycie pewnych punkt\u00f3w charakterystycznych. W przyk\u0142adzie pos\u0142u\u017cono si\u0119 detekcj\u0105 punkt\u00f3w na obrazie wideo. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119 na p\u0142ynno\u015b\u0107 detekcji punkt\u00f3w charakterystycznych oraz skuteczno\u015b\u0107 dopasowania punkt\u00f3w. W szczeg\u00f3lno\u015bci istotny jest spos\u00f3b dzia\u0142ania wykrycia\/dopasowania punkt\u00f3w w przypadku wyst\u0119powania obiektu oraz wtedy, gdy obiekt nie wyst\u0119puje. Program do detekcji punkt\u00f3w kluczowych dla p\u0142yty czo\u0142owej multimetru zaprezentowano na listingu 5.<\/p>\r\nListing 5. Program do detekcji punkt\u00f3w charakterystycznych.\r\n\r\n[code lang=\"python\"]\r\n\r\nimport cv2\r\n\r\nvid = cv2.VideoCapture(0,cv2.CAP_DSHOW)\r\nmaxH = 100\r\nimg2 = cv2.imread('multi2.jpg')\r\nscale = 0.2\r\n\r\nwidth = int(img2.shape[1] * scale)\r\nheight = int(img2.shape[0] * scale)\r\ndim = (width, height)\r\n\r\nimg2 = cv2.resize(img2, dim, interpolation = cv2.INTER_AREA)\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n\r\n   orb = cv2.ORB_create()\r\n\r\n   kp1, des1 = orb.detectAndCompute(frame,None)\r\n   kp2, des2 = orb.detectAndCompute(img2,None)\r\n\r\n   bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)\r\n\r\n   matches = bf.match(des1,des2)\r\n   matches = sorted(matches, key = lambda x:x.distance)\r\n\r\n   img3 = cv2.drawMatches(frame,kp1,img2,kp2,matches[:5] ,None, flags=2)\r\n\r\n   cv2.imshow('frame', img3)\r\n \r\n   if cv2.waitKey(1) &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[video width=\"896\" height=\"532\" mp4=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/punknty_charakterystyczne_multimetr.mp4\"][\/video]\r\n<p style=\"text-align: center\">Film 3. Przyk\u0142ad wykrycia punkt\u00f3w charakterystycznych.<\/p>\r\n<p style=\"text-align: justify\">Na pocz\u0105tku dzia\u0142ania programu, wczytywany jest obraz prezentuj\u0105cy multimetr. Nast\u0119pnie, dla ka\u017cdej klatki filmu dokonywane jest por\u00f3wnanie punkt\u00f3w kluczowych dla zarejestrowanego przez kamer\u0119 obrazu oraz obrazu zawieraj\u0105cego multimetr. W zadaniu detekcji punkt\u00f3w zastosowano metod\u0119 ORB. W zadaniu dopasowania 10 najlepszych punkt\u00f3w zastosowano funkcj\u0119 BFMatcher(). Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, na brak poprawnych dopasowa\u0144 dla pocz\u0105tku zarejestrowanego obrazu oraz na ko\u0144cu zarejestrowanego obrazu.<\/p>\r\n<p style=\"text-align: justify\"><\/p>","rendered":"<p style=\"text-align: justify\">W rozdziale tym zostan\u0105 zaprezentowane przyk\u0142ady wykorzystania system\u00f3w wizyjnych. Wszystkie potrzebne elementy zwi\u0105zane z przetwarzaniem i analiz\u0105 obraz\u00f3w zosta\u0142y zaprezentowane w poprzednich rozdzia\u0142ach podr\u0119cznika.<\/p>\n<p style=\"text-align: justify\">Przyk\u0142ad pierwszy, dotyczy pr\u00f3by zaprojektowania systemu, kt\u00f3ry w spos\u00f3b automatyczny zlicza powierzchni\u0119 zabudowa\u0144 oraz powierzchni\u0119 zielon\u0105 na dostarczonych zdj\u0119ciach lotniczych\/satelitarnych. Wa\u017cnym aspektem projektowania jest spos\u00f3b rejestracji i normalizacji zgromadzonych zdj\u0119\u0107. W wielu zastosowaniach, mamy wp\u0142yw na te aspekty. Mo\u017cemy zmienia\u0107 odleg\u0142o\u015b\u0107 i u\u0142o\u017cenie kamery wzgl\u0119dem rejestrowanego obiektu. W wielu zastosowaniach mo\u017cemy do\u015bwietli\u0107 rejestrowane obiekty. W przypadku zdj\u0119\u0107 lotniczych lub satelitarnych, jeste\u015bmy ograniczeni w tym zakresie. Musimy wzi\u0105\u0107 pod uwag\u0119 nas\u0142onecznienie w trakcie rejestracji, przejrzysto\u015b\u0107 atmosfery zwi\u0105zan\u0105 z zachmurzeniem oraz zanieczyszczeniami powietrza. Na r\u00f3\u017cnorodno\u015b\u0107 rejestracji, wp\u0142yw mo\u017ce mie\u0107 pora dnia, zmienny k\u0105t padania promieni s\u0142onecznych i w rezultacie cie\u0144 obiekt\u00f3w. To tylko niekt\u00f3re aspekty, kt\u00f3re powoduj\u0105, \u017ce ka\u017cde zdj\u0119cie lotnicze mo\u017ce by\u0107 unikatowe. Dla takiego szerokiego spektrum mo\u017cliwych rejestracji wyzwaniem staje si\u0119 znalezienie pewnego uniwersalnego algorytmu.<\/p>\n<p style=\"text-align: justify\">Przyk\u0142ad zdj\u0119\u0107 lotniczych prezentuj\u0105cych wybrane obszary zaprezentowano na rysunkach 1-3. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, na zaprezentowan\u0105 szczeg\u00f3\u0142owo\u015b\u0107 zdj\u0119\u0107 oraz na skal\u0119. Warto przyjrze\u0107 si\u0119 zdj\u0119ciom i zastanowi\u0107 si\u0119, czy jeste\u015bmy w stanie oceni\u0107, czy ka\u017cdy z fragment\u00f3w obrazu mo\u017cemy jednoznacznie przypisa\u0107 do teren\u00f3w zabudowy czy teren\u00f3w zieleni. Czy wykorzystujemy do tego, sam rozk\u0142ad kolor\u00f3w, jasno\u015b\u0107 obiekt\u00f3w a mo\u017ce sami nie jeste\u015bmy w stanie oceni\u0107 czy jest to fragment terenu zielonego czy zabudowania.<\/p>\n<p>&nbsp;<\/p>\n<p><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-1024x551.jpg\" alt=\"\" class=\"aligncenter wp-image-425 size-large\" width=\"1024\" height=\"551\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-1024x551.jpg 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-300x161.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-768x413.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-1536x826.jpg 1536w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-65x35.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-225x121.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa-350x188.jpg 350w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/A_ortomapa.jpg 1709w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/> Rysunek 1. Zdj\u0119cie lotnicze A, teren parku Pola Mokotowskie. \u0179r\u00f3d\u0142o Ortomapa https:\/\/mapa.um.warszawa.pl\/.<\/p>\n<p>&nbsp;<\/p>\n<p><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-1024x556.jpg\" alt=\"\" class=\"aligncenter wp-image-426 size-large\" width=\"1024\" height=\"556\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-1024x556.jpg 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-300x163.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-768x417.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-1536x834.jpg 1536w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-65x35.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-225x122.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa-350x190.jpg 350w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/B_ortomapa.jpg 1695w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Rysunek 2. Zdj\u0119cie lotnicze B, teren parku Pola Mokotowskie oraz zabudowa\u0144 wok\u00f3\u0142 Metra Politechnika. \u0179r\u00f3d\u0142o Ortomapa https:\/\/mapa.um.warszawa.pl\/.<\/p>\n<p>&nbsp;<\/p>\n<p><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-1024x553.jpg\" alt=\"\" class=\"aligncenter wp-image-427 size-large\" width=\"1024\" height=\"553\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-1024x553.jpg 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-300x162.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-768x415.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-1536x830.jpg 1536w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-65x35.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-225x122.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa-350x189.jpg 350w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/C_ortomapa.jpg 1705w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Rysunek 3. Zdj\u0119cie lotnicze C, teren Kampusu Politechniki Warszawskiej. \u0179r\u00f3d\u0142o Ortomapa https:\/\/mapa.um.warszawa.pl\/.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">Jedn\u0105 z metod rozwi\u0105zania, mo\u017ce by\u0107 pr\u00f3ba wyodr\u0119bnienia zakres\u00f3w kolor\u00f3w a nast\u0119pnie zliczenie poszczeg\u00f3lnych pikseli. Przy odpowiednim doborze zakres\u00f3w jeste\u015bmy w stanie wyodr\u0119bni\u0107 powierzchni\u0119 teren\u00f3w zielonych oraz zabudowa\u0144. Przyk\u0142ad programu zaprezentowano na listingu 1. Wa\u017cnym elementem jest skalowanie obliczonych warto\u015bci pikseli na rzeczywist\u0105 powierzchni\u0119. W tym celu, bazuj\u0105c na do\u0142\u0105czonej skali jeste\u015bmy w stanie obliczy\u0107 powierzchni\u0119 przypadaj\u0105ca na dany piksel. W przyk\u0142adzie, za t\u0105 warto\u015b\u0107 odpowiada zmienna <em>mSq<\/em>. Warto\u015b\u0107 ta jest inna dla zdj\u0119\u0107 A, B, C. W przyk\u0142adzie wykorzystano konwersje obrazu na sk\u0142adowe HSV. Eksperymentalnie dobrano progi dla teren\u00f3w zielonych oraz zabudowa\u0144. Na rysunku 4 zaprezentowano piksele wyodr\u0119bnione dla zabudowa\u0144. Na rysunku 5 zaprezentowano piksele wyodr\u0119bnione dla teren\u00f3w zielonych. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, dla jakich fragment\u00f3w obrazu dokonano poprawnej i b\u0142\u0119dnej segmentacji. W wyniku oblicze\u0144, oszacowano powierzchni\u0119 obszaru zielonego na 0.046 km<sup>2<\/sup>, obszaru zabudowa\u0144 na 0.064km<sup>2<\/sup>.<\/p>\n<p>Listing 1. Program do zliczania powierzchni zabudowa\u0144 oraz teren\u00f3w zielonych.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nmPerPixel = 0.3571428571428571\r\nmSq = mPerPixel**2\r\n\r\nframe = cv2.imread('C.jpg')\r\nhsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)\r\n\r\nheight, width = hsv.shape&#x5b;:2]\r\nheight = height*mPerPixel\r\nwidth = width*mPerPixel\r\n\r\nlower_blue = np.array(&#x5b;80,20,10])\r\nupper_blue = np.array(&#x5b;130,80,255])\r\n\r\nlower_green = np.array(&#x5b;10,20,0])\r\nupper_green = np.array(&#x5b;80,255,255])\r\n\r\nmaskBlue = cv2.inRange(hsv, lower_blue, upper_blue)\r\nresBlue = cv2.bitwise_and(frame,frame, mask= maskBlue)\r\n\r\nmaskGreen = cv2.inRange(hsv, lower_green, upper_green)\r\nmaskGreen = cv2.subtract(maskGreen, maskBlue)\r\nresGreen = cv2.bitwise_and(frame,frame, mask= maskGreen)\r\n\r\nnumGreen = cv2.countNonZero(maskGreen)\r\nmGreen = numGreen*mSq\r\n\r\nnumBlue = cv2.countNonZero(maskBlue)\r\nmBlue = numBlue*mSq\r\n\r\nprint('Obszar zielony: ',mGreen\/1000000,'km2, obszar budynk\u00f3w: ',mBlue\/1000000,'km2')\r\n\r\ncv2.imshow('Oryginal',frame)\r\n\r\ncv2.imshow('Budynki',resBlue)\r\ncv2.imshow('Tereny zielone',resGreen)\r\ncv2.imwrite('Budynki.jpg',resBlue);\r\ncv2.imwrite('Zielen.jpg',resGreen);\r\n\r\n#cv2.imshow('Zakres szarosci',resGrey)\r\nprint('Obszar ca\u0142ego obrazu: ',height*width\/1000000,'km2')\r\n\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n\r\n<\/pre>\n<p><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki-1024x510.jpg\" alt=\"\" class=\"aligncenter wp-image-432 size-large\" width=\"1024\" height=\"510\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki-1024x510.jpg 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki-300x150.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki-768x383.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki-1536x766.jpg 1536w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki-65x32.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki-225x112.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki-350x174.jpg 350w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Budynki.jpg 1703w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><br \/>\nRysunek 4. Piksele wyodr\u0119bnione dla zabudowa\u0144.<\/p>\n<p><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen.jpg\" alt=\"\" class=\"alignnone wp-image-433 size-full\" width=\"1703\" height=\"849\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen.jpg 1703w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen-300x150.jpg 300w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen-1024x510.jpg 1024w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen-768x383.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen-1536x766.jpg 1536w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen-65x32.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen-225x112.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/Zielelen-350x174.jpg 350w\" sizes=\"(max-width: 1703px) 100vw, 1703px\" \/><br \/>\nRysunek 5. Piksele wyodr\u0119bnione dla teren\u00f3w zielonych.<\/p>\n<p style=\"text-align: justify\">Kolejny przyk\u0142ad wykorzystania system\u00f3w wizyjnych, mo\u017ce dotyczy\u0107 wspomagania zliczania monet. Na rysunku 6 zaprezentowano zdj\u0119cie z kilkoma losowo u\u0142o\u017conymi monetami. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, na nier\u00f3wne do\u015bwietlenie i dobicie \u015bwiat\u0142a. Warto zauwa\u017cy\u0107, \u017ce znajduj\u0105 si\u0119 tam monety o r\u00f3\u017cnej wielko\u015bci. Problem detekcji jest nieco trudniejszy bo wyst\u0119puje tu niejednorodne t\u0142o.<\/p>\n<p>&nbsp;<\/p>\n<p><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-768x1024.jpg\" alt=\"\" class=\"wp-image-444 size-large aligncenter\" width=\"768\" height=\"1024\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-768x1024.jpg 768w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-225x300.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-1152x1536.jpg 1152w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-1536x2048.jpg 1536w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-65x87.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-350x467.jpg 350w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/11-scaled.jpg 1920w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/p>\n<p style=\"text-align: center\">Rysunek 6. Zdj\u0119cie monet.<\/p>\n<p style=\"text-align: justify\">Przyk\u0142ad programu do zliczania, mo\u017ce obejmowa\u0107 przetworzenie wst\u0119pne oraz zastosowanie transformaty Hough&#8217;a do wykrycia okr\u0119g\u00f3w. Na listingu 2 zaprezentowano program do zliczania monet. W proponowanym systemie, wykorzystujemy obraz o ocienianiach szaro\u015bci. Obraz jest skalowany oraz dokonywana jest operacja wyr\u00f3wnania histogramu. W kolejnym kroku wej\u015bciowy obraz poddawany jest operacji rozmycia z wykorzystaniem filtru medianowego. Do detekcji monet wykorzystano transformat\u0119 Hough&#8217;a z odpowiednio dobranymi parametrami. W konsoli program wy\u015bwietla liczb\u0119 wykrytych okr\u0119g\u00f3w (monet).<\/p>\n<p>Listing 2. Program do zliczania monet.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nimport numpy as np\r\n\r\nimg = cv2.imread('11.jpg',0)\r\n\r\nscale = 0.2\r\n\r\nwidth = int(img.shape&#x5b;1] * scale)\r\nheight = int(img.shape&#x5b;0] * scale)\r\ndim = (width, height)\r\n\r\nimg = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)\r\n\r\ncv2.imshow('org',img)\r\n\r\nimg = cv2.equalizeHist(img)\r\ncimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)\r\n\r\nimg = cv2.medianBlur(img, 5)\r\n\r\ncircles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,30,\r\nparam1=50,param2=30,minRadius=20,maxRadius=35)\r\n\r\ncircles = np.uint16(np.around(circles))\r\nfor i in circles&#x5b;0,:]:\r\n   cv2.circle(cimg,(i&#x5b;0],i&#x5b;1]),i&#x5b;2],(0,255,0),2)\r\n   cv2.circle(cimg,(i&#x5b;0],i&#x5b;1]),2,(0,0,255),3)\r\n\r\nprint(len(circles&#x5b;0,:]))\r\n\r\ncv2.imshow('detected circles',cimg)\r\ncv2.imwrite('liczba_monet.jpg',cimg)\r\ncv2.waitKey(0)\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><img src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/liczba_monet.jpg\" alt=\"\" class=\"aligncenter wp-image-447 size-full\" width=\"600\" height=\"800\" srcset=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/liczba_monet.jpg 600w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/liczba_monet-225x300.jpg 225w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/liczba_monet-65x87.jpg 65w, http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/liczba_monet-350x467.jpg 350w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Rysunek 7. Wynik detekcji z wykorzystaniem zaproponowanego algorytmu.<\/p>\n<p style=\"text-align: justify\">Kolejnym przyk\u0142adem systemu b\u0119dzie detekcja koloru na prezentowanej planszy. Zadaniem programu b\u0119dzie ci\u0105g\u0142a akwizycja obrazu z kamery oraz analiza obrazu i zliczenie poszczeg\u00f3lnych sk\u0142adowych kolor\u00f3w R, G, B. Wizualizacja zawarto\u015bci kolor\u00f3w dla poszczeg\u00f3lnych kolor\u00f3w b\u0119dzie wizualizowana z wykorzystaniem wysoko\u015bci s\u0142upk\u00f3w: czerwonego, niebieskiego, zielonego. Na listingu 3 zaprezentowano listing programu do detekcji prezentowanego koloru. Zarejestrowana klatka obrazu jest poddawana prostym operacjom a w efekcie, nast\u0119puje zliczenie poszczeg\u00f3lnych element\u00f3w macierzy. Z wykorzystaniem funkcji split() nast\u0119puje roz\u0142o\u017cenie macierzy na poszczeg\u00f3lne sk\u0142adowe R, B, G obrazu. Wa\u017cnym elementem jest normalizacja zliczonych pikseli. W tym celu, suma dla poszczeg\u00f3lnych sk\u0142adowych pikselu R, G, B jest dzielona przez sum\u0119 dla wszystkich sk\u0142adowych.\u00a0 Dla ka\u017cdej analizowanej klatki wy\u015bwietlany jest prostok\u0105t, kt\u00f3ry reprezentuje sum\u0119 pikseli dla poszczeg\u00f3lnych kolor\u00f3w. Przyk\u0142ad dzia\u0142ania programu zaprezentowano na filmie 1. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, na jako\u015b\u0107 wykrycia koloru oraz zaprezentowany kolor w trakcie zmiany u\u0142o\u017cenia planszy z kolorem. Prosz\u0119 si\u0119 zastanowi\u0107 jakie czynniki mog\u0105 mie\u0107 wp\u0142yw na dzia\u0142anie systemu. Prosz\u0119 uwzgl\u0119dni\u0107, o\u015bwietlenie, odleg\u0142o\u015b\u0107, k\u0105t wzgl\u0119dem kamery i o\u015bwietlenia.<\/p>\n<p>Listing 3. Program do wykrywania koloru.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport cv2\r\nlabels = ('Blue', 'Green', 'Red')\r\nvid = cv2.VideoCapture(0)\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n\r\n   b,g,r = cv2.split(frame);\r\n\r\n   print(b.sum(), g.sum(), r.sum())\r\n\r\n   suma = b.sum()+g.sum()+r.sum()\r\n\r\n   bsuma = (b.sum()*100)\r\n   gsuma = (g.sum()*100)\r\n   rsuma = (r.sum()*100)\r\n\r\n   bsuma = (bsuma\/suma)\r\n   gsuma = (gsuma\/suma)\r\n   rsuma = (rsuma\/suma)\r\n\r\n   frame = cv2.rectangle(frame, (5,100), (205,100), (0, 0, 0), 1)\r\n   frame = cv2.rectangle(frame, (5,100), (55,(100-int(bsuma))), (255, 0, 0), -1)\r\n   frame = cv2.rectangle(frame, (105,100), (155,(100-int(gsuma))), (0, 255, 0), -1)\r\n   frame = cv2.rectangle(frame, (205,100), (255,(100-int(rsuma))), (0, 0, 255), -1)\r\n\r\n    cv2.imshow('frame', frame)\r\n\r\n   if cv2.waitKey(1) &amp;amp; 0xFF == ord('q'):\r\n      break\r\n\r\nvid.release()\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<div style=\"width: 632px;\" class=\"wp-video\"><!--[if lt IE 9]><script>document.createElement('video');<\/script><![endif]--><br \/>\n<video class=\"wp-video-shortcode\" id=\"video-125-1\" width=\"632\" height=\"504\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wykrywanie_koloru.mp4?_=1\" \/><a href=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wykrywanie_koloru.mp4\">http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/wykrywanie_koloru.mp4<\/a><\/video><\/div>\n<p style=\"text-align: center\">Film 1. Przyk\u0142ad dzia\u0142ania systemu do detekcji kolor\u00f3w.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify\">Przyk\u0142adem systemu, kt\u00f3ry w spos\u00f3b automatyczny wykrywa u\u017cytkownika przed komputerem mo\u017ce by\u0107 zastosowanie detekcji twarzy. Opr\u00f3cz wykrycia i wskazania wykrytej twarzy na obrazie, program wzbogacono o informacj\u0119 o czasie wykrycia lub braku wykrycia u\u017cytkownika. Po prostej modyfikacji program, mo\u017ce pe\u0142ni\u0107 rol\u0119 &#8222;liczenia&#8221; czasu uwagi u\u017cytkownika. Ka\u017cde odchylenie g\u0142owy, mo\u017ce oznacza\u0107 mniejsz\u0105 uwag\u0119 u\u017cytkownika. Na listingu 4 zaprezentowano program do detekcji u\u017cytkownika przed ekranem komputera. Do wykrycia twarzy zastosowano klasyfikator Haara&#8217;a. Natomiast najwa\u017cniejszym elementem programu jest warunek wypisania na ekranie godziny oraz informacji o braku lub pojawieniu si\u0119 u\u017cytkownika. Przyk\u0142ad dzia\u0142ania programu zaprezentowano na filmie 2.<\/p>\n<p>Listing 4. Program do detekcji u\u017cytkownika.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\nfrom datetime import datetime\r\n\r\nvid = cv2.VideoCapture(0,cv2.CAP_DSHOW)\r\nfont = cv2.FONT_HERSHEY_SIMPLEX\r\n\r\nface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n\r\n   gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)\r\n\r\n   faces = face_cascade.detectMultiScale(gray, 1.13, 20)\r\n   for (x,y,w,h) in faces:\r\n      cv2.rectangle(frame,(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 = frame&#x5b;y:y+h, x:x+w]\r\n\r\n   if not any(map(len, faces)):\r\n      text = 'Brak uzytkownika, '+datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;)\r\n      cv2.putText(frame,text,(30,30), font, 0.6, (0, 0, 255), 1, cv2.LINE_AA)\r\n   else:\r\n      text = 'Uzytkownik wykryty, '+datetime.now().strftime(&amp;quot;%H:%M:%S&amp;quot;)\r\n      cv2.putText(frame,text,(30,30), font, 0.7, (0, 255, 0), 1, cv2.LINE_AA)\r\n\r\n   cv2.imshow('frame', frame)\r\n\r\n   if cv2.waitKey(1) &amp;amp; 0xFF == ord('q'):\r\n      break\r\n\r\nvid.release()\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<div style=\"width: 632px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-125-2\" width=\"632\" height=\"504\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcj_uzytkownika.mp4?_=2\" \/><a href=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcj_uzytkownika.mp4\">http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/detekcj_uzytkownika.mp4<\/a><\/video><\/div>\n<p style=\"text-align: center\">Film 2. Przyk\u0142ad dzia\u0142ania systemu do detekcji u\u017cytkownika.<\/p>\n<p style=\"text-align: justify\">Wa\u017cnym elementem systemu, mo\u017ce by\u0107 wykrycie pewnych punkt\u00f3w charakterystycznych. W przyk\u0142adzie pos\u0142u\u017cono si\u0119 detekcj\u0105 punkt\u00f3w na obrazie wideo. Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119 na p\u0142ynno\u015b\u0107 detekcji punkt\u00f3w charakterystycznych oraz skuteczno\u015b\u0107 dopasowania punkt\u00f3w. W szczeg\u00f3lno\u015bci istotny jest spos\u00f3b dzia\u0142ania wykrycia\/dopasowania punkt\u00f3w w przypadku wyst\u0119powania obiektu oraz wtedy, gdy obiekt nie wyst\u0119puje. Program do detekcji punkt\u00f3w kluczowych dla p\u0142yty czo\u0142owej multimetru zaprezentowano na listingu 5.<\/p>\n<p>Listing 5. Program do detekcji punkt\u00f3w charakterystycznych.<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n\r\nimport cv2\r\n\r\nvid = cv2.VideoCapture(0,cv2.CAP_DSHOW)\r\nmaxH = 100\r\nimg2 = cv2.imread('multi2.jpg')\r\nscale = 0.2\r\n\r\nwidth = int(img2.shape&#x5b;1] * scale)\r\nheight = int(img2.shape&#x5b;0] * scale)\r\ndim = (width, height)\r\n\r\nimg2 = cv2.resize(img2, dim, interpolation = cv2.INTER_AREA)\r\n\r\nwhile(True):\r\n\r\n   ret, frame = vid.read()\r\n\r\n   orb = cv2.ORB_create()\r\n\r\n   kp1, des1 = orb.detectAndCompute(frame,None)\r\n   kp2, des2 = orb.detectAndCompute(img2,None)\r\n\r\n   bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)\r\n\r\n   matches = bf.match(des1,des2)\r\n   matches = sorted(matches, key = lambda x:x.distance)\r\n\r\n   img3 = cv2.drawMatches(frame,kp1,img2,kp2,matches&#x5b;:5] ,None, flags=2)\r\n\r\n   cv2.imshow('frame', img3)\r\n \r\n   if cv2.waitKey(1) &amp;amp; 0xFF == ord('q'):\r\n      break\r\n\r\nvid.release()\r\ncv2.destroyAllWindows()\r\n\r\n<\/pre>\n<div style=\"width: 896px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-125-3\" width=\"896\" height=\"532\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/punknty_charakterystyczne_multimetr.mp4?_=3\" \/><a href=\"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/punknty_charakterystyczne_multimetr.mp4\">http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-content\/uploads\/sites\/53\/2022\/07\/punknty_charakterystyczne_multimetr.mp4<\/a><\/video><\/div>\n<p style=\"text-align: center\">Film 3. Przyk\u0142ad wykrycia punkt\u00f3w charakterystycznych.<\/p>\n<p style=\"text-align: justify\">Na pocz\u0105tku dzia\u0142ania programu, wczytywany jest obraz prezentuj\u0105cy multimetr. Nast\u0119pnie, dla ka\u017cdej klatki filmu dokonywane jest por\u00f3wnanie punkt\u00f3w kluczowych dla zarejestrowanego przez kamer\u0119 obrazu oraz obrazu zawieraj\u0105cego multimetr. W zadaniu detekcji punkt\u00f3w zastosowano metod\u0119 ORB. W zadaniu dopasowania 10 najlepszych punkt\u00f3w zastosowano funkcj\u0119 BFMatcher(). Prosz\u0119 zwr\u00f3ci\u0107 uwag\u0119, na brak poprawnych dopasowa\u0144 dla pocz\u0105tku zarejestrowanego obrazu oraz na ko\u0144cu zarejestrowanego obrazu.<\/p>\n<p style=\"text-align: justify\">\n","protected":false},"author":49,"menu_order":6,"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\/125"}],"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":37,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/125\/revisions"}],"predecessor-version":[{"id":501,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapters\/125\/revisions\/501"}],"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\/125\/metadata\/"}],"wp:attachment":[{"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/media?parent=125"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/pressbooks\/v2\/chapter-type?post=125"},{"taxonomy":"contributor","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/contributor?post=125"},{"taxonomy":"license","embeddable":true,"href":"http:\/\/pb.ee.pw.edu.pl\/pb\/psw\/wp-json\/wp\/v2\/license?post=125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}