Yazımıza kaldığımız yerden devam ediyoruz.
ADIM-10: Frame Üzerinde Oluşan Parıltının Kaldırılması
Parıltı, aşırı ve kontrolsüz parlaklığın neden olduğu bir hatadır. Parıltı piksel değeri 180’den büyük olan kısımlarda gerçekleşmektedir. Bu yüzden ilk olarak piksel değerinin 180’den büyük olduğu kısımlarını bulmamız gerekmektedir. Frame’e threshold işlemi uygulanarak binary formata dönüştürülür ve eşik değeri 180 seçilerek parlak olan kısımların beyaz olarak görünmesi sağlanır. Bu işlemleri OpenCV kütüphanesi kullanılarak aşağıdaki fonksiyon yardımıyla bulunmuştur.
1. def ShineRemove(_frame, _threshold):
2.
3. gray = cv2.cvtColor(_frame, cv2.COLOR_BGR2GRAY)
4.
5. smoothing= cv2.GaussianBlur(gray, (9,9), 0) 6.
7. _,thresh = cv2.threshold(smoothing, 180, 255,
8. cv2.THRESH_BINARY)
9.
10. erode = cv2.erode(thresh, None, iterations=2) 11.
12. dilate= cv2.dilate(erode, None, iterations=4) 13.
14. labels = measure.label(dilate, neighbors=8, background=0) 15.
16. mask = np.zeros(thresh.shape, dtype="uint8")
17.
18. for label in np.unique(labels): 19.
20. if label == 0:
21. continue
22.
23. labelMask = np.zeros(thresh.shape, dtype="uint8") 24.
25. labelMask[labels == label] = 255
26.
27. numPixels = cv2.countNonZero(labelMask)
28.
29. if numPixels > 300:
30. mask = cv2.add(mask, labelMask)
31.
32. result = np.where(mask != 255, _threshold, _threshold * 0)
33.
34. return result
Yukarıdaki kodları kısaca açıklayalım. ShineRemove() fonksiyonu iki adet parametre almaktadır. _frame parametresi, kameradan alınan orijinal giriş görüntüsüdür, oluşan parıltı bu giriş görüntüsü üzerinden tespit edilecektir. _threshold parametresi ise “ADIM-9” da bulunan eşikleme işlemi uygulanmış matristir. Parıltı kaldırma işlemi bu matris üzerinde yapılacaktır. Bu matrisin bir örneği Tablo 1.1. de gösterilmiştir.
İlk olarak kameradan alınan _frame gri renk formatına dönüştürülür ve gürültüyü azaltmak için Gauss Filtresi uygulanır. Bulanıklaştırılmış görüntüye eşikleme işlemi uygulanarak binary görüntüye dönüştürülmüştür. Eşikleme işleminde eşik değeri 180 seçilerek piksel değeri 180’in üzerinde beyaz, diğer durumlarda siyah yapılmıştır. Frame üzerinde bulunan küçük gürültü lekelerini kaldırmak için de frame’e erozyon ve genişleme morfolojik işlemleri uygulanmıştır. Genişleme işleminden sonra frame üzerinde bir miktar parazitlenme olmaktadır. Bu parazitlenmeyi kaldırmak için frame üzerinde bağlantılı bileşen analizi gerçekleştirilir. Scikit- image kütüphanesinin measure.labels yöntemi, bağlantılı bileşen analizi için kullanılmıştır. Binary görüntünün tam şekli için numpy.zeros yöntemi kullanılarak yeni bir siyah görüntü oluşturulur.
Bağlantılı bileşenlerin her biri döngüye sokulur. Bileşen değeri, siyah renk değerine eşit ise dikkate alınmaz ve işleme devam edilir. Fakat bileşen değeri, beyaz renk değerine eşit ise değeri 255 olan piksellerin sayısı sayılır. Piksel sayısı 300’den büyük olursa parlaklığın yeterince büyük olduğuna karar verilir ve parlaklık matrisi oluşturulur. Bu matris Tablo 1.2. de gösterilmiştir.
Numpy kütüphanesinin where() methodu ile parıltının bulunduğu piksel değerleri konumu, giriş matrisi üzerinde tespit edilir ve bu konumdaki piksel değerlerine 0 değeri atanır. Böylece görüntü, parıltıdan kaynaklanan bozulmalardan arındırılmış olur. Sonuç olarak oluşturulan çıktı matrisi Tablo 1.3. de gösterilmiştir.


