PILDID
Eelmises peatükis õppisime, mis see pilt täpsemalt on. Selles peatükis käsitleme Python OpenCV teegi funktsioone piltidega.
Selles peatükis käsitletud funktsioonid:
- pildi lugemine
- pildi kuvamine
- pildi salvestamine
- pildi lõikamine
- pildile kujundite joonestamine
ALLALAADIMISLINK: -> LAE FAILID ALLA
Pildi lugemine
Pildi lugemiseks kasutage cv2.imread() funktsiooni. See funktsioon tagastab pildi andmed.
NB! Pidage meeles, et vajalik on ka OpenCV mooduli importimine.
import cv2
Funktsiooni süntaks
cv2.imread(failinimi, värv)
- failinimi - faili asukoht
- värv - millise värvina peab arvuti pilti lugema. Peamiselt nende valikute seas on kas värviline pilt või must-valge pilt.
Osade algoritmid oskavad ainult must-valgeid pilte analüüsida, sellepärast on vahepeal vajalik osata pilte lugeda ka teisiti sisse.
cv2.IMREAD_COLOR - värviline pilt cv2.IMREAD_GRAYSCALE - must-valge pilt
Näide:
pildi_asukoht = "pilt.jpg" pilt = cv2.imread(pildi_asukoht) cv2.imshow(pilt)
Kontrolli, kas pilt laeti edukalt:
if pilt is None:
print("Pilti ei õnnestunud laadida.")
else:
print("Pilt laaditi edukalt.")
Pildi kuvamine
Pildi kuvamiseks kasutada cv2.imshow() funktsiooni. See funktsioon avab akna ja kuvab pildi.
Funktsiooni süntaks
cv2.imshow(akna nimi, pilt)
- parameetrid: akna nimi - annab kuvatud aknale nimetuse
- pilt - pildifail, mida kuvatakse. Eelnevalt tuleks see sisse lugeda kasutades
cv2.imread()käsku.
cv2.imshow("Laetud pilt", pilt)
cv2.waitKey(0)
cv2.destroyAllWindows()
Samuti pea silmas, et waitKey(0) ja destroyAllWindows() funktsioonid ootavad, kuni kasutaja mõnda nuppu vajutab ja avatud akna seejärel kustutab.
Pildi salvestamine
Funktsiooni cv2.imwrite() kasutamine pildi salvestamiseks on sama lihtne kui pildi lugemine OpenCV-s. Selle funktsiooni kasutamiseks on vaja kahte argumenti. Esimene argument on failinimi, teine argument on pildiobjekt.
Funktsioon imwrite salvestab pildi määratud faili. Pildiformaat valitakse failinime laiendi põhjal (vt cv::imread loendit laienditest).
Funktsiooni süntaks:
salvestatav_aadress = "näide_pilt.jpg" cv2.imwrite(salvestatav_aadress, pilt)
Pidi salvestamisele uuele aadressile võib tulevikus eeldada pildi töötlemine.
Kogu kood:
import cv2
pildi_asukoht = "pilt.jpg"
pilt = cv2.imread(pildi_asukoht)
print(cv2._version_)
if pilt is None:
print("Pilti ei õnnestunud laadida.")
else:
print("Pilt laaditi edukalt.")
cv2.imshow("Laetud pilt", pilt)
cv2.waitKey(0)
cv2.destroyAllWindows()
salvestatav_aadress = "näide_pilt.jpg"
cv2.imwrite(salvestatav_aadress, pilt)
Pilti kärpimine
Kärpimine on pildi ebavajalike piirkondade eemaldamine. Arvutinägemises kasutatakse piltide kärpimist pildi huvipiirkonna täpsustamiseks. Näiteks, kui soovitakse auto pardaarvuti pildist jälgida autoteed, siis on mõistlik kärpida videolt ära piirkonnad, kus kindlasti autoteed ei esine.

