Pengolahan Video untuk Mendeteksi Objek Bergerak dengan Metode Background Subtraction


Berikut ini merupakan contoh aplikasi pemrograman matlab mengenai pengolahan video untuk mendeteksi objek bergerak (object tracking) dengan metode background subtraction.
Secara garis besar langkah-langkahnya adalah:
1. Mengekstrak semua frame pada video
2. Mencari frame background secara otomatis dengan cara menghitung nilai modus pada setiap frame
3. Mengkonversi CurrentFrame dan BackgroundFrame menjadi citra grayscale
4. Mengkurangkan antara kedua frame tersebut
5. Mengkonversi citra hasil pengurangan menjadi citra biner
6. Melakukan operasi morfologi untuk menghilangkan noise
7. Menjadikan citra hasil operasi morfologi sebagai masking untuk memvisualisasikan objek yang bergerak
8. Menjalankan setiap frame hasil deteksi secara sekuensial (video)

Pada contoh ini digunakan video dengan spesifikasi sebagai berikut:

Name: ‘SampleVideo.avi’
Duration: 5.3333
Width: 360
Height: 240
FrameRate: 15.0000
BitsPerPixel: 24
VideoFormat: ‘RGB24’

Video tersebut memiliki durasi selama 5.3333 detik dan frame rate sebesar 15 frame per detik sehingga banyaknya frame ketika diekstrak adalah 5.3333 x 15 = 80 frame. Tampilan frame pada setiap detik ditunjukkan pada gambar di bawah ini:

Detik ke- Frame
0
1
2
3
4
5

Langkah-langkah pemrogramannya adalah:
1. Membaca file video

clc;clear;close all;

vid = VideoReader('SampleVideo.avi');

2. Mengekstrak semua frame yang ada pada video (80 frame)

vidWidth = vid.Width;
vidHeight = vid.Height;
mov = struct('cdata',zeros(vidHeight,vidWidth,3,'uint8'),...
    'colormap',[]);
frames = zeros(vidHeight,vidWidth,3,80);

k = 1;
while hasFrame(vid)
    frames(:,:,:,k) = readFrame(vid);
    k = k+1;
end

3. Mencari BackgroundFrame secara otomatis dengan cara menghitung nilai modus pada setiap frame

R = squeeze(frames(:,:,1,:));
G = squeeze(frames(:,:,2,:));
B = squeeze(frames(:,:,3,:));

R_back = uint8(mode(R,3));
G_back = uint8(mode(G,3));
B_back = uint8(mode(B,3));

Background = cat(3,R_back,G_back,B_back);

sehingga diperoleh BackgroundFrame seperti ditunjukkan pada gambar di bawah ini

4. Melakukan operasi background subtraction dengan metode pengurangan citra grayscale pada setiap frame

for x = 1:80
    CurrentFrame = uint8(frames(:,:,:,x));

    % Mengkonversi citra menjadi grayscale
    Background_gray = rgb2gray(Background);
    CurrentFrame_gray = rgb2gray(CurrentFrame);

    % Pengurangan citra grayscale
    Subtraction = (double(Background_gray)-double(CurrentFrame_gray));
    Min_S = min(Subtraction(:));
    Max_S = max(Subtraction(:));
    Subtraction = ((Subtraction-Min_S)/(Max_S-Min_S))*255;
    Subtraction = uint8(Subtraction);

    % Mengkonversi citra menjadi biner menggunakan metode Otsu
    Subtraction = ~im2bw(Subtraction,graythresh(Subtraction));

    % Operasi Morfologi
    bw = imfill(Subtraction,'holes');
    bw = bwareaopen(bw,10);

    % Pembuatan masking dan proses cropping
    [row,col] = find(bw==1);
    h_bw = imcrop(CurrentFrame,[min(col) min(row) max(col)-min(col) max(row)-min(row)]);

    [a,b] = size(bw);
    mask = false(a,b);
    mask(min(row):max(row),min(col):max(col)) = 1;
    mask = bwperim(mask,8);
    mask = imdilate(mask,strel('square',3));

    R = CurrentFrame(:,:,1);
    G = CurrentFrame(:,:,2);
    B = CurrentFrame(:,:,3);

    R(mask) = 255;
    G(mask) = 0;
    B(mask) = 0;

    RGB = cat(3,R,G,B);

    mov(x).cdata = RGB;
end

Gambaran pada proses koding di atas adalah sebagai berikut:

No Proses CurrentFrame BackgroundFrame
1 Membaca citra Frame
2 Mengkonversi citra Frame menjadi citra grayscale
3 Mengkurangkan antara CurrentFrame dengan BackgroundFrame
4 Mengkonversi citra hasil pengurangan menjadi citra biner
5 Melakukan operasi morfologi untuk menghilangkan noise
6 Membuat masking hasil deteksi
7 Memvisualisasikan hasil deteksi ke dalam citra Frame

5. Menjalankan citra hasil deteksi secara sekuensial dalam bentuk video

hf = figure;
set(hf,'position',[300 300 vidWidth vidHeight]);

movie(hf,mov,1,vid.FrameRate);
close

Sehingga diperoleh video seperti pada Gambar di bawah ini:

Tampilan video pada setiap detik adalah:

Detik ke- Frame
0
1
2
3
4
5

File source code lengkap beserta video pada pemrograman di atas dapat diperoleh melalui halaman berikut: Source Code

Save

Tutorial untuk mendeteksi objek bergerak dengan metode background subtraction dapat dilihat pada video berikut ini:

Posted on July 6, 2016, in Pengolahan Video and tagged , , , , , , , , , , , , , , , , . Bookmark the permalink. 17 Comments.

  1. mas aku mau deteksi gerakan tp pake ipcam, akuisisi video nya gimana ya? ipcam ku ga bisa kedetect sm laptop. makasih mas

  2. mas besok senin ada di lab fisika undip? kalo iya boleh sy kesana mas?

  3. kalo video bkan dr kamera fixed alias kameranya bergerak jg tetep bisa tidak menggunakan background subtraction?

  4. mas mau tanya, kalo errornya dibagian pembacaan Video reader itu gimana ya mas,,,,??masih belum paham tentang pembacaan file videonya dan tempat video tersebut ditempatkan pada hdd,,,, apa disatukan dengan file .m -nya atau dipanggil berdasarkan tempat penyimpanan,,,??

    • ada banyak faktor penyebab error tsb
      di antaranya file video yg ingin diolah tidak dalam satu folder dg file koding matlab
      bisa juga karena software matlab yg diinstal tidak support dg toolbox video reader

  5. mas, untuk melakukan seleksi pejalan kaki atau bukan gimana yaa ?

  6. Yusuf Solihin

    assalamualaikum mas, boleh request bahas tentang tracking menggunakan metode kalman filter kah? saya sedikit kesulitan memahami kalman filter untuk traking pejalan kaki menggunakan drone 🙂 terimakasih banyak 🙂

  7. Mas, untuk function hasFrame untuk matlab 2014a bisa diganti dengan apa ya mas

  8. permisi mas selamat malam, saya sebagai pemula ,mau bertanya.
    1. apa fungsi dari angka 3 di
    mov = struct(‘cdata’,zeros(vidHeight,vidWidth,3,’uint8′)

    2. perbedaan rgb squish(1,2,3) sama back (3,3,3) angka nya sebagai apa mas?

    3. bukunya mas ada diproduksi lewat tokopedia gak??

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: