Rafał Petryniak Detekcja ruchu w OpenCV porównanie klatek

background image

Etykiety:

OpenCV

,

otwarty kod

,

systemy interaktywne

śro da, 6 kw ietnia 2011

Detekcja ruchu w OpenCV - porównanie klatek

OpenCV zostało stworzone i jest głównie używane tam, gdzie

jest potrzebna zaawansowana analiza sekwencji wideo. Jest to

narzędzie, które zawiera nie tylko funkcje obsługujące

pobieranie obrazu z kamery, ale również funkcje, które

potrafią ten obraz przetwarzać i wydobywać z niego ważne dla

nas informacje. W przypadku analizy sekwencji wideo jednym z ważniejszych zadań

jest detekcja miejsc, gdzie wystąpił ruch. Sama detekcja nie musi być szczególnie

problematyczna, jeśli chodzi nam jedynie o proste wskazanie obszarów, na których

coś się rusza. Wystarczy jedynie sprawdzić, które piksele na kolejnych klatkach

obrazu zmieniają swoją wartość i podjąć decyzję na ile ta zmiana powinna być

istotna, aby wykryć rzeczywisty ruch obiektu, a nie np. zaburzenia oświetlenia, bądź

też ruch cienia obiektu. Oczywiście istnieje wiele problemów, które wymagają

bardziej zaawansowanych algorytmów, aniżeli proste porównywanie obrazów.

Możemy do nich mi.in zaliczyć rozpoznawanie i śledzenie wybranych obiektów.

W dzisiejszym wpisie chciałem pokazać proste rozwiązanie problemu detekcji ruchu z

wykorzystaniem biblioteki OpenCV. Skorzystam tutaj z opisanej powyżej koncepcji

sprawdzania, które punkty obrazu zmieniają swoją wartość na kolejnych obrazach w

sekwencji wideo. Najłatwiej w tym celu skorzystać z operacji odejmowania obrazów,

a następnie binaryzacji obrazu wynikowego w celu określenia, jaka zmiana wartości

pikseli powinna zostać uznana za ruch obiektu, a jaka za brak ruchu. Najczęściej

stosuje się tutaj jedną z dwoch strategii odejmowania obrazów:

odejmowanie dwóch sąsiednich obrazów, tzn. odejmowanie od bieżącej

klatki, klatki poprzedniej,

odejmowanie od bieżącej klatki, pierwszej klatki, która została

zarejestrowana i która jest uznawana jako tło (zakładamy oczywiście, że na

pierwszej klatce nie ma obiektów, które później będą zmieniać swoje

położenie).

Oba powyższe podejścia pomimo tego, że są bardzo zbliżone do siebie dają całkiem

różne rezultaty. Pierwszy sposób wskazuje jedynie, na fragmenty obiektu, które

zmieniły swoją lokalizację w sekwencji ruchu, podczas gdy drugi powinien wskazać

cały obszar poruszającego się obiektu.

Implementacja opisanych metod w OpenCV nie nastręcza wiele problemów. Obydwa

sposoby mogą być zaimplementowane z pomocą poniższego fragmentu kodu:

//TESTED WITH OpenCV 2.2

int

diffType

=

atoi

(

argv

[

1

]

);

int

thresval

=

atoi

(

argv

[

2

]

);

Mat

cam_frame

,

img_gray

,

img_prev

,

img_diff

,

img_bin

;

bool

first_frame

=

true

;

// LOOP FOR GRABBING IMAGE FROM WEBCAM

cap

>>

cam_frame

;

cvtColor

(

cam_frame

,

img_gray

,

CV_BGR2GRAY

);

if

(

first_frame

)

{

img_prev

=

img_gray

.

clone

();

O M N I E

Na tym blogu piszę o swoich

zainteresowaniach związanych z

przetwarzaniem obrazów.

Zobacz więcej informacji o mnie

...

Osoby zainteresowane realizacją

wspólnych projektów proszę o kontakt

na maila: rpetryniak na gmail.com.

O S TA T N I E W P I S Y

Algorytm Perona-Malik

Rozprawa w sieci

Aplikacja interaktywna w OpenCV

reagującą na ruch

Zbiór przykładowych aplikacji Qt

Quick

"Generative art" teraz w moim

plecaku

K A T E G O R I E

analiza obrazu

aplikacje

cimg

cmake

creative common

dicom

docbook

galeria

google

ImageMagick

Insight Toolkit (ITK)

kde

ksi

ąż

ki

KWWidgets

licencje

linux

meego

mobile

OpenCV

oracle

otwarty kod

pandore

pomiary

Qt

rekomendowane

technologie

rozprawa

doktorska

rozwi

ą

zania

segmentacja

systemy interaktywne

Tcl

tomografia

video

Visualization ToolKit

(VTK)

wizualizacja

xml

A R C H I W U M

2012

(3)

2011

(17)

sierpień

(1)

lipiec

(2)

czerwiec

(1)

maj

(1)

kwiecień

(5)

Repozytorium dla przykładów

OpenCV na GitHub

Poprawiony szkielet aplikacji

interaktywnej dla Op...

Obiektowy szkielet aplikacji

interaktywnej dla Ope...

Rafał Petryniak

B log tech nicz n y o prz etwa rz a n iu obra z ów i n ie ty lko

Rafał Petryniak: Detekcja ruchu w OpenCV - porównanie klatek

http://rpetryniak.blogspot.com/2011/04/detekcja-ruchu-w-opencv-poro...

1 z 3

2012-03-25 15:51

background image

first_frame

=

false

;

continue

;

}

