Arvutiteaduse instituut
  1. Esileht
  2. IT koolidele
EN
Logi sisse

IT koolidele

  • OpenCV sissejuhatus
  • OpenCV paigaldamine
  • Vajalike materjalide allalaadimine
  • Mis on pilt?
  • Pildid
  • Kaamera kasutamine
  • Pilditöötlus
  • Objektide tuvastus
  • Lisa: Panoraam

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.jpg pilt
  • 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()
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused