OpenCV Arka Plan Çıkarma (Background Subtraction)

Daha önce absdiff arka plan temizleme fonksiyonunu burada anlatmıştım, bu yazıda işleyeceğimiz ise absdiff fonksiyonundan farklıdır.

Arka Plan Çıkarma

Arka plan çıkarma işlemi görüntü işleme uygulamalarında sıklıkla kullanılan bit yöntemdir, genellikle sabit bir zemin üzerindeki hareketli nesneleri (insan, araç, ürün vb.) yakalamak ve takip etmek için kullanılır.  Bu işleyişteki mantık sabit arka planı referans alarak üzerindeki değişiklikleri yakalamaktır. Algoritma sabit kalan kısmı yani arka planı tespit eder ve üzerindeki değişiklikleri tespit ederek hareketleri yakalayabilir. Hareketli nesne tespiti için diğer yöntemlere göre daha hızlıdır çünkü baktığı tek şey sabit arka planı yakalamak ve diğer her şeyi bu referansa göre değerlendirmektir. Bu yöntemin bazı dezavantajları da vardır. Örneğin sabit olmayan bir kameranız varsa yani sürekli olarak rüzgar gibi nedenlerden dolayı sallanıyorsa, yağmurlu havalarda, kalabalık yani zeminin çok iyi seçilemediği ortamlarda referans arka plan tespiti zor olacağı için verimli sonuçlar alamazsınız.

OpenCV kütüphanesinde arka plan çıkarma işlemini yapmak oldukça kolaydır, bu işlem için BackgroundSubtractorMOG, BackgroundSubtractorMOG 2 ve BackgroundSubtractorGMG  yöntemi geliştirilmiştir.

BackgroundSubtractorMOG, BackgroundSubtractorMOG2 ve BackgroundSubtractorGMG

BackgroundSubtractorMOG bu algoritma 2001 yılındaki P. KadewTraKuPong and R. Bowden tarafından yazılan “An improved adaptive background mixture model for real-time tracking with shadow detection” başlıklı makaladen yola çıkarak geliştirilmiştir. Bu yöntem ön bölünmüş segmentasyon algoritması olarak da geçmektedir. BackgroundSubtractorMOG2 ise Z.Zivkovic tarafından ele alınan 2004 yılındaki “Improved adaptive Gausian mixture model for background subtraction” ve  2006 yılındaki “Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction” makalelerden yola çıkarak geliştirilmiştir. Bu algoritmanın önemli bir özelliği, Her piksel için uygun sayıda Gauss dağılımı seçer, bu farkı uygulamada seçebiliyor olacağız.

BackgroundSubtractorGMG ise OpenCV içerisine daha yakın bir tarihte eklenmiş bir yöntemdir. Arka plan ayırımı için daha başarılı bir yöntemdir. Bu yöntem 2012 yılında Andrew B. Godbehere, Akihiro Matsukawa, Ken Goldberg  tarafından yazılan “Visual Tracking of Human Visitors under Variable-Lighting Conditions for a Responsive Audio Art Installation” başlıklı makalelerinden yola çıkılarak geliştirildi. Arka plan modellemesi için ilk birkaç (varsayılan 120) çerçeve kullanır. Olası ön plan nesnelerini Bayes çıkarımı kullanarak tanımlayan olasılıksal önplan bölümleme algoritmasını kullanır. Tahminler uyarlanabilir; Değişken aydınlatmaya uyum sağlamak için daha yeni gözlemler daha eski gözlemlerden daha ağırlıklıdır. İstenmeyen gürültüyü gidermek için kapanma ve açma gibi çeşitli morfolojik filtreleme işlemleri yapılır.

Yöntemleri karşılaştıracak olursak;

Orijinal Görüntü

BackgroundSubtractorMOG
BackgroundSubtractorMOG

BackgroundSubtractorGMG
BackgroundSubtractorGMG

BackgroundSubtractorMOG2
BackgroundSubtractorMOG2

 Örnek:

Java

import org.opencv.core.Mat;
import org.opencv.video.BackgroundSubtractor;
import org.opencv.video.BackgroundSubtractorMOG2;
import org.opencv.videoio.VideoCapture;

public class Ornek {
    public static void main(String[] args){
        VideoCapture capture = new VideoCapture(0);
          Mat camImage = new Mat();
          BackgroundSubtractorMOG2 backgroundSubtractorMOG = Video.createBackgroundSubtractorMOG2();
            if (capture.isOpened()) {
                while (true) {
                    capture.read(camImage);


                    Mat fgMask=new Mat();
                    backgroundSubtractorMOG.apply(camImage, fgMask,0.1);

                    Mat output=new Mat();
                    camImage.copyTo(output,fgMask);

                    //output nesnesini kullanabilirsiniz
                   }
                }
    }
}

Python

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
fgbg = cv2.createBackgroundSubtractorGMG()
while(1):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
    cv2.imshow('GORUNTU',fgmask)

cap.release()
cv2.destroyAllWindows()

 


Yararlanılan kaynaklar

  • http://docs.opencv.org/3.2.0/d1/dc5/tutorial_background_subtraction.html
  • https://en.wikipedia.org/wiki/Background_subtraction