O que exatamente são momentos no OpenCV?

Melhor resposta

Histórico:

Momento é uma medida quantitativa (descritor), popularmente usada em mecânica e estatística , para descrever a distribuição espacial de um conjunto de pontos. Em termos mais simplistas, momentos são conjuntos de escalares que fornecem uma medida agregada de um conjunto de vetores. A definição de momentos é a mesma nos domínios da mecânica, estatística e visão computacional. O conjunto de momentos começa com a descrição mais grosseira do conjunto de vetores, e progressivamente com ordens superiores, começa a ficar mais sensível às estruturas locais no conjunto de vetores. A escolha da ordem de momento útil depende da distribuição dos dados e dos conjuntos de vetores que estou interessado em distinguir.

Se os pontos representam a massa , então o momento zero é a massa total, o primeiro momento dividido pela massa total é centro de massa , e o segundo momento é a inércia rotacional . Se os pontos representam densidade de probabilidade , então o momento zero é a probabilidade total (ou seja, um ), o primeiro momento é a média , o segundo momento é a variância , o terceiro momento é a assimetria , e o quarto momento (com normalização e deslocamento) é a curtose . [Wikipedia: Moments (Mathematics)]

Momentos nas imagens:

O conceito de momento nas estatísticas e na mecânica foi emprestado pela visão computacional para descrever uma imagem grosseiramente. Para imagens com intensidades de pixel I ( x , y ), os momentos da imagem bruta M\_ {ij} são calculados por

M\_ {ij} = \ sum\_ {x} \ sum\_ {y} I (x, y)

, onde i, j são a ordem dos momentos. Em um pipeline de cálculo de momento de imagem típico, a imagem I (x, y) é convertida em um conjunto de vetores, primeiro computando uma imagem em escala de cinza e, em seguida, usando um detector de canto ou borda para reduzir a imagem a um conjunto de pontos salientes. A distribuição espacial desses pontos caracteriza a imagem, em que uma imagem com conteúdo visual diferente terá uma distribuição espacial mensuravelmente diferente de pontos salientes. As várias ordens de momentos da imagem (conjunto de pontos salientes) fornecem massa, centroide, eixo principal, etc. da imagem.

Momentos em OpenCV:

Exemplo de momentos computacionais para uma imagem em 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 > contours; // image contour is set of salient points of the image we are interested in

vector hierarchy;

//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 mu(contours.size() );

for ( int i = 0; i

{ mu[i] = moments( contours[i], false ); }

//Get the mass centers (image has multiple contours):

vector mc( contours.size() );

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

Neste exemplo, o momento do centroide da imagem é útil para encontrar a localização de vários objetos na imagem. Se a imagem tiver várias pessoas (suponha que os problemas de desordem de fundo foram resolvidos) e um estava interessado em uma localização aproximada de cada pessoa, o momento do centroide é uma solução adequada.

Você pode imaginar cenários semelhantes em que ordem superior de momentos torna-se relevante, por exemplo, em carros de rastreamento, a orientação dos carros e a posição podem ser facilmente representadas por momentos de imagem de centróide, variação e eixo de orientação.

Resposta

A pergunta que você fez sobre o OpenCV também pode ser aplicada à visão computacional em geral. Podemos detectar pessoas dentro de uma sala com 95 – 100\% de precisão?

A resposta depende de muitos fatores:

Cenário 1: Há 15 pessoas dentro de uma sala, sentadas em suas posições apropriadas de frente para a câmera. Todos eles estão claramente visíveis, ninguém está sendo obstruído. A iluminação é clara e uniforme. A câmera é razoavelmente boa.

Claro, podemos ter uma precisão de> 99\% nesse caso.Seja OpenCV ou alguma outra biblioteca de aprendizado profundo, você está em águas seguras. Construir tal sistema não deve ser mais difícil / desafiador do que um projeto rotineiro de colégio.

Cenário 2: Há 15 pessoas dentro de uma sala, sentadas em suas posições apropriadas de frente para a câmera. Alguns deles se obstruem. Não há garantia sobre a qualidade da iluminação. Alguns deles podem estar usando óculos fora do padrão, chapéus ou maquiagem estranha. A câmera ainda está razoavelmente boa.

Isso começa a ficar um pouco complicado. O OpenCV pode não fornecer precisão> 99\% nesses casos. TensorFlow ou alguma outra arquitetura de aprendizado profundo ainda pode funcionar. O Facebook rotineiramente identifica e marca pessoas em tais cenários. Eles são 100\% precisos? Depende. Construir tal sistema usando todas as bibliotecas de código aberto à nossa disposição pode não ser trivial. No entanto, também não é muito difícil. Com um pouco de esforço e um pouco de sorte,> 95\% podem ser alcançados.

Cenário 2: Há 15 pessoas dentro de uma sala, sentadas em suas posições adequadas, não necessariamente de frente para a câmera. Alguns deles se obstruem. A iluminação é péssima. Isso tende a subexpor ou superexpor as pessoas na imagem. Alguns deles podem estar usando óculos fora do padrão, chapéus ou maquiagem estranha. A câmera é uma webcam VGA de 15 anos atrás.

Agora você não tem garantias sobre a precisão, independentemente das ferramentas que usa. Este problema agora está quase se tornando um projeto de pesquisa.

A resposta à sua pergunta depende de qual cenário você pretende abordar.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *