Değerli arkadaşlar, öncelikle bu uygulamayı gerçekleştirmek için gerekli kurulumlar, bağlantılar ve kütüphaneleri önceki Raspberry Pi yazılarımızda anlatmıştık. Eğer onları okumadıysanız öncelikle o seriyi tamamlamanızı öneririz.
OpenCV ve Raspberry Pi çalışmalarına devam ediyoruz. Önceki yazımızda yüz algılatmıştık. Şimdi ise herhangi bir hareket anını algılayan bir kod dökümanı yazacağız.
Program kodlarımız şu şekilde
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
frame_width = int( cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height =int( cap.get( cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc('X','V','I','D')
out = cv2.VideoWriter("output.avi", fourcc, 5.0, (1280,720))
ret, frame1 = cap.read()
ret, frame2 = cap.read()
print(frame1.shape)
while cap.isOpened():
diff = cv2.absdiff(frame1, frame2)
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
_, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh, None, iterations=3)
contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
(x, y, w, h) = cv2.boundingRect(contour)
if cv2.contourArea(contour) < 900:
continue
cv2.rectangle(frame1, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(frame1, "Status: {}".format('Movement'), (10, 20), cv2.FONT_HERSHEY_SIMPLEX,
1, (0, 0, 255), 3)
#cv2.drawContours(frame1, contours, -1, (0, 255, 0), 2)
image = cv2.resize(frame1, (1280,720))
out.write(image)
cv2.imshow("feed", frame1)
frame1 = frame2
ret, frame2 = cap.read()
if cv2.waitKey(40) == 27:
break
cv2.destroyAllWindows()
cap.release()
out.release()
Çalıştırdığımızda Camera önünde hareket eden ne varsa algıladığını ve yeşil bir pencere altına aldığını görüyoruz
Dilerseniz bunu kamera görüntüsü değil kayıtlı bir videodan da algılama yapabilirsinz.
Bunun için tek yapmanız gereken
cap = cv2.VideoCapture(0)
Olan kod satırını
cap = cv2.VideoCapture(‘videonuz.avi’)
olarak değiştirmektir. Videonuz olan kısma oynatacağınız videonun ismi yazılmalıdır.
Kod açıklamaları :
frame_width = int( cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height =int( cap.get( cv2.CAP_PROP_FRAME_HEIGHT))
Eklenen videonun genişlik ve boyutunu ayarladığımız kısım
out = cv2.VideoWriter(“output.avi”, fourcc, 5.0, (1280,720))
Videonun pixellerini ayarladığımız kod kısmı
diff = cv2.absdiff(frame1, frame2)
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
_, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh, None, iterations=3)
contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Bu alanda ise öncelikle video siyah beyaz yapılıyor, ardından bulanıklaştırılıyor, ve video eşitleme yapılıyor. Böylelikle hareketler daha kolay algılanabliyor.
for contour in contours:
(x, y, w, h) = cv2.boundingRect(contour)
if cv2.contourArea(contour) < 900:
continue
cv2.rectangle(frame1, (x, y), (x+w, y+h), (0, 255, 0), 2)
Bu noktada ise açılacak karenin genişlik ve yükseklik ayarları yapılıyor . Aynı zamanda (0, 255, 0) Yeşil renkte bir kare olacağı belirtiliyor. ve 2 mm çapında olması isteniyor.
Kaynak : https://gist.github.com/pknowledge/623515e8ab35f1771ca2186630a13d14,
https://www.youtube.com/watch?v=D_WB_4H2UDQ&list=PLeijGpgnb0_pRr24yMmJZmkqGPBAA1hM3&index=2