Funktsiooni süntaks:
kärbitud_pilt = pilt[x1:x2,y1:y2]
Kus x1 ja x2 on vertikaalsed koordinaadid ning y1 ja y2 horisontaalsed.
Proovime pilti kärpida nii, et jääks ainult alumine osa pildist alles. auto.jpg
import cv2
# Laadige pilt
pilt = cv2.imread('auto.jpg')
# Kontrollige, kas pilt on õigesti laetud
if image is None:
print("Pilt ei laaditud õigesti. Kontrollige failitee.")
else:
# Kärpimise koordinaadid
y1, y2, x1, x2 = 100, 400, 200, 600 # Näiteks määrake need väärtused vastavalt oma vajadustele
# Kärpige pilt
muudetud_pilt = pilt[y1:y2, x1:x2]
# Salvestage kärbitud pilt
cv2.imwrite('muudetudpilt.jpg', muudetud_pilt)
# Kuvage kärbitud pilt
cv2.imshow('Muudetud pilt', muudetud_pilt)
cv2.waitKey(0)
cv2.destroyAllWindows()
Kujundite joonistamine
OpenCV pakub mitmeid funktsioone piltidele joonistamiseks, sealhulgas joonte, ringide, ristkülikute ja teksti lisamiseks. Need funktsioonid võimaldavad piltidele visuaalset infot lisada, näiteks tuvastatud objektide ümber joonistatud piirjooned.
Kui varasemalt rääkisime RGB värvikanalitest, siis OpenCV teegil on need BGR formaadis ehk tagurpidi.
Joone joonestamine
Joone joonestamiseks on valik määrata selle algus- ja lõpp-punkt. Loome musta pildi ja joonistame sellele diagonaalse joone.
import numpy as np import cv2 as cv # loome musta pildi pilt = np.zero((512,512,3), np.uint8) # joonistame rohelise diagonaalse joone 3 pikslise paksusega cv.line(pilt,(0,0),(511,511),(0,255,0),5)
Ringi joonestamine
Ringi joonestamiseks on vajalik määrata ringi keskpunkt ja raadius. Joonestame täpselt pildi keskele ringi.
import numpy as np import cv2 as cv # loome musta pildi pilt = np.zero((512,512,3), np.uint8) # joonestame punase ringi täpselt pildi keskele 20 pikslise raadiusega. cv.circle(pilt,(256,256), 20, (0,0,255),-1)
Ristküliku joonestamine
import numpy as np import cv2 as cv # loome musta pildi pilt = np.zero((512,512,3), np.uint8) # joonestame ristküliku cv.rectangle(pilt,(500,210),(20,100),(0,255,0),3)
Pildile teksti lisamine
Asukoht on teksti vasaku alumise nurga alguspunkt.
import numpy as np import cv2 as cv # loome musta pildi pilt = np.zero((512,512,3), np.uint8) # lisame teksti cv.putText(kaks, 'OpenCV', (10,200), 0, 4, (255,255,255), 1, cv.LINE_AA)

import numpy as np
import cv2 as cv
# loome musta pildi
pilt = np.zeros((512,512,3), np.uint8)
# joonistame rohelise diagonaalse joone 3 pikslise paksusega
muudetud = cv.line(pilt,(0,0),(511,511),(0,255,0),5)
yks = cv.circle(muudetud,(256,256), 20, (0,0,255),-1)
kaks = cv.rectangle(yks,(500,210),(20,100),(0,255,0),3)
lõpp = cv.putText(kaks, 'OpenCV', (10,200), 0, 4, (255,255,255), 1, cv.LINE_AA)
cv.imshow("muudetud", lõpp)
cv.waitKey(0)
cv.destroyAllWindows()
Ülesanne:
- Võta Google Drive kaustas
inimene2.jpgpilt - Lisa pildile inimese näo umber ristkülik
- Lisa pildile tekst, kus on kirjas tänane kuupäev
- Salvesta muudetud pilt uue nimega.
See on vajalik, et tulevikus osata markeerida piltidelt tuvastatud objekte.
LISA: Joonestamine hiire abil
Lisaks on võimalik joonestada piltidele reaalajast, kasutades selleks hiire kursorit.
import cv2
import numpy as np
#joonestamine
värvimine = False
#funktsioon
def draw_rectangle(event,x,y,flags,params):
global ix,iy,värvimine
if event == cv2.EVENT_LBUTTONDOWN:
värvimine = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if värvimine == True:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
elif event == cv2.EVENT_LBUTTONUP:
värvimine = False
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0)-1)
#loome musta pildi
img = np.zeros((512,512,3))
cv2.namedWindow(winname='joonistus')
cv2.setMouseCallback('joonistus',draw_rectangle)
while True:
cv2.imshow('joonistus',img)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()
