Pilditöötlus

Eesmärk:
- Osata muuta piltide värvispektrume.
- Otsime videolt kindlat värvi objekte.
- Otsime pildilt ääri.
- Oskab tuvastada maantesõidurada nagu Elon Muski Tesla'd.
Värviruumi muutmine
Varasemalt rääkisime, et olemas on RGB värvimudel. OpenCV'l on olemas üle 150 värviruumi muutmise funktsiooni, kuid selles peatükis käsitleme kahte, BGR->Gray ja BGR-> HSV.
BGR - Blue Green Red
Gray - grayscale image
HSV - Hue Saturation Value
Värviruumi teisendamiseks kasutame funktsiooni cv.cvtColor(pilt, värv) . Tavalisest pildist halli pildi teisendamiseks kasutame cv.COLOR_BGR2GRAY, Sarnaselt BGR->HSV teisendus käib cv.COLOR_BGR2HSV.
Näidis muutmine BGR->HSV.
import cv2 as cv
pilt = cv.imread("värv.jpg")
teisendus = cv.cvtColor(pilt, cv.COLOR_BGR2HSV)
cv.imshow("algne pilt", pilt)
cv.imshow("muudetud pilt", teisendus)
cv.waitKey(0)
cv.destroyAllWindows()
Erinevaid värvilahendusi saad vaadata siit.
Värvi tuvastamine videos:
- Võtame iga kaadri videost
- Muudame värvispektrumi RGB -> HSV
- Piirame HSV pilti punase värvi vahemikule
- Punane objekt on eraldi nähtav
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
#analüüsime igat video kaadrit
_, frame = cap.read()
# Muudame BGR to HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
# määrame punase värvi vahemiku
madal_punane = np.array([110,50,50])
kõrge_punane = np.array([130,255,255])
# piirame HSV pilti, et saada ainult punane värv
mask = cv.inRange(hsv, madal_punane, kõrge_punane)
# Bitwise operatsioon, et näha lõpptulemust
res = cv.bitwise_and(frame,frame, mask= mask)
cv.imshow('frame',frame)
cv.imshow('mask',mask)
cv.imshow('res',res)
if cv.waitKey(5) == ord('q'):
break
cv.destroyAllWindows()

PS! Analüüs ei ole täiuslik ning vaja on parameetreid muuta, et saada parem tulemus. See on üks lihtsamaid viise objektide tuvastamiseks. Parema tulemuse saavutamiseks peaks jäädvustava kaamera videol olema võimalikult hea valgus ja vähe segavaid faktoreid.
Kuidas leida HSV väärtusi, mida jälgida?
green = np.uint8([[[0,255,0 ]]]) hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV) print( hsv_green ) Vastus: [[[ 60 255 255]]]
Ülesanne: Loo programm, mis tuvastab videolt sinist värvi.
Äärte tuvastamine
Selles osas käsitleme põgusalt Canny Edge Detection äärte tuvastus algoritmi. Laadi alla pilt siit.
import cv2 as cv
img = cv.imread("auto.jpg", cv.IMREAD_GRAYSCALE)
edges = cv.Canny(img, 100,200)
cv.imshow("Tavaline", img)
cv.imshow("Canny", edges)
cv.waitKey(0)
cv.destroyAllWindows()

Maantee sõiduraja jälgimine
Kasutame HoughLinesP funktsiooni, et kaamera suudaks tuvastada sõiduraja jooned. Ja kuna oskame ka juba piltide peale joonistada, siis joonistame rohelised jooned tuvastatud joontele.
import cv2
import numpy as np
img = cv2.imread("auto.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imshow("edges",edges)
lines = cv2.HoughLinesP(edges, 1,np.pi/180,100,minLineLength=100,maxLineGap=10)
for line in lines:
x1,y1,x2,y2 = line[0]
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Kaamera tuvastas jooni ka mujal, kui ainult sõiduteel. Äkki oleks võimalik kaamera otsimispiirkonda vähendada ainult vaatevälja alumisele osale?