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