Pilditöötlus OpenCV abil: Difference between revisions
From ICO wiki
Jump to navigationJump to search
mNo edit summary |
|||
(2 intermediate revisions by one other user not shown) | |||
Line 40: | Line 40: | ||
* Kaader on sisuliselt mitmemõõteline massiiv | * Kaader on sisuliselt mitmemõõteline massiiv | ||
* Kes proovib oma Ubuntu masinas programmi käima ajada paigalda esmalt sõltuvused: apt install python-opencv python-numpy | * Kes proovib oma Ubuntu masinas programmi käima ajada paigalda esmalt sõltuvused: apt install python-opencv python-numpy | ||
<source lang="python"> | <source lang="python"> | ||
Line 57: | Line 58: | ||
print "Avan faili:", filename | print "Avan faili:", filename | ||
cap = cv2.VideoCapture(filename) | cap = cv2.VideoCapture(filename) | ||
fps = cap.get( | fps = cap.get(5) | ||
success, frame = cap.read() | success, frame = cap.read() | ||
Line 99: | Line 100: | ||
# Leia maskist kontuurid | # Leia maskist kontuurid | ||
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) | |||
# Visualiseeri kontuurid mida ümbristeva ristküliku suurus on suurem kui 5x5 pisklit | # Visualiseeri kontuurid mida ümbristeva ristküliku suurus on suurem kui 5x5 pisklit | ||
Line 114: | Line 115: | ||
cv2.imshow("fov", zoomed) | cv2.imshow("fov", zoomed) | ||
# Lõpeta programmi täitmine kui klaviatuuril vajutatakse suvalist nuppu | |||
keycode = cv2.waitKey(int(1000/fps)) | |||
if keycode >= 0: | |||
# Lõpeta programmi täitmine kui klaviatuuril vajutatakse | |||
keycode = cv2.waitKey( | |||
if keycode = | |||
break | break | ||
cap.release() | cap.release() | ||
</source> | </source> | ||
[[Category:Sissejuhatus infotehnoloogiasse ja riistvarasse]] |
Latest revision as of 15:54, 17 April 2017
Andmete kodeerimise praktikum
Andmete kodeerimise loeng päevõppes toimub 20. aprillil, esitlus siin: https://docs.google.com/presentation/d/1QV_IMOadIEUTBW7Laqw59j8J7Y8HKwvSDmP-swEEx0s
Prakikumis keskendume pilditöötlusele, et natukene aru saada mis moodi bitid/baidid liiguvad video ja pildifailides, selleks:
- Laadi alla Robotex 2016 testpäeva videofailid aadressilt http://upload.itcollege.ee/robotex-test-day/
- Kasuta programmi toorikuna allpool olevat koodijuppi, salvesta see faili pildituvastus.py
- Käivita programm käsutealt: python pildituvastus.py failinimi.avi
- Püüa leida vastused järgnevatele küsimustele
- Saada oma vastused ja modifikatsioonidega programm lauri.vosandi@itcollege.ee aadressile ning märgi e-kirja teemaks "I027 Andmete kodeerimine praktikum"
Küsimused:
- Mis on kaadri (frame) eraldusvõime (resolution)?
- Mis piksliformaadis on cap.read() väljastatud kaader?
- Mis on kaadrisagedus (framerate)? Mis on ühe kaadri kuvamise aeg?
- Mis on kaadri suurus baitides?
- Mitu kaadrit on failis? Kui pikk on videolõik ajaliselt?
- Kui salvestada kõik kaadrid pakkimata kujul kettale, palju need ruumi võtaksid?
- Kui palju ruumi säästab video pakkimine?
- Tee kaadriloendur türkiissiniseks https://en.wikipedia.org/wiki/Turquoise_(color)#Turquoise_Blue
- Kohenda koodi nii et tuvastataks pallid
- Täienda koodi et leitaks sinine värav
- Täienda koodi et leitaks kollane värav
- Mis on palli ja väravate tuvastamiseks sobilik värvikoodide vahemik HSV või YUV värviruumis? Selgita!
Lisaülesanded nuputamiskes, kui seni meeldis:
- Teades et kaamera on 22cm kõrgusel ning vaatenurk ülevalt horisondist alla on 72 kraadi arvuta välja palli kaugus ning kuva see palli kohal
- Leia palli nurk löögimehhanismist
- Leia palli vektor löögimehhanismi suhtes
- Millisele pallile kõige esimesena läheneda võiks praeguse kaadri järgi? Märgi ära see ekraanil.
Vihjed:
- Kasuta print lauset muutujate kuvamiseks terminalisse
- Kaader on sisuliselt mitmemõõteline massiiv
- Kes proovib oma Ubuntu masinas programmi käima ajada paigalda esmalt sõltuvused: apt install python-opencv python-numpy
# encoding: utf-8
import cv2
import os
import numpy as np
import sys
from time import sleep
try:
_, filename = sys.argv
except ValueError:
print("Anna argumendiks failinimi mida töödelda!")
sys.exit(255)
print "Avan faili:", filename
cap = cv2.VideoCapture(filename)
fps = cap.get(5)
success, frame = cap.read()
# Kommenteeri need välja ja uuri välja mis need teevad?
#print frame
#print frame.shape
#print frame.dtype
frameno = 0
while True:
# Loe ja paki lahti kaader failist
success, frame = cap.read()
frameno += 1
if not success:
break
# Piksliformaadi teisendus
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
yuv = cv2.cvtColor(frame, cv2.COLOR_RGB2YCR_CB)
# Leia väärtuste vahemikku langevad pikslid
mask = cv2.inRange(frame, (100,0,0), (255,100,100))
#mask = cv2.inRange(hsv, (200,200,150), (255,255,255))
# Eemalda üksikud pikslid
mask = cv2.erode(mask, np.ones((2, 2)))
# Maski pikslite visualiseerimiseks lõika need välja esialgsest kaadrist
cutout = cv2.bitwise_and(frame, frame, mask=mask)
# Joonista kaadriloendur
cv2.putText(frame, "frame: %d" % frameno, (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 3)
# Moodusta kaadrite pinu
stacked = np.vstack([
frame,
np.stack([mask]*3, axis=2), # See on maski näitamiseks
cutout,
])
# Leia maskist kontuurid
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# Visualiseeri kontuurid mida ümbristeva ristküliku suurus on suurem kui 5x5 pisklit
for cnt in contours:
x,y,w,h = cv2.boundingRect(cnt)
if w > 5 and h > 5:
cv2.rectangle(stacked,(x,y),(x+w,y+h),(0,255,0),2)
cv2.putText(stacked, "pall", (x,y), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 3)
# Tee pilt pisemaks et ekraanile mahuks
zoomed = cv2.resize(stacked, None, fx=0.5,fy=0.5)
# Kuva kaader ekraanil
cv2.imshow("fov", zoomed)
# Lõpeta programmi täitmine kui klaviatuuril vajutatakse suvalist nuppu
keycode = cv2.waitKey(int(1000/fps))
if keycode >= 0:
break
cap.release()