absdiff

(

img_gray

,

img_prev

,

img_diff

);

threshold

(

img_diff

,

img_bin

,

thresval

,

255

,

THRESH_BINARY

);

erode

(

img_bin

,

img_bin

,

Mat

(),

Point

(-

1

,-

1

),

3

);

dilate

(

img_bin

,

img_bin

,

Mat

(),

Point

(-

1

,-

1

),

1

);

imshow

(

win_cam

,

cam_frame

);

imshow

(

win_gray

,

img_gray

);

imshow

(

win_diff

,

img_bin

);

if

(

diffType

==

1

)

img_prev

=

img_gray

.

clone

();

// END LOOP

Analizując powyższy kod łatwo zauważyć, że jego działaniem możemy sterować za

pomocą dwóch zmiennych:

diffType

- określa, którą klatkę należy odejmować od klatki bieżącej, czy

poprzednią (wartość = 1), czy też pierwszą (wartość = 2). To sprawdzanie

odbywa się w ostatniej linijce powyższego kodu, gdzie jest ustawiana klatka,

która będzie odejmowana.

thresval

- zmienna ta będzie służyć do określania, co uznajemy za ruch

obiektu, a co nie. Polecam ustawiać ją w przedziale od 30 do 100 (60

powinno być w miarę bezpieczną, a zarazem skuteczną wartością progu).

Aby nie wchodzić w szczegółową analizę działania powyższego kodu, opiszę jedynie w

skrócie jego najważniejsze fragmenty:

W pierwszym przebiegu pętli zapamiętujemy jedynie pierwszą klatkę obrazu.

Dzięki temu w drugiej iteracji będziemy mieli co odejmować od klatki

bieżącej.

absdiff

- bezwzględne odjęcie (pomijamy znak) dwóch klatek od siebie.

threshold

- operacja progowania wykonywana na obrazie różnicowym.

Pomijamy punkty, które nieznacznie zmieniły swoją wartość.

erode

- usunięcie drobnych elementów, oraz wygładzenie krawędzi tych

większych. Skutkiem ubocznym tej operacji jest zmniejszenie rozmiaru

wszystkich obiektów.

dilate

- dylatację stosujemy po etapie erozji, aby delikatnie powiększyć

obiekty, tak aby miały podobny rozmiar jak to było przed erozją.

Aby dalej się nie rozpisywać na temat tego bądź co bądź krótkiego fragmentu kodu,

zapraszam do obejrzenia filmiku na którym widać obie opisywane metody w

działaniu.

Detekcja ruchu w OpenCV -

porównanie klatek

Obsługa parametrów wywołania

programu w C++

marzec

(4)

luty

(3)

2010

(8)

2009

(32)

2008

(16)

2007

(2)

Technologia

Blogger

.

Rafał Petryniak: Detekcja ruchu w OpenCV - porównanie klatek

http://rpetryniak.blogspot.com/2011/04/detekcja-ruchu-w-opencv-poro...

2 z 3

2012-03-25 15:51

background image

Nowszy post

Starszy post

Oglądaj film w rozdzielczości HD na pełnym ekranie.

0 komentarze:

Prześlij komentarz

Komentarz jako:

Strona główna

Subskrybuj:

Komentarze do posta (Atom)

O ile nie zaznaczono inaczej treść tej strony jest dostępna na licencji

Creative Common

Rafał Petryniak: Detekcja ruchu w OpenCV - porównanie klatek

http://rpetryniak.blogspot.com/2011/04/detekcja-ruchu-w-opencv-poro...

3 z 3

2012-03-25 15:51


Wyszukiwarka

Podobne podstrony:
Urazy narządu ruchu
PORÓWNYWANIE TECHNOLOGII
Metoda Ruchu Rozwijajacego Sherborne
Metodyka harcerska i starszoharcerska porównanie
Kształcenie ruchowe i metodyka naucznia ruchu
Porównanie dwóch regionalnych strategii innowacji
19 Teorie porównanie
Układ ruchu ppt
KOLOKWIUM 2 zadanie wg Adamczewskiego na porownawczą 97
Opory ruchu
1F CWICZENIE zadanie wg Adamczewskiego na porownawczą 97id 18959 ppt
Porównanie USB FireWire
Lekcja wychowania fizycznego jako organizacyjno metodyczna forma lekcji ruchu

więcej podobnych podstron