Bästa svaret
Bakgrund:
Moment är ett kvantitativt mått (deskriptor), populärt i mekanik och statistik , för att beskriva den rumsliga fördelningen av punkter. I de flesta förenklade termer är ögonblick uppsättning skalar som ger ett aggregerat mått på en uppsättning vektorer. Definitionen av ögonblick är densamma över domäner inom mekanik, statistik och datasyn. Uppsättningen av ögonblick börjar med den grovaste beskrivningen av uppsättningen vektorer, och gradvis med högre ordningar börjar den bli mer känslig för lokala strukturer i uppsättningen vektorer. Valet av användbar ordningsföljd beror på datafördelningen och de uppsättningar vektorer jag är intresserad av att skilja mellan.
Om punkterna representerar massa är nollmomentet den totala massan, det första ögonblicket dividerat med den totala massan är masscentrum , och det andra ögonblicket är rotationsinerti . Om punkterna representerar sannolikhetstäthet är nollmomentet den totala sannolikheten (dvs. en ), det första ögonblicket är medelvärdet , det andra ögonblicket är variansen , den tredje ögonblicket är skevhet , och det fjärde ögonblicket (med normalisering och skift) är kurtosis . [Wikipedia: Moments (Mathematics)]
Moments in images:
Momentet i statistik och mekanik har lånats ut i datorsyn för att grovt beskriva en bild. För bild med pixelintensiteter I ( x , y ), de råa bildmomenten M\_ {ij} beräknas av
M\_ {ij} = \ sum\_ {x} \ sum\_ {y} I (x, y)
, där i, j är ordning på ögonblick. I en typisk bildmomentberäkningspipeline omvandlas bilden I (x, y) till en uppsättning vektorer genom att först beräkna en gråskalebild och sedan använda en hörn- eller kantdetektor för att reducera bilden till en uppsättning framträdande punkter. Den rumsliga fördelningen av dessa punkter karaktäriserar bilden genom att en bild med olika visuellt innehåll kommer att ha en mätbart annan rumslig fördelning av framträdande punkter. De olika ordningarna av bildmoment (uppsättning framträdande punkter) ger massa, centroid, huvudaxel, etc. för bilden.
Ögonblick i OpenCV:
Exempel på beräkningsmoment för en bild i 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
I detta exempel är bildens centroidmoment användbart för att hitta platsen för flera objekt i bilden. Om bilden har flera personer (antar att problem med bakgrundsstörningar är lösta) och en var intresserad av en ungefärlig plats för varje person, är centroidmomentet en lämplig lösning.
Du kan föreställa dig liknande scenarier där högre ordning av ögonblick blir relevant, till exempel vid spårning av bilar, skulle bilarnas orientering och position enkelt kunna representeras av centroid, varians och orienteringsaxel bildmomenter.
Svar
Frågan du ställde om OpenCV kan också tillämpas på datorsyn i allmänhet. Kan vi upptäcka personer i ett rum med 95 – 100\% noggrannhet?
Svaret beror på många faktorer:
Scenario 1: Det finns 15 personer inne i ett rum som sitter i rätt position mot kameran. Alla är tydligt synliga, ingen täcks. Belysningen är ljus och enhetlig. Kameran är ganska bra.
Visst, vi kan göra> 99\% noggrannhet i ett sådant fall.Vare sig det är OpenCV eller något annat djupt lärande bibliotek, du är i säkert vatten. Att bygga ett sådant system borde inte vara svårare / utmanande än ett rutinprojekt i gymnasiet.
Scenario 2: Det finns 15 personer inne i ett rum som sitter i lämplig position mot kameran. Några av dem täcker varandra. Det finns ingen garanti för belysningens kvalitet. Vissa av dem kan ha på sig icke-standardglasögon, hattar eller konstig smink. Kameran är fortfarande ganska bra.
Det börjar bli lite knepigt. OpenCV kanske inte ger dig mer än 99\% noggrannhet i sådana fall. TensorFlow eller någon annan djupinlärningsarkitektur kan fortfarande fungera. Facebook identifierar och taggar rutinmässigt människor i sådana scenarier. Är de 100\% korrekta? Det beror på. Att bygga ett sådant system med alla de öppna källkodsbiblioteken som vi har till förfogande kanske inte är trivialt. Det är dock inte särskilt svårt heller. Med lite ansträngning och lite tur kan> 95\% uppnås.
Scenario 2: Det finns 15 personer i ett rum som sitter i lämplig position, inte nödvändigtvis mot kameran. Några av dem täcker varandra. Belysningen är skitig. Det tenderar att underexponera eller överexponera folket i bilden. Vissa av dem kan ha på sig icke-standardglasögon, hattar eller konstig smink. Kameran är en VGA-webbkamera från 15 år sedan.
Nu har du inga garantier för noggrannheten, oavsett vilka verktyg du använder. Detta problem gränsar nu till att bli ett forskningsprojekt.
Svaret på din fråga beror på vilket scenario du vill ta itu med.