Bu projede parıltı binary görüntü üzerinden kaldırılmıştır. Renkli bir görüntü üzerinde parıltı kaldırma işlemi Inpainting veya CHALE algoritmaları ile gerçekleştirilebilir.
ADIM-11: Morfolojik İşlemlerin Uygulanması
Morfolojik dönüşümler, görüntü şekline dayalı işlemlerdir. Genel olarak binary görüntüler üzerinde gerçekleştirilir. İşlemlerin yapılması için iki girdiye ihtiyaç vardır. İlki giriş görüntüsüdür, diğeri işlemin nasıl yapılacağına karar veren kernel matrisidir. Giriş görüntüsü ve kernel matrisi arasında evrişim işlemi gerçekleştirilir.
Projede görüntüye ilk olarak erozyon işlemi uygulanacaktır. Erozyon işlemi ön plandaki nesneni sınırlarını aşındırır ve istenmeyen gürültüleri kaldırır. Kernel matrisi tüm görüntü üzerinde kayarak işlem gerçekleştirilir. İşlem aşağıdaki kod satırında bulunan fonksiyon ile gerçekleştirilmiştir. Parlaklığı kaldırılmış matris, fonksiyona giriş görüntüsü olarak verilmiştir.
1. kernel_erosion = np.ones((3,3), np.uint8)
2. erosion = cv2.erode(shineRemoverMask, kernel_erosion, iteration=1)

Erozyon işleminden sonra kapama işlemi uygulanır. Closing, tespit edilen nesnelerin içindeki küçük delikleri ve siyah noktaları kapatmak için kullanılmaktadır. İşlem aşağıdaki kod satırında bulunan fonksiyon ile gerçekleştirilmiştir.
1. kernel_closing = np.ones((3,3), np.uint8)
2. closing = cv2.morphologyEx(erosion, cv2.MORPH_CLOSE,
3. kernel_closing, iteration=1)

Kapama işleminden sonra genişleme işlemi uygulanır. Dilation, görüntüdeki beyaz bölgeyi arttırır yani ön plandaki nesnenin boyutunu arttırır. Gürültü giderme işlemlerinde erozyon işlemi öncelikle uygulanır. Fakat erozyon işlemi tespit edilen nesne boyutunu küçültmektedir. Bu yüzden son olarak görüntüye dilation işlemi uygulanmaktadır. İşlem aşağıdaki kod satırında bulunan fonksiyon ile gerçekleştirilmiştir.
1. kernel_dilation = np.ones((3,3), np.uint8)
;
2. dilation= cv2.dilate(closing, kernel_dilation, iteration=1)

ADIM-12: Contour Sınırlarının Bulunması
Contourlar basitçe, aynı renk ve yoğunluğa sahip sürekli noktaları sınır boyunca birleştiren bir eğridir. Contourlar genel olarak; şekil analizi, nesne algılama ve nesne izleme de kullanılmaktadır. Contourlar genellikle binary görüntüler ile kullanılmaktadır. Contour bulma işlemi, siyah arka plan üzerindeki beyaz nesneyi bularak yapılmaktadır.
Projemizde contour bulma işlemi aşağıdaki kod satırında bulunan fonksiyon ile gerçekleştirilmiştir.
1. contours, hierarchy = cv2.findContours(dilation,
2. mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE)
Bu fonksiyon 3 parametre almaktadır ve bu işlem kaynak görüntüyü değiştirir. Dolayısıyla contour bulunduktan sonra kaynak görüntünün değiştirilmesi istenmiyorsa contour farklı bir değişkende saklanmalıdır. Biz projemizde bulunan contour’ları contours değişkeni içerisinde saklıyoruz. Bu contours değişkeni içerisinde tespit edilen nesnenin sınır noktalarının koordinatları Numpy dizisi olarak saklanmaktadır.
mode parametresi contour alma işlemini gerçekleştirir. 4 adet değer alabilir: cv2.RETR_TREE, cv2.RETR_EXTERNAL, cv2.RETR_LIST, cv2.RETR_CCOMP.
method parametresi contour yaklaşım yöntemidir. Bu parametreye göre tespit edilen şeklin sınır noktalarının koordinatları saklanır. cv2.CHAIN_APPROX_NONE değeri tespit edilen şeklin tüm sınır nokta koordinatlarını saklamasını sağlar. cv2.CHAIN_APPROX_SIMPLE değeri tespit edilen nesnenin önemi sınır nokta koordinatlarını tutmaktadır. Örneğin; tespit edilen şekil bir dikdörtgen ise sadece 4 sınır nokta koordinatını tutmak yeterli olacaktır.
Tablo 1.4. de tespit edilen nesnenin sınır nokta koordinatları işaretlenmiştir. Toplamda 31 adet sınır nokta koordinatı bulunmaktadır. Contour’lar bu sınır koordinatlarının birleştirilmesi ile çizilmiştir.

