Gömülü Sistemler Raspberry Pi

Raspberry Pi – OpenCV İle Hareket Algılama

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

Similar Posts

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir