Najlepsza odpowiedź
Tło:
Moment to miara ilościowa (deskryptor), popularnie stosowana w mechanice i statystyce , opisać przestrzenne rozmieszczenie zbioru punktów. Mówiąc najprościej, momenty są zbiorem skalarów, które zapewniają zagregowaną miarę zbioru wektorów. Definicja momentów jest taka sama we wszystkich dziedzinach mechaniki, statystyki i wizji komputerowej. Zbiór momentów zaczyna się od najgrubszego opisu zbioru wektorów i stopniowo wraz z wyższymi rzędami zaczyna być bardziej wrażliwy na struktury lokalne w zbiorze wektorów. Wybór użytecznej kolejności momentu zależy od rozkładu danych i zbiorów wektorów, które chcę rozróżnić.
Jeśli punkty reprezentują masę , wtedy zerowy moment jest całkowitą masą, pierwszy moment podzielony przez całkowitą masę to środek masy , a drugi moment to bezwładność obrotowa . Jeśli punkty reprezentują gęstość prawdopodobieństwa , to moment zerowy jest całkowitym prawdopodobieństwem (tj. jeden ), pierwszy moment to średnia , drugi to wariancja , trzeci moment to skośność , a czwarty moment (z normalizacją i przesunięciem) to kurtoza . [Wikipedia: Moments (Mathematics)]
Momenty na obrazach:
Pojęcie momentu w statystyce i mechanice zostało zapożyczone z wizji komputerowej, aby zgrubnie opisać obraz. W przypadku obrazów o intensywności pikseli I ( x , y ), momenty nieprzetworzonego obrazu M\_ {ij} są obliczane przez
M\_ {ij} = \ sum\_ {x} \ sum\_ {y} I (x, y)
, gdzie i, j to kolejność momentów. W typowym potoku obliczania momentu obrazu obraz I (x, y) jest konwertowany na zestaw wektorów poprzez najpierw obliczenie obrazu w skali szarości, a następnie użycie detektora narożnego lub krawędziowego w celu zredukowania obrazu do zestawu istotnych punktów. Przestrzenne rozmieszczenie tych punktów charakteryzuje obraz w tym sensie, że obraz o różnej treści wizualnej będzie miał mierzalnie różne przestrzenne rozmieszczenie istotnych punktów. Różne rzędy momentów obrazu (zbiór istotnych punktów) zapewnia masę, środek ciężkości, główną oś itp. Obrazu.
Momenty w OpenCV:
Przykład obliczania momentów dla obraz w opencv.
Mat src, gray; // opencv matrices for the image and its grayscale
src = imread(
"../path/to/image.jpg"
, 1 ); // load the image
cvtColor( src, gray, CV\_BGR2GRAY ); // convert to grayscale
vector
vector
//Detect edges using canny
Canny( gray, canny\_output, 50, 150, 3 ); // canny edges are low-level image structures that are used by contour detector
//Find contours
findContours( canny\_output, contours, hierarchy, CV\_RETR\_TREE, CV\_CHAIN\_APPROX\_SIMPLE, Point(0, 0) );
// Get the moments of image
vector
for
(
int
i = 0; i
{ mu[i] = moments( contours[i],
false
); }
//Get the mass centers (image has multiple contours):
vector
for
(
int
i = 0; i
{ mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); } // compute the centers of mass of each contour in the image
W tym przykładzie moment środka ciężkości obrazu jest przydatny do znalezienia położenia wielu obiektów na obrazie. Jeśli obraz zawiera wiele osób (zakładając, że problemy z bałaganem w tle zostały rozwiązane) i ktoś był zainteresowany przybliżoną lokalizacją każdej osoby, moment centroidu jest odpowiednim rozwiązaniem.
Możesz sobie wyobrazić podobne scenariusze, w których wyższa kolejność momentów staje się istotna, na przykład w śledzeniu samochodów orientację samochodów i pozycję można łatwo przedstawić za pomocą centroidów, wariancji i momentów obrazu osi orientacji.
Odpowiedź
Pytanie, które zadałeś na temat OpenCV, można również ogólnie odnieść do widzenia komputerowego. Czy możemy wykryć ludzi w pomieszczeniu z dokładnością 95-100\%?
Odpowiedź zależy od wielu czynników:
Scenariusz 1: W pokoju jest 15 osób, siedzących w odpowiedniej pozycji, twarzą do kamery. Wszystkie są dobrze widoczne, nikt nie jest zasłonięty. Oświetlenie jest jasne i jednolite. Aparat jest dość dobry.
Jasne, w takim przypadku możemy osiągnąć> 99\% dokładność.Czy to OpenCV, czy inna biblioteka głębokiego uczenia się, jesteś na bezpiecznych wodach. Zbudowanie takiego systemu nie powinno być trudniejsze / wymagające niż rutynowy projekt w szkole średniej.
Scenariusz 2: W pokoju znajduje się 15 osób, siedzących w odpowiedniej pozycji twarzą do kamery. Niektóre z nich zatykają się nawzajem. Nie ma gwarancji jakości oświetlenia. Część z nich może nosić niestandardowe okulary, nakrycia głowy lub dziwny makijaż. Aparat nadal jest dość dobry.
Zaczyna się robić trochę skomplikowanie. W takich przypadkach OpenCV może nie zapewnić dokładności> 99\%. TensorFlow lub inna architektura głębokiego uczenia może nadal działać. Facebook rutynowo identyfikuje i oznacza osoby w takich sytuacjach. Czy są w 100\% dokładne? To zależy. Zbudowanie takiego systemu przy użyciu wszystkich bibliotek open source, którymi dysponujemy, może nie być proste. Jednak nie jest to również trudne. Przy odrobinie wysiłku i szczęścia osiągnięcie> 95\% może być osiągalne.
Scenariusz 2: W pomieszczeniu znajduje się 15 osób, siedzących w odpowiedniej pozycji, niekoniecznie przodem do kamery. Niektóre z nich zatykają się nawzajem. Oświetlenie jest kiepskie. Ma tendencję do niedoświetlania lub prześwietlania ludzi na obrazie. Część z nich może nosić niestandardowe okulary, nakrycia głowy lub dziwny makijaż. Aparat to kamera internetowa VGA sprzed 15 lat.
Teraz nie masz żadnych gwarancji co do dokładności, niezależnie od używanych narzędzi. Ten problem graniczy teraz z projektem badawczym.
Odpowiedź na Twoje pytanie zależy od scenariusza, którym chcesz się zająć.