ADIM-13: Tespit Edilen Nesnelerin Frame Üzerinde Kapladığı Alanların ve Ağırlık Merkezlerinin Bulunması
Sınır nokta koordinatlarının birleştirilmesiyle oluşan şeklin içinde kalan alan, contour alanını vermektedir. Frame’ler üzerinde bazı durumlarda istenmeyen contour alanları da bulunmaktadır. ADIM-12’ de gösterilen contour’ları bulan method, tek bir dizi içerisinde tüm contourları sakladığını anlatmıştık. Bu dizi bir döngü içerisine alınır ve tüm contourların alanları sırasıyla hesaplanır. Alanları hesaplanan contourlara bazı sınırlandırmalar yapılır ve istenmeyen contour alanları işleme sokulmaz.
Kamera açısı ve kameranın yerden yüksekliğine göre insanların frame üzerinde kapladığı alanların bir aralığı bulunmuştur. Bu alan aralığı belirli sayıda tespit işlemi sonucunda bulunmuştur. Yüksek doğruluk oranı için fazla miktarda veri kullanılır ve hata oranı sıfıra yaklaştırılabilir.
Alan aralığı kullanılarak tespit edilen insanın contour’ları filtrelenmiştir. Bu contourların ağırlık merkezleri bulunur ve nesne izleme işlemi gerçekleştirilir. Bir şeklin ağırlık merkezi, şekil üzerindeki tüm noktaların aritmetik ortalamasıdır. Örneğin; bir şeklin n farklı noktalardan oluştuğunu varsayarsak ağırlık merkezi aşağıdaki formül yardımıyla hesaplanır.

Görüntü işleme ve makine görmesinde her şeklin piksellerden meydana geldiği söylemiştik. Bu yüzden bir frame üzerindeki şeklin ağırlık merkezi, şekli oluşturan tüm piksellerin aritmetik ortalamasıdır. Görüntü işleme sistemlerinde ağırlık merkezi görüntü momenti yardımıyla bulunabilmektedir. Görüntü momenti, bir görüntünün yarıçap, alan, ağırlık merkezi vb. gibi belirli özelliklerini bulmaya yardım etmektedir. Görüntüdeki şekillerin ağırlık merkezinin bulunabilmesi için görüntünün binary formatta olması gerekmektedir. Binary formattaki şekillerin moment yardımıyla ağırlık merkezi aşağıdaki gibi hesaplanmaktadır.

