- 1. Operacijos bitais ir maskavimas
- 2. Konvoliucija ir neryškumas
- 3. Galandimas - vaizdas suliejamas atgal
- 4. Threshoding (binarizacija)
- 5. Išsiplėtimas, erozija, atidarymas / uždarymas
- 6. Kraštų aptikimas ir vaizdo gradientai
- 14. Perspektyva ir afinų transformacija
- 8. Tiesioginė eskizo programa
Ankstesnėse pamokose mes sužinojome apie „OpenCV“ ir atlikome keletą pagrindinių vaizdo apdorojimo būdų, o tada kitoje pamokoje „OpenCV“ atlikome keletą manipuliavimo vaizdais, tokių kaip apkarpymas, pasukimas, vaizdo transformavimas ir kt. dar keletas vaizdo manipuliavimo būdų, pavyzdžiui, ir pamokos pabaigoje sukursime „ python-opencv“ programą, kad padarytume tiesioginį eskizą iš internetinės kameros tiesioginio tiekimo. Ši programa naudos daugelį vaizdo apdorojimo funkcijų, kurias mes išmokome iki šiol arba išmoksime šioje pamokoje, todėl tai bus geras praktinis pavyzdys, apimantis visas funkcijas.
Kaip buvo pasakyta ankstesnėje pamokoje, „ OpenCV“ yra „Open Source Commuter Vision Library“, 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.
Šioje pamokoje pamatysime dar keletą manipuliavimo vaizdais, naudojant „Python OpenCV“. Čia mes išmoksime pritaikyti šią funkciją paveikslėlyje naudojant „Python OpenCV“:
- Operacijos bitais ir maskavimas
- Konvoliucija ir neryškumas
- Galandimas - vaizdas suliejamas atgal
- Ribinė vertė (binarizacija)
- Išsiplėtimas, erozija, atidarymas / uždarymas
- Kraštų aptikimas ir vaizdo gradientai
- Perspektyva ir afinų transformacija
- Tiesioginė eskizo programa
1. Operacijos bitais ir maskavimas
„Bitwise“ operacijos padeda užmaskuoti vaizdus ir sukurti keletą paprastų vaizdų.
Padaryti kvadratą
importuoti cv2 import numerį kaip np # mes naudojame tik du matmenis, nes tai yra pilkos spalvos vaizdas, jei mes naudojome # spalvotą vaizdą, tada mes naudojome stačiakampį = np.zeros ((300,300,3), np.uint8) # Kvadrato kvadrato sudarymas = np.zeros ((300,300), np.uint8) cv2.statiakampis (kvadratas, (50,50), (250,250), 255, -1) cv2.imshow ("kvadratas", kvadratas) cv2. waitkey (0)
Elipsės padarymas
elipsė = np.zeros ((300,300), np.uint8) cv2.ellipse (elipsė, (150,150), (150,150), 30,0,180,255, -1) cv2.imshow ("elipsė", elipsė) cv2.waitKey (0)
Eksperimentuoti su bitų operacijomis
#AND_ rodo tik ten, kur susikerta
BitwiseAND = cv2.bitwise_and (kvadratas, elipsė) cv2.imshow ("AND", BitwiseAND) cv2.waitKey (0)
#OR_ rodo tik ten, kur yra kvadratas arba elipsė
BitwiseOR = cv2.bitwise_or (kvadratas, elipsė) cv2.imshow ("OR", BitwiseOR) cv2.waitKey (0)
#XOR_shows tik ten, kur kuri nors iš jų egzistuoja savaime
BitwiseXOR = cv2.bitwise_xor (kvadratas, elipsė) cv2.imshow ("XOR", BitwiseXOR) cv2.waitKey (0)
#NOT_ rodo viską, kas nėra elipsės dalis, o operacija NĖRA gali būti taikoma tik vienai figūrai
BitwiseNOT_elp = cv2.bitwise_not (elipsė) cv2.imshow ("NOT_ellipse", BitwiseNOT_elp) cv2.waitKey (0) cv2.destroyAllWindows ()
2. Konvoliucija ir neryškumas
Sąsūkos yra matematinis operacija atliekama dviejų funkcijų gaminančių trečiąją funkciją, kuri paprastai yra modifikuota versija originalaus funkcija.
Išvesties vaizdas = vaizdas Funkcija Branduolio dydis
Be kompiuterio viziją mes naudojame branduolys yra nurodyti dydį, per kurį mes paleisti mūsų manipuliuoti funkciją per mūsų įvaizdį.
Neryškumas yra operacija, kurios metu mes apskaičiuojame taško vidurkį regione (branduolys)
„OpenCV“ sulieja vaizdą taikydama branduolius, o branduolys nurodo, kaip pakeisti bet kurio taško vertę, derinant jį su skirtingu gretimų taškų kiekiu, kurį branduolys pritaiko kiekvienam vaizdo taškui po vieną, kad gautų galutinį vaizdą.
Paprasčiau tariant, vaizdo konvoliucija yra paprasčiausias elementas, pagrįstas dviejų matricų dauginimu, po kurio eina suma.
Mes paprasčiausiai galime tai suprasti iš šio pavyzdžio.
Aukščiau yra 3X3 branduolys.
Mes padauginame iš 1/25, kad normalizuotume, ty sumą iki 1 mes padidinome arba sumažinome intensyvumą, kaip ir ryškinant ar tamsinant vaizdus.
Leiskite testas OpenCV nyksta metodas filter2D, atsižvelgiant į funkciją cv2.filter2D (vaizdo, -1, branduolio)
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
# 3x3 branduolio matricos sukūrimas
branduolys_3x3 = np.ones ((3,3), np. float32) / 9
# mes naudojame cv2.filter2D norėdami sujungti branduolį su vaizdu
neryškus = cv2.filter2D (image, -1, branduolys_3x3) cv2.imshow ('3x3_blurring', neryškus) cv2.waitKey (0)
# 7x7 branduolio matricos sukūrimas
branduolio_7x7 = np.ones ((7,7), np. float32) / 49
# mes naudojame cv2.filter2D norėdami sujungti branduolį su vaizdu
neryškus = cv2.filter2D (image, -1, branduolio_7x7) cv2.imshow ('7x7_blurring', neryškus) cv2.waitKey (0) cv2.destroyAllWindows ()
Yra ir kitų rūšių neryškių metodų:
cv2.blur - Vidutinė reikšmė nurodytame lange.
cv2.GaussianBlur - Panašus, bet naudojamas Gauso langas (didesnis dėmesys skiriamas taškams aplink centrą).
cv2.medianBlur– naudoja visų lango elementų medianą.
cv2.bilateralFilter - sulieja, o kraštai laikomi aštrūs, išsaugomos kraštai ir linijos detalės.
Mes pamatysime po vieną, pirmiausia parodykite originalų vaizdą naudodami žemiau esantį kodą:
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
cv2.blur:
Taikant šį metodą, vidutinis įvertinimas atliekamas susukant vaizdą su normalizuotu langelio filtru. Tai užima vietą po langeliu ir pakeičia centrinį elementą. Čia dėžutės dydis turi būti nelyginis ir teigiamas .
# cv2.blur blur = cv2.blur (image, (3,3)) cv2.imshow ('Vidurkinimas', suliejimas) cv2.waitKey (0)
cv2. „Gaussian Blur“:
# cv2.GaussianBlur # vietoj langelio filtro, pabandykime Gauso branduolį Gaussian = cv2.GaussianBlur (vaizdas, (7,7), 0) cv2.imshow ('Gaussian bluraling', Gaussian) cv2.waitKey (0)
cv2.medianBlur:
Ji užima visų pikselių, esančių po branduolio sritimi, mediana, o centrinis elementas pakeičiamas šia mediana.
# cv2.medianBlur # užima visų taškų, esančių po branduolio sritimi, ir centrinio elemento # mediana pakeista šia mediana. mediana = cv2.medianBlur (vaizdas, 5) cv2.imshow ("mediana suliejimo", mediana) cv2.waitKey (0)
cv2.bilateralFilter:
Dvišalis yra labai efektyvus pašalinant triukšmą, tuo pačiu išlaikant aštrius kraštus
# cv2.bilateralFilter #Bilateral yra labai efektyvus šalinant triukšmą, tuo pačiu išlaikant kraštus aštrus = cv2.bilateralFilter (vaizdas, 9,75,75) cv2.imshow ('dvišalis neryškus', dvišalis) cv2.waitKey (0) cv2. destrAllWindows ()
Vaizdas „ne-triukšmingas-ne lokalus“ reiškia „denoising“
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
#parameter po Nėra filtro stiprumo „h“ (5–10 yra geras diapazonas) # next yra h spalvų komponentams, vėl nustatykite tą pačią reikšmę kaip h
dst = cv2.fastNlMeansDenoisingColored (image, None, 6,6,7,21) cv2.imshow ('Greitas reiškia denois', dst) cv2.waitKey (0) cv2.destroyAllWindows ()
Yra 4 nevietinių priemonių, skirtų nuobodžiavimui, variacijos
cv2.fastNlMeansDenoising () - vienam pilkos skalės vaizdui
cv2.fastNlMeansDenoisingColored () - vienspalvis vaizdas
cv2.fastNlmeansDenoisingMulti () - skirta vaizdų sekos pilkoms skalėms
cv2.fastNlmeansDenoisingcoloredMulti () - skirta spalvotai vaizdų sekai
3. Galandimas - vaizdas suliejamas atgal
Galandimas yra priešingas neryškumui, jis sustiprina arba pabrėžia vaizdo kraštus.
Branduolys =,,
Mūsų branduolio matrica yra lygi vienai, todėl nereikia normalizuoti (ty padauginti iš koeficiento iki tokio paties ryškumo kaip ir originalo), jei branduolys nebus normalizuotas iki 1, vaizdas būtų ryškesnis arba tamsesnis.
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('elephant.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
branduolio_aštrinimas = np.array (,
])
#pritaikyti galandimo branduolį įvesties vaizdui
sharpened = cv2.filter2D (image, -1, kernel_sharpening) cv2.imshow ('paryškintas vaizdas', užaštrintas) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Threshoding (binarizacija)
Ribinė vertė yra vaizdo pavertimas dvejetainiu pavidalu. „Opencv“ yra atskira ribavimo funkcija, apibrėžta kaip
Cv2.threshold (vaizdas, slenksčio vertė, maksimali vertė, slenksčio tipas)
Yra šie slenksčio tipai:
- cv2.THRESH_BINARY - dažniausiai
- cv2. THRESH_BINARY_INV - dažniausiai
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2. THRESH_TOZERO_INV
PASTABA: prieš slenkstį reikia konvertuoti vaizdą į pilkos spalvos skalę
importuoti cv2 importuoti numerį kaip np #load image as grayscale image = cv2.imread ('gradient.jpg', 0) cv2.imshow ('original', image) cv2.waitKey (0)
# reikšmė žemiau 127 eina į 0 (juoda), o virš 127 eina į 255 (balta)
_, thresh1 = cv2.threshold (vaizdas, 127,255, cv2.THRESH_BINARY) cv2.imshow ('1 slenkstis', thresh1) cv2.waitKey (0)
# reikšmė žemiau 127 eina į 255, o vertės, viršijančios 127, bus 0 (atvirkštinė viršuje)
_, thresh2 = cv2.threshold (vaizdas, 127,255, cv2.THRESH_BINARY_INV) cv2.imshow ('2 slenkstis', thresh2) cv2.waitKey (0)
# reikšmė virš 127 yra sutrumpinta (laikoma) ties 127, argumentas 255 nenaudojamas.
_, thresh3 = cv2.threshold (vaizdas, 127,255, cv2.THRESH_TRUNC) cv2.imshow ('3 thresh trunc ', thresh3) cv2.waitKey (0)
# reikšmės žemiau 127 eina į 0, virš 127 nesikeičia
_, thresh4 = cv2.threshold (vaizdas, 127,255, cv2.THRESH_TOZERO) cv2.imshow ('4 slenkstis', thresh4) cv2.waitKey (0)
#Revesrse iš aukščiau, žemiau 127 nepakinta, virš 127 eina į nulį
_, thresh5 = cv2.threshold (vaizdas, 127,255, cv2.THRESH_TOZERO_INV) cv2.imshow ('5 slenkstis', thresh5) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Išsiplėtimas, erozija, atidarymas / uždarymas
Tai yra operacijos matematinės morfologijos srityje
Išsiplėtimas - prideda taškų prie objekto ribų paveikslėlyje.
Erozija - pašalina taškus prie objekto ribų paveikslėlyje.
Atidarymas - erozija, po kurios išsiplėtimas.
Uždarymas - išsiplėtimas ir erozija.
Atidarymas labai padeda atbaidyti vaizdus, nes jis pirmiausia suplonina vaizdą erozijos būdu (pašalina triukšmą), o po to išsiplečia.
Sumišimas su išsiplėtimu ir erozija
Kartais yra painiojama tarp išsiplėtimo ir erozijos dažniausiai paveikslėliuose su baltu fonu, nes „Opencv“ baltąjį foną laiko vaizdu, kuris turi būti išsiplėtęs arba pažeistas, o ne originalus, todėl šiuo atveju erozija veikia kaip išsiplėtimas ir atvirkščiai, kaip parodyta paveikslėlio pavyzdyje nurodyta apačioje.
Atminkite, kad išsiplėtimas prideda taškų prie objekto ribų paveikslėlyje, o „ Erozija“ pašalina taškus prie objekto ribų paveikslėlyje
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('imagecv.png', 0) cv2.imshow ('originalas', paveikslėlis) cv2.waitKey (0)
#Erosija
# apibrėžkime savo branduolio dydį
branduolys = np.ones ((5,5), np.uint8)
#dabar naikiname vaizdą, čia kartojimas nėra tas laikas, kai norite ištrinti vaizdą
erozija = cv2.erode (vaizdas, branduolys, iteracijos = 1) cv2.imshow ('Erozija', erozija) cv2.waitKey (0)
# išsiplėtimas
išsiplėtimas = cv2.dilate (vaizdas, branduolys, iteracijos = 1) cv2.imshow ('išsiplėtimas', išsiplėtimas) cv2.waitKey (0)
#opening, gerai pašalina triukšmą
atidarymas = cv2.morphologyEx (vaizdas, cv2.MORPH_OPEN, branduolys) cv2.imshow ('atidarymas', atidarymas) cv2.waitKey (0)
#closing, gerai pašalina triukšmą
uždarymas = cv2.morphologyEx (vaizdas, cv2.MORPH_CLOSE, branduolys) cv2.imshow ('uždarymas', uždarymas) cv2.waitKey (0) cv2.destroyAllWindows ()
6. Kraštų aptikimas ir vaizdo gradientai
Briaunų aptikimas yra labai svarbi kompiuterio matymo sritis, ypač dirbant su kontūrais.
Briaunos gali būti apibrėžiamos kaip vaizdo ribos, iš tikrųjų tai yra kraštai, kurie apibrėžia objektą vaizduose ir išsaugo daug informacijos apie vaizdą.
Formaliai kraštai gali būti apibrėžti kaip staigūs paveikslėlio pokyčiai (nutrūkimai) ir jie gali užkoduoti tiek informacijos, kiek taškų.
Aukščiau pateiktame paveikslėlyje parodyta, kaip kompiuterio matymas atpažįsta ir atpažįsta vaizdą.
Kraštų aptikimo algoritmai: - Yra trys pagrindiniai kraštų aptikimo algoritmų tipai
- Sobel - pabrėžti vertikalius ar horizontalius vaizdus.
- Laplacianas - optimalus dėl mažo klaidų lygio, gerai apibrėžtų kraštų ir tikslaus aptikimo.
- „Canny Edge“ aptikimo algoritmas (perduotas john.F. Canny 1986 m.)
1. Taiko Gauso neryškumą
2. Randa vaizdo intensyvumo gradientą
3. taiko ne maksimalų slopinimą (ty pašalina taškus, kurie nėra kraštai).
4. Histerezė taiko slenkstį (ty jei pikselis yra viršutinės ir apatinės ribos ribose, jis laikomas kraštu)
importuoti cv2 importuoti numerį kaip np image = cv2.imread ('input.jpg', 0) aukštis, plotis = image.shape
#sobel
# išgauti sobelio kraštus
sobel_x = cv2.Sobel (image, cv2.CV_64F, 0,1, ksize = 5) sobel_y = cv2.Sobel (image, cv2.CV_64F, 1,0, ksize = 5) cv2.imshow ('originalus', vaizdas) cv2.waitKey (0) cv2.imshow ('sobelx', sobel_x) cv2.waitKey (0)
#Sobely
cv2.imshow ('sobly', sobel_y) cv2.waitKey (0)
sobel_OR = cv2.bitwise_or (sobel_x, sobel_y) cv2.imshow ('sobelOR', sobel_OR) cv2.waitKey (0)
#laplaian
laplacian = cv2.Laplacian (vaizdas, cv2.CV_64F) cv2.imshow ('Laplacian', laplacian) cv2.waitKey (0)
# canny krašto aptikimo algoritmas naudoja slenksčio reikšmes kaip
slenksčius.
#bet koks gradientas didesnis už 2 slenkstį, laikomas kraštu.
# bet koks gradientas, didesnis už 1 slenkstį, nėra kraštas.
# vertės tarp 1 ir 2 slenksčių yra kaip kraštinės arba ne kraštinės
# apie tai, kaip jų intensyvumas yra sujungtas, šiuo atveju bet kuri vertė, mažesnė nei 60, yra laikoma
# kraštės, o bet kuri vertė, viršijanti 120, laikoma kraštais.
canny = cv2.Canny (image, 60,120) cv2.imshow ('canny', canny ) cv2.waitKey (0) cv2.destroyAllWindows ()
14. Perspektyva ir afinų transformacija
Pažvelkime į žingsnį atgal ir pažvelkime į afinines ir ne afinines transformacijas. Žemiau pateiktas originalus vaizdas aiškiai nėra affininis vaizdas, nes kraštai tam tikru metu susitiks, tačiau mes galime jį ištiesinti iškreipdami ir atsižvelgdami į perspektyvą transformuotis.
Šiai perspektyvinei transformacijai mums reikia keturių pradinio vaizdo koordinačių ir keturių išvesties vaizdo taškų, jie žymimi taškais_A ir taškais_B. Pirmiausia šių taškų pagalba apskaičiuojame transformacijos matricą M naudodamiesi funkcija getPerspectiveTransform.
Tada ši matrica suteikiama funkcijai „ warpPerspective“, kad būtų sukurta galutinė išvestis.
Dabar tegul pirmiausia pabandykite perspektyva transformuoti.
importuoti cv2 import numerį kaip np importuoti matplotlib.pyplot kaip plt image = cv2.imread ('paper.jpg') cv2.imshow ('original', image) cv2.waitKey (0)
# 4 originalaus vaizdo kampų koordinatė
taškai_A = np.flot32 (,,,])
# 4 norimos išvesties kampų
koordinatės # mes naudojame A4 formato popieriaus santykį 1: 1,41
taškai_B = np.flot32 (,,,])
# naudokite du dviejų taškų rinkinius, kad apskaičiuotumėte numatomą transformacijos matricą M
M = cv2.getPerspectiveTransform (points_A, points_B) warped = cv2.warpPerspective (image, M, (420 594)) cv2.imshow ('warpprespective', warped ) cv2.waitKey (0) cv2.destroyAllWindows ()
Afino transformacija yra lengvesnė nei ne afininė transformacija, nes mums reikia tik trijų taškų, kad gautume transformaciją. Visas procesas vyksta tuo pačiu, bet vietoj perspektyvinės transformacijos mes turime afininę transformaciją, taip pat mes nustatome stulpelius ir eilutes WarpAffine iš formos funkcijos, o ne rankiniu būdu.
importuoti cv2 import numerį kaip np importuoti matplotlib.pyplot kaip plt image = cv2.imread ('box.jpg') eilutes, cols = image.shape cv2.imshow ('original', image) cv2.waitKey (0)
# 3 originalaus vaizdo kampų koordinatė
taškai_A = np.flot32 (,,])
# 3 norimo išvesties kampų
koordinatės # mes naudojame A4 formato popieriaus santykį 1: 1,41
taškai_B = np.flot32 (,,])
# naudokite du dviejų taškų rinkinius, kad apskaičiuotumėte „Affine“
# transformacijos matricą M
M = cv2.getAffineTransform (taškai_A, taškai_B) iškreipti = cv2.warpAffine (vaizdas, M, (stulpeliai, eilutės)) cv2.imshow ('warpaffine', iškreipti) cv2.waitKey (0) cv2.destroyAllWindows ()
8. Tiesioginė eskizo programa
Pirmiausia pasveikinkite, kad sukūrėte šį mini projektą perskaitę visas aukščiau pateiktas manipuliavimo vaizdais funkcijas. Taigi šiame mini „Python OpenCV“ projekte mes išmoksime keletą naujų kilpų ir funkcijų sąvokų. Jei esate susipažinę su programavimu, turite turėti platesnę idėją apie funkciją ir kilpas. Tačiau pitone pagrindinė kilpų ir funkcijų samprata išlieka ta pati, tačiau jų apibrėžimo metodas šiek tiek keičiasi.
Taigi šios programos pradžioje galime pamatyti tam tikrą teiginių grupę, pavadintą „ def eskizas (vaizdas)“: tai yra oficialus funkcijos apibrėžimas, kai teiginių grupė dirba kartu tam tikram išėjimui.
Taigi šis eskizas yra funkcija, pitone funkciją apibrėžia „def“ ir baigia „:“ ženklas. Taip pat teiginiai, kurie turi būti funkcijos viduje, arba galite pasakyti, kurie reikalingi, kad funkcija tinkamai veiktų, yra automatiškai sulyginti su funkcija. Taigi, norint išeiti iš funkcijų, teiginius reikėjo visiškai sulygiuoti. Norėdami sužinoti daugiau apie tai, kaip funkcijos yra apibrėžtos „Python“, ieškokite „Google“.
Taigi šioje eskizo funkcijoje mes įvedėme kelis vaizdo apdorojimo sluoksnius, kurie sujungiami kartu, kad gautų išvestį. Pirma, vaizdas konvertuojamas į pilkos spalvos skalę, kad opencv galėtų lengvai jį apdoroti, o tada pilkos skalės vaizdui pritaikomas Gauso suliejimas, kad sumažėtų triukšmas. Tada kraštai išgaunami naudojant „canny“ krašto aptikimo algoritmą, tada krašto apibrėžtame paveikslėlyje taikoma dvejetainė atvirkštinė, čia dvejetainę atvirkštinę taip pat galėtų atlikti bitiškai_NOT, bet mes sąmoningai pasirinkome šią slenkstinę dvejetainę atvirkštinę, nes tai suteikia laisvę nustatyti jo parametrus, kol gausime aiškų vaizdą.
Taip pat reikia atkreipti dėmesį į tai, kad funkcija perima argumentų vaizdą ir grąžina du argumentus. Nors retas yra Būlio sakinys, kad funkcija sėkmingai vykdoma, ar ne, o kaukė yra galutinis funkcijos rezultatas, ty apdorotas vaizdas.
Tada antroji koncepcija yra internetinės kameros veikimas „opencv“ režime, kurį atlieka „ cv2“. „VideoCapture“ (0) funkcija saugo vaizdą objekto dangtelyje, kurį dangtelį galima perskaityti naudojant funkciją cap.read () , taip pat čia, kad atkreiptumėte dėmesį į tą dangtelį. „read ()“ yra begalinio ciklo viduje, nes jis nuolat turėjo užfiksuoti vaizdus, kad suteiktų tiesioginio vaizdo pojūtį, kur vaizdo įrašo kadrų dažnis atitiktų jūsų internetinės kameros kadrų dažnį, kuris dažniausiai yra nuo 24 iki 60 fps.
cap.read () grąžina ret ir kadrą, kur ret yra loginė reikšmė, nurodanti, kad funkcija sėkmingai vykdyta, ar ne, o kadre yra internetinės kameros padarytas vaizdas.
Žemiau yra visas „Python OpenCV“ kodas, skirtas „Live Sketch“ paleisti
importuoti cv2 import numerį kaip np #sketch generuojanti funkcija def eskizas (paveikslėlis): #convert image to grayscale img_gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) #valyti vaizdą naudojant Gauso suliejimą img_gray_blur = cv2.GaussianBlur (5,5), 0) #extract edge canny_edges = cv2.Canny (img_gray_blur, 10,70) #daryti inverterį binarizuokite vaizdą ret, mask = cv2.threshold (canny_edges, 70,255, cv2.THRESH_BINARY_INV) grąžinimo kaukė #initialize webcam, dangtelis yra objektas pateikė vaizdo fiksavimo #it yra Būlio nurodant, ar jis buvo sėkmingas (RET) # it taip pat yra vaizdai, surinkti iš internetinės kameros (rėmelio) dangtelio = cv2. „VideoCapture“ (0), o „True“: „ ret“, „frame“ = „cap.read“ ) „cv2.imshow“ („livesketcher“, eskizas (rėmelis)), jei cv2.waitKey (1) == 13: # 13 yra raktų pertrauka # paleiskite fotoaparatą ir uždarykite langą, nepamirškite atleisti internetinės kameros naudodamiesi cap.release () cap.release () cv2.destroyAllWindows ()
Taigi tai yra „Python-OpenCV“ vaizdo manipuliavimo 2 dalies pabaiga. Norėdami gerai suprasti kompiuterio matymą ir „OpenCV“, perskaitykite ankstesnius straipsnius („Pradedant naudoti„ Python OpenCV “ir„ Vaizdo manipuliacijos „Python OpenCV“ (1 dalis)) ir galėsite sukurti ką nors šaunaus naudodami „Computer Vision“.