-
Notifications
You must be signed in to change notification settings - Fork 91
/
meanshift.py
74 lines (51 loc) · 2.24 KB
/
meanshift.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#Python v3, OpenCV v3.4.2
import cv2
import numpy as np
videoCapture = cv2.VideoCapture("video.mp4")
ret, frame = videoCapture.read()
rows, cols = frame.shape[:2]
'''
Video dosyası üzerine Mean Shift için bir alan belirlenir.
Bu koordinatlar ağırlıklı ortalaması belirlenecek olan dörtgen alanıdır. '''
#w ve h boyutlandırmasını değiştirerek sonuçları gözlemleyebilirsiniz
w = 200
h = 300
col = int((cols - w) / 2)
row = int((rows - h) / 2)
shiftWindow = (col, row, w, h)
'''
Şimdi görüntü üzerindeki parlaklığı, renk dağılımlarını dengelemek için bir maskeleme alanı oluşturalım ve
bu alan üzerinde histogram eşitleme yapalım
'''
roi = frame[row:row + h, col:col + w]
roiHsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
lowLimit = np.array((0., 60., 32.))
highLimit = np.array((180., 255., 255.))
mask = cv2.inRange(roiHsv, lowLimit, highLimit)
roiHist = cv2.calcHist([roiHsv], [0], mask, [180], [0, 180])
cv2.normalize(roiHist, roiHist, 0, 255, cv2.NORM_MINMAX)
'''
Bu parametre / durdurma ölçütü algoritmanın kendi içerisinde kaydırma/hesaplama işlemini kaç defa yapacağını belirlemektedir.
'''
terminationCriteria = (cv2.TERM_CRITERIA_COUNT | cv2.TERM_CRITERIA_EPS , 10, 1)
while True:
ret , frame = videoCapture.read()
'''
video içerisinde öncelikli HSV renk uzayı üzerinde histogram alıp histogram back projection yapacağız ve
tüm görüntü üzerinde istediğimiz yerin segmentlerini bulacağız.
'''
frameHsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
backprojectedFrame = cv2.calcBackProject([frameHsv], [0], roiHist, [0, 180], 1)
# karanlıkta kalan alanları maskeleyelim
mask = cv2.inRange(frameHsv, lowLimit, highLimit)
backprojectedFrame &= mask
# mean shift algoritmasını başlatalım
ret, shiftWindow = cv2.meanShift(backprojectedFrame, shiftWindow, terminationCriteria)
#Col, row artık mean shift ile elde edilen alandır
col, row = shiftWindow[:2]
#Görüntü üzerinde tespit edilen alanı çizelim
frame = cv2.rectangle(frame, (col, row), (col + w, row + h), (255,255,0), 4)
cv2.imshow('Agirlikli Ortalama Oteleme - Mean Shift', frame)
k = cv2.waitKey(60) & 0xff
videoCapture.release()
cv2.destroyAllshiftWindows()