Bu denklemlerde 𝐶𝑥, ağırlık merkezinin x koordinatıdır; 𝐶𝑌, ağırlık merkezinin y koordinatıdır ve 𝑀, momenti belirtmektedir.
OpenCV kütüphanesi sayesinde contour alanı ve ağırlık merkezleri birkaç satır kod ile kolayca bulunabilmektedir. Bu kod satırları aşağıda gösterilmiştir.
1. for cnt in contours:
2.
3. contourArea = cv2.contourArea(cnt)
4.
5. if 80000 < contourArea < 130000:
6.
7. moments = cv2.moments(cnt)
8. centroid_x = int(moments['m10'] / moments['m00'])
9. centroid_y = int(moments['m01'] / moments['m00'])
10.
11. x, y, w, h = cv2.boundingRect(cnt)
12.
13. new_person = True
14.
15. for person_info in detected_person:
16.
17. # Bu kısımda yapılan işlemler diğer adımlarda anlatılacaktır.
18. .
19. .
20. .
21.
22. if new_person == True:
23.
24. # Bu kısımda yapılan işlemler diğer adımlarda anlatılacaktır.
25. .
26. .
27. .
28.
29. cv2.circle(frame, center=(x,y), radius=5, color=(0,255,255),
30. thickness=-1)
31. cv2.rectangle(frame, pt1=(x,y), pt2=(x+w,y+h),
32. color=(0,255,0), thickness=2)
33.
34. cv2.line(frame, (0,288), (640,288), False, (0,255,0), thickness=2)
35.
36. cv2.line(frame, (0,192), (640,192), False, (0,0,255), thickness=2)
37.
38. cv2.putText(frame, str(person_id), (centroid_x, centroid_y),
39. cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0,0,255), 1, cv2.LINE_AA)
40.
41. cv2.putText(frame, 'Ofisten cikan:' + str(count_outgoing), (10,20),
42. cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255),1, cv2.LINE_AA)
43.
44. cv2.putText(frame, 'Ofise giren:' + str(count_entering), (10,40),
45. cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0),1, cv2.LINE_AA)
46.
47. cv2.putText(frame, 'Ofiste bulunan:'+str(count_entering - count_outgoing),
48. (10,60), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,0),1, cv2.LINE_AA)
49.
50. cv2.imshow("Frame", frame)
51. cv2.waitKey(1)
1 numaralı satırdaki kod ile her bir contour değeri sırasıyla işleme sokulur. 3 numaralı kod satırı ile her bir contour’un alanı hesaplanır ve bulunan bu alanlara göre sınırlandırma yapılır. Böylece istenmeyen contour alanları işleme sokulmaz. 7 ve 9 numaralı satırlar arasındaki kodlar tespit edilen her bir insanın frame üzerinde ağırlık merkezini bulur.
11 numaralı satırdaki kod contour’u çevreleyen bir dikdörtgenin başlangıç noktasının koordinatlarını, dikdörtgenin genişlik ve yükseklik değerlerini bulmaktadır. Bu dikdörtgen kullanıcıya gösterilerek tespit edilen nesnenin çevresine bir dikdörtgen çizmeye yardımcı olacaktır.
13 numaralı satırdaki değişken içerisine True değeri atanmıştır. Bu işlem her yeni bulunan contour değerinde yapılmaktadır ve detected_person dizisi içerisindeki değerler anlık olarak güncellenecektir. Bu değişken içerisindeki değer True olduğu zaman tespit edilen kişi ile ilgili bazı işlemler yapılacaktır. Bu işlemler ilerleyen adımlarda anlatılacaktır.
15 numaralı satırdaki detected_person bir dizidir. Bu dizi içerisinde, tespit edilen kişinin kimliği, ağırlık merkezi koordinatları, ilerlediği yön ve bölgeye giriş zamanı ile ilgili bilgiler tutulmaktadır. 15 numaralı satırdaki döngünün çalışabilmesi için insanın tespit edilmesi gerekmektedir. İnsan tespit edildiği anda döngü çalışır ve insan kamera görüşünden çıktığı zaman detected_person dizisi içerisindeki bilgiler sıfırlanır. Fakat bilgiler ayrı bir klasörde veritabanı oluşturularak saklanabilir. Sıfırlama işlemi numpy kütüphanesi kullanılarak yapılmaktadır. Bu işlemler ilerleyen adımlarda anlatılacaktır. İnsan izleme ve insan sayma algoritması buradaki döngünün içerisinde gerçekleştirilecektir.
22 numaralı satırdaki kod, yeni bir insan tespit edildiği zaman çalışacaktır. Bu kod içerisinde tespit edilen kişi hakkında bazı işlemleri gerçekleştirecektir. Bu işlemler ilerleyen adımlarda gösterilecektir.
29 ve 31 numaralı satırlardaki kodlar tespit edilen nesnenin ağırlık merkezini ve sınır dikdörtgenini frame üzerine çizer. Bu sayede kullanıcıya bilgi verilir.
34 ve 36 numaralı satırlardaki kodlar insanların bölgeye girdiğini veya çıktığını belirleyen çizgilerin frame üzerine çizilmesini sağlamaktadır. 38 ve 48 numaralı satırlar arasında bulunan kodlar frame üzerine gerekli bilgilerin yazılmasını sağlamaktadır.
50 ve 51 numaralı satırlardaki kodlar anlık olarak frame’in ekran üzerinde gösterilmesini sağlamaktadır.
ADIM-14: Tespit Edilen Kişilere Ait Nesnelerin Oluşturulması
Bir frame üzerinde birden fazla kişi tespit edildiği zaman veriler karışabilmektedir. Bu yüzden nesne yapısı oluşturulur. Nesneler, içinde veri saklayan ve bu veriler üzerinde işlem yapacak olan metodlar bulunduran bileşenlerdir. Nesneler her uygulamada tekrar kullanılabilir. Oluşturulan nesneler hafıza alanında yer kaplamaktadır. Oluşturulan nesneler ile frameüzerinde birden fazla kişi tespit edildiğinde, işlemler aynı anda farklı nesneler kullanılarak yapılacaktır. Tüm bu nesneleri üretmek ve aynı olan işlemleri tek seferde gerçekleştirmek için bir sınıf yapısı oluşturulmuştur. Sınıflar sayesinde daha az kod oluşturulup daha fazla iş yapıp kod tekrarı önlenir. Sınıf içerisinde attribute ve methodlar bulunmaktadır. Tespit edilen kişi bilgileri attribute’ler içerisinde yer alacaktır ve methodlar ile işleme tabii tutulacaktır.
Her bir yeni kişi tespit edildiği anda bir nesne yaratılacaktır. Bu nesne içerisine tespit edilen kişi hakkında bazı veriler saklanacaktır. Projede oluşturulan sınıf aşağıdaki kod satırlarında gösterilmiştir.
1. class PersonInformation:
2.
3. def __init__(self, _person_id, centroid_x, centroid_y):
4.
5. self.id = _person_id
6.
7. self.centroid_x = centroid_x
8.
9. self.centroid_y = centroid_y
10.
11. self.centroids_array = []
12.
13. self.timeToDisappear = 0
14.
15.
16. def updateCoordinate(self, updateCentroid_x, updateCentroid_y):
17.
18. self.timeToDisappear = 0
19.
20. self.centroids_array.append([self.centroid_x, self.centroid_y])
21.
22. self.centroid_x = updateCentroid_x
23.
24. self.centroid_y = updateCentroid_y
25.
26.
27. def forwardDirection(self, line_down, line_up):
28.
29. if len(self.centroids_array) >= 2:
30.
31. if self.centroids_array[-1][1] < line_up and
32. self.centroids_array[-2][1] >= line_up:
33.
34. return True
35.
36.
37. def backDirection(self, line_down, line_up):
38.
39. if len(self.centroids_array) >= 2:
40.
41. if self.centroids_array[-1][1] > line_up and
42. self.centroids_array[-2][1] <= line_up:
43.
44. return True
45.
46.
47. def personInformationDelete(self):
48.
49. self.timeToDisappear += 1
50.
51. if self.timeToDisappear > 5:
52.
53. return True
54.
55. else:
56.
57. return False
3 numaralı satırdaki method ile nesneye ait attribute değerleri belirlenir. Bu kısımdaki centroids_array ağırlık merkezlerinin tutulduğu dizidir. timeToDisappear attribute’u ise tespit edilen kişinin kamera görüşünden çıktığı zaman geçen frame sayısını tutmaktadır.
16 numaralı satırdaki method ile anlık olarak tespit edilen kişinin frame üzerindeki ağırlık merkezleri güncellenmektedir.
27 numaralı satırdaki method tespit edilen kişinin ileri yönde ilerleyip ilerlemediğinin kontrolünü yapmaktadır. 37 numaralı satırdaki method ise tespit edilen kişinin geri yönde gidip gitmediğinin kontrolünü yapmaktadır.
47 numaralı satırdaki method tespit edilen kişinin kamera görüşünden çıktığını yakalamaktadır. Kamera görüşünde olmadığı toplam frame sayısı, 5 değerini geçtiği zaman methodun çağrıldığı yere True değerini döndürür ve tespit edilen kişinin nesnesi hafıza alanından silinir. Kişi verileri isteğe bağlı olarak veri tabanında saklanması sağlanabilir.
Yeni kişi tespit edildiğinde yeni bir nesne yaratılmaktadır. Bu nesne içerisinde tespit edilen kişi ile ilgili bilgiler saklanır. Bu nesnenin yaratıldığı işlemler aşağıdaki kodlarda gösterilmiştir.
1. if new_person == True:
2.
3. new_person_detected = PersonInformation(person_id,
4. centroid_x, centroid_y)
5.
6. detected_person.append(new_person_detected)
7.
8. person_id += 1
Yeni kişi tespit edildiğinde 3 numaralı satırda oluşturulan sınıf çağırılarak yeni bir nesne oluşturulur. Bu nesne içerisinde tespit edilen kişi hakkında bilgiler tutulacaktır. Daha sonra 6 numaralı satırda oluşturulan yeni nesne detected_person dizisi içerisinde saklanacaktır. Tespit edilen her yeni kişiye ait nesne bu dizi içerisinde saklanmaktadır. Tespit edilen kişi kamera görüşünden çıktığı zaman da bu dizi içerisinden bilgiler silinecektir. 8 numaralı satırda ile yeni kişi tespit edildiği için değişken 1 arttırılır.
ADIM-15: Kişi İzleme Algoritmasının Oluşturulması
Kişi izleme algoritması 3 adımdan oluşmaktadır;
- Tespit edilen kişinin nesneleri alınır.
- İlk algılamada her bir kişiye geçici bir id ataması gerçekleştirilir.
- Geçici id ataması gerçekleştirilmiş nesne kamera görüşünde bulunduğu sürece izlenir.
Genel olarak nesne izleme algoritmalarında nesne algılandığı zaman yeni bir kimlik ataması gerçekleştirilir ve algılanan nesne hareket ederken atanan kimlik korunmalıdır. Bu işlemler sırasında algılanan nesne çevresine dikdörtgen çizilerek izleme işlemi kullanıcıya gösterilmektedir. Ayrıca nesne izleme algoritmalarının, nesne kamera görüşünden çıktığı zaman veya kaybolduğu zaman bu durumu fark edebilmesi gerekmektedir.Bizde aynı işlemleri kişi izleme için tekrarlayacağız. Tespit edilen her kişiye farklı bir kimlik ataması gerçekleştirerek frameler üzerinde izlenmesini sağlayacağız. Kişi kamera görüşünden çıktığı zamanda gerekli işlemleri yaparak kişi bilgilerini hafıza alanından sileceğiz. Bu işlemeler aşağıdaki kod satırında gösterilmiştir.
1. for person_info in detected_person:
2.
3. if abs(x - centroid_x) <= w and abs(y - centroid_y) <= h:
4.
5. new_person = False
6.
7. person_info.updateCoordinate(centroid_x, centroid_y)
8.
9. if person_info.forwardDirection(288, 192) == True:
10.
11. count_outgoing += 1
12.
13. elif person_info.backDirection(288, 192) == True:
14. count_entering += 1
15.
16. if isPersonDisappeared == True:
17.
18. indexPerson = detected_person.index(person_info)
19.
20. detected_person.pop(indexPerson)
21.
22. del person_info
detected_person dizisi içerisinde tespit edilmiş kişinin nesnesi tutuluyor ise kişi izleme işlemine başlanır. 3 numaralı satır ile ağırlık merkezinin tespit edilen kişiyi sınırlandıran dikdörtgenin içerisinde olup olmadığının kontrolü yapılmaktadır. Kişi daha önce tespit edildiği için 5 numaralı satır ile yeni tespit işleminin yapılması engellenmektedir. 7 numaralı satırda bulunan method anlık olarak izlenen nesnenin ağırlık merkezlerini güncellemektedir. 9 ve 14 numaralı satırlar arasındaki kodlar ile kişinin hangi yönde ilerlediği ve hangi sınır çizgisi üzerinde veya altında bulunduğunun kontrolü gerçekleştirilir. Buna göre belirlenen sayaçlar arttırılarak nesne izleme işlemi yapılır.
16 numaralı satırdaki işleme geçmeden önce contour’ların bulunduğu kod parçasının arkasına aşağıdaki kod satırı eklenmelidir.
1. for i in detected_person:
2.
3. isPersonDisappeared = i.personInformationDelete()
Bu kod parçası sayesinde tespit edilen kişinin kamera önünden çıkıp çıkmadığının kontrolü yapılmaktadır. Tespit edilen kişi kamera görüşünden çıktıktan sonra 5 frame’lik süre kadar beklenir. Nesne hala kamera görüşüne girmemiş ise class yapısı içerisinde bulunan personInformationDelete() methodundan True değeri döndürülür. True değeri geldiği için 16 ve 22 numaralı satırlar arasında tespit edilen kişiye ait nesne hafıza alanından silinmektedir.
SONUÇ
Bu blog serisinde OpenCV ve Python kullanılarak bir insan sayacının nasıl yapılacağını anlattık. Bu uygulamamız standart CPU’larda gerçekleştirilebilir. Gelişmiş kişi algılama sistemleri için derin öğrenme algoritmalarını kullanmanızı ve GPU’larda işlem yapmanızı tavsiye ederiz. Bu sistem farklı nesneleri saymak için de gerçekleştirilebilir. Algoritma tamamen aynı olacaktır.


Yorumlar
Yükleniyor...