Pradėjome nuo „OpenCV“ pagrindų mokymosi, tada atlikome keletą pagrindinių vaizdų apdorojimo ir manipuliavimo paveikslėliais, o po to - vaizdų segmentus ir daugelį kitų operacijų naudodami „OpenCV“ ir „python“ kalbą. Čia, šiame skyriuje, atliksime keletą paprastų objektų aptikimo būdų, naudodami šablonų derinimą. Mes atvaizde rasime daiktą, tada apibūdinsime jo ypatybes. Funkcijos yra bendri vaizdo atributai, tokie kaip kampai, kraštai ir pan. Taip pat apžvelgsime keletą įprastų ir populiarių objektų aptikimo algoritmų, tokių kaip SIFT, SURF, FAST, BREIF ir ORB.
Kaip buvo pasakyta ankstesnėse pamokose, „ OpenCV“ yra „Open Source Commuter Vision“ biblioteka, turinti C ++, Python ir Java sąsajas ir palaikanti „Windows“, „Linux“, „Mac OS“, „iOS“ ir „Android“. Taigi jį galima lengvai įdiegti į „Raspberry Pi“ su „Python“ ir „Linux“ aplinka. „Raspberry Pi“ su „OpenCV“ ir prijungta kamera gali būti naudojama kuriant daugybę realaus laiko vaizdo apdorojimo programų, tokių kaip veido aptikimas, veido užraktas, objektų sekimas, automobilio numerių aptikimas, namų apsaugos sistema ir kt.
Objektų aptikimas ir atpažinimas yra svarbiausias kompiuterio matymo atvejis, jie naudojami tokiems galingiems dalykams kaip
- Scenų ženklinimas etiketėmis
- Robotų navigacija
- Savaeigiai automobiliai
- Kūno atpažinimas („Microsoft Kinect“)
- Liga ir vėžio nustatymas
- Veido atpažinimas
- Rašysenos atpažinimas
- Palydovinių vaizdų objektų atpažinimas
Objekto aptikimas VS atpažinimas
Objektų atpažinimas yra antrasis objektų aptikimo lygis, kai kompiuteris gali atpažinti objektą iš kelių paveikslėlyje esančių objektų ir galbūt jį atpažinti.
Dabar atliksime kai kurias vaizdo apdorojimo funkcijas, kad rastume objektą iš paveikslėlio.
Objekto radimas iš atvaizdo
Čia mes naudosime šablonų atitikimą ieškodami simbolio / objekto vaizde, naudokite OpenCV funkciją cv2.matchTemplate () , kad rastumėte tą objektą
import cv2 import numerį kaip np
Įkelkite įvesties vaizdą ir paverskite jį pilka
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('people', image) cv2.waitKey (0) grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Įkelkite šablono vaizdą
template = cv2.imread ('waldo.jpg', 0) # objekto šablono atitikimo virš vaizdo rezultatas rezultatas = cv2.matchTemplate (pilka, šablonas, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (rezultatas)
Sukurti ribojimo langelį
top_left = max_loc #increasing kad ribojančios stačiakampio dydį 50 taškų bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (vaizdo, top_left, bottom_right, (0,255,0), 5) cv2.imshow ("objektas rasta ', paveikslėlis) cv2.waitKey (0) cv2.destroyAllWindows ()
„ Cv2.matchTemplate“ (pilka, šablonas, cv2.TM_CCOEFF) įveskite pilkos skalės vaizdą, kad rastumėte objektą ir šabloną. Tada pritaikykite šablonų atitikimo metodą ieškodami objektų iš paveikslėlio, čia naudojamas cv2.TM_CCOEFF .
Visa funkcija pateikia masyvą, kuris įvedamas kaip rezultatas, kuris yra šablonų atitikimo procedūros rezultatas.
Tada mes naudojame cv2.minMaxLoc (rezultatas) , kuris nurodo koordinates arba ribojančią langelį, kuriame atvaizde rastas objektas, o kai gausime tas koordinates, nubrėžkite stačiakampį ir ištempkite šiek tiek langelio matmenų, kad objektas gali lengvai tilpti stačiakampio viduje.
Šablonų atitikimui atlikti yra įvairių būdų, ir šiuo atveju mes naudojame cv2.TM_CCOEFF, kuris reiškia koreliacijos koeficientą.
Čia pagrindiniai taškai yra (X, Y) koordinatės, išgaunamos naudojant sijojimo detektorių ir nubrėžtos per vaizdą naudojant „cv2 draw keypoint“ funkciją.
SURF
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('paris.jpg') pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)
Sukurkite SURF funkcijų detektoriaus objektą, čia mes nustatome 500 Heseno slenkstį
surf = cv2.xfeatures2d.SURF_create (500) keypoints , deskriptors = surf.detectAndCompute (grey, None) print (" Aptiktų raktinių taškų skaičius:", len (keypoints))
Ant įvesties vaizdo atkreipkite turtingus pagrindinius taškus
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - SURF', image) cv2.waitKey () cv2.destroyAllWindows ()
Pulto išvestis:
GREITAS
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('paris.jpg') pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)
Sukurkite greitojo detektoriaus objektą
fast = cv2.FastFeatureDetector_create () # Gauti pagrindinius taškus, pagal numatytuosius nustatymus ne maks. slopinimas yra Įjungtas #, kad išjungtumėte nustatytus fast.setBool ('nonmaxSuppression', False) raktinius taškus = fast.detect (pilka, Nėra) spausdinimo (" Raktinių taškų skaičius") Aptikta: ", len (pagrindiniai taškai))
Ant įvesties vaizdo atkreipkite turtingus pagrindinius taškus
image = cv2.drawKeypoints (paveikslėlis, raktiniai taškai, Nėra, vėliavos = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow („Funkcijos metodas - FAST“, vaizdas) cv2.waitKey () cv2.destroyAllWindows ()
Pulto išvestis:
TRUMPAS
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('paris.jpg') pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)
Sukurkite FAST detektoriaus objektą
trumpas = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Sukurkite TRUMPĄ ištraukimo objektą
#brief = cv2.DescriptorExtractor_create ("TRUMPAS") # Nustatykite pagrindinius taškus raktiniai taškai = fast.detect (pilka, Nėra)
Gaukite trumpus aprašus ir naujus pagrindinius taškus naudodami TRUMPAI
keypoints, deskriptors = brief.compute (pilka, keypoints) spausdinti (" Aptiktų raktinių taškų skaičius:", len (keypoints))
Ant įvesties vaizdo atkreipkite turtingus pagrindinius taškus
image = cv2.drawKeypoints (paveikslėlis, raktiniai taškai, Nėra, vėliavos = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow („Funkcijos metodas - TRUMPAS “, vaizdas) cv2.waitKey () cv2.destroyAllWindows ()
Pulto išvestis:
ORB
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('paris.jpg') pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)
Sukurkite ORB objektą, mes galime nurodyti norimų pagrindinių taškų skaičių
orb = cv2.ORB_create () # Nustatykite pagrindinius taškus keypoints = orb.detect (pilka, Nėra)
Gaukite aprašus
keypoints, descriptors = orb.compute (pilka, keypoints) spausdinti (" Aptiktų raktinių taškų skaičius:", len (keypoints))
Ant įvesties vaizdo atkreipkite turtingus pagrindinius taškus
image = cv2.drawKeypoints (paveikslėlis, raktiniai taškai, Nėra, vėliavos = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Funkcijos metodas - ORB', vaizdas) cv2.waitKey () cv2.destroyAllWindows ()
Pulto išvestis:
Galime nurodyti pagrindinių taškų skaičių, kurio maksimali riba yra 5000, tačiau numatytoji reikšmė yra 500, ty ORB automatiškai aptiktų geriausius 500 pagrindinių taškų, jei nenurodyta nė vienai pagrindinių taškų vertei.
Taigi objektų aptikimas vyksta „OpenCV“. Tos pačios programos taip pat gali būti vykdomos „OpenCV“ įdiegtoje „Raspberry Pi“ ir gali būti naudojamos kaip nešiojamasis įrenginys, pavyzdžiui, išmanieji telefonai su „Google Lens“.
Šis straipsnis pateiktas iš Rajeev Ratan sukurto „Master Computer Vision ™ OpenCV4“ programoje „Python“ su gilaus mokymosi „Udemy“ kursu. Prenumeruokite jį, kad sužinotumėte daugiau apie „Computer Vision“ ir „Python“.