Pengolahan Video untuk Mendeteksi Objek Bergerak dengan Metode Background Subtraction


Berikut ini merupakan 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
Frame 1
1
Frame 16
2
Frame 31
3
Frame 46
4
Frame 61
5
Frame 76

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

Background

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
Frame 76

Background
2 Mengkonversi citra Frame menjadi citra grayscale
CurrentFrame_gray

Background_gray
3 Mengkurangkan antara CurrentFrame dengan BackgroundFrame
Subtraction_gray
4 Mengkonversi citra hasil pengurangan menjadi citra biner
Subtraction_binary
5 Melakukan operasi morfologi untuk menghilangkan noise
bw
6 Membuat masking hasil deteksi
mask
7 Memvisualisasikan hasil deteksi ke dalam citra Frame
RGB

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:
Video

Tampilan video pada setiap detik adalah:

Detik ke- Frame
0
RGB
1
RGB
2
RGB
3
RGB
4
RGB
5
RGB

Video dan Source Code pada pemrograman di atas dapat diunduh pada laman berikut: link

Save

Posted on July 6, 2016, in Pengolahan Video and tagged , , , , , , , , , , , , , , , , . Bookmark the permalink. 5 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?

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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s

%d bloggers like this: