Wednesday 2 August 2017

Moving Average Opencv


Ainda estou cortando um script de varredura de livros, e por enquanto, tudo o que preciso é poder detectar automaticamente uma página. O livro preenche 90 da tela (eu uso uma webcam cruddy para a detecção de movimento), então, quando eu giro uma página, a direção do movimento é basicamente na mesma direção. Eu modifiquei um script de rastreamento de movimento, mas os derivativos estão me levando para lugar nenhum: ele detecta o movimento médio do centro médio de todas as caixas, o que é extremamente ineficiente. Como eu iria sobre a detecção de tais movimentos de forma rápida e precisa (ou seja, dentro de um limiar) Estou usando Python, e eu pretendo ficar com isso, já que minha estrutura inteira é baseada em Python. E a ajuda é apreciada, então agradeço a todos com antecedência. Cheers. Hi, este será um artigo muito simples, mas você vai achar muito útil. Trata-se de Extração de fundo de um vídeo. Suponha que você tenha um vídeo de filmagem de tráfego, pode ser uma coisa assim. Tráfego na Índia. E você é convidado a encontrar um fundo aproximado. Ou qualquer coisa assim. A extração de fundo vem importante no rastreamento de objetos. Se você já possui uma imagem do fundo nu, então é simples. Mas, em muitos casos, você não terá essa imagem e, então, você terá que criar uma. É aí que o Running Average é útil. (Eu pensei sobre isso quando um cara fez uma pergunta no SOF. Link) A função que usamos aqui para encontrar Running Average é cv2.accumulateWeighted (). Por exemplo, se estamos assistindo um vídeo, continuamos alimentando cada quadro para esta função, e a função continua encontrando as médias de todos os quadros alimentados a ele de acordo com a relação abaixo: src não é senão a nossa imagem de origem. Pode ser em escala de cinza ou imagem colorida e ponto flutuante de 8 bits ou 32 bits. Dst é a imagem de saída ou acumulador com os mesmos canais que a da imagem de origem, e é um ponto flutuante de 32 bits ou 64 bits. Além disso, devemos declarar primeiro um valor que será tomado como valor inicial. Alfa é o peso da imagem de entrada. De acordo com o Docs, o alfa regula a velocidade de atualização (o quão rápido o acumulador 8220forgets8221 sobre imagens anteriores). Em palavras simples, se o alfa é um valor maior, a imagem média tenta capturar mudanças muito rápidas e curtas nos dados. Se for menor valor, a média fica lenta e não considera mudanças rápidas nas imagens de entrada. Vou explicar um pouco com a ajuda de imagens no final do artigo. No código acima, estabeleci duas médias, uma com maior valor alfa e outra com menor valor alfa para que você possa entender o efeito do alfa. No início, ambos são configurados para o quadro inicial da captura. E em loop eles são atualizados. Você pode ver alguns resultados no link SOF que eu já forneci. (Eu forneço esses resultados aqui, você pode verificar o código e o valor alfa lá): usei minha webcam e economize o quadro original e a média de execução em um instante particular. Este é um quadro de um vídeo de tráfego típico tirado por uma câmera estacionária. Como você pode ver, um carro está indo na estrada, e a pessoa está tentando atravessar a estrada em um determinado instante de tempo. Mas veja a média de corrida naquele momento. Não há pessoa e carro nesta imagem (Na verdade, está lá, tenha uma aparência próxima, então você vai ver isso, e a pessoa é mais clara que o carro, já que o carro está se movendo muito rápido e através da imagem, não tem muito Efeito em média, mas a pessoa está lá por um longo tempo, já que ele está lento e se movendo através da estrada.) Agora precisamos ver o efeito do alfa sobre essas imagens. Imagens em movimento A explicação abaixo pertence ao livro Visão de Computador: Algoritmos E Aplicações de Richard Szeliski e LearningOpenCV Smoothing. Também chamado de desfocagem. É uma operação de processamento de imagem simples e freqüentemente usada. Existem muitas razões para suavizar. Neste tutorial, vamos nos concentrar no alisamento para reduzir o ruído (outros usos serão vistos nos seguintes tutoriais). Para realizar uma operação de suavização aplicaremos um filtro na nossa imagem. O tipo de filtro mais comum é linear. No qual um valor pixel8217s de saída (isto é) é determinado como uma soma ponderada de valores de pixels de entrada (isto é): ajuda a visualizar um filtro como uma janela de coeficientes que desliza através da imagem. Existem muitos tipos de filtros, aqui vamos mencionar os mais usados: Filtro de caixa normalizado Este filtro é o mais simples de todos. Cada pixel de saída é a média de seus vizinhos do kernel (todos eles contribuem com pesos iguais) O núcleo está abaixo: Gaussiano Filtro Provavelmente o filtro mais útil (embora não seja o mais rápido). A filtragem gaussiana é feita convolvendo cada ponto na matriz de entrada com um kernel Gaussiano e, em seguida, somando todos para produzir a matriz de saída. Apenas para tornar a imagem mais clara, lembre-se de como um kernel gaussiano 1D parece assumir que uma imagem é 1D, você pode notar que o pixel localizado no meio teria o maior peso. O peso de seus vizinhos diminui à medida que a distância espacial entre eles eo pixel central aumenta. Lembre-se de que um gaussiano 2D pode ser representado como: Filtro médio O filtro médio percorre cada elemento do sinal (neste caso, a imagem) e substitua cada pixel pela mediana dos pixels vizinhos (localizado em um bairro quadrado ao redor do pixel avaliado ). Filtro bilateral Até agora, explicamos alguns filtros, cujo principal objetivo é alisar uma imagem de entrada. No entanto, às vezes os filtros não só dissolvem o ruído, mas também suavizam as bordas. Para evitar isso (em certa medida pelo menos), podemos usar um filtro bilateral. De forma análoga ao filtro gaussiano, o filtro bilateral também considera os pixels vizinhos com pesos atribuídos a cada um deles. Esses pesos têm dois componentes, o primeiro dos quais é a mesma ponderação usada pelo filtro gaussiano. O segundo componente leva em consideração a diferença de intensidade entre os pixels vizinhos e o avaliado. Para uma explicação mais detalhada, você pode verificar este link. O que faz esse programa. Carrega uma imagem. Aplica 4 tipos diferentes de filtros (explicado em Theory) e mostra as imagens filtradas sequencialmente. Explicação Let8217s verifica as funções OpenCV que envolvem apenas o procedimento de suavização, já que O resto já é conhecido. Filtro de bloco normalizado: o OpenCV oferece a função desfocada para executar o alisamento com este filtro. Especificamos 4 argumentos (mais detalhes, verifique a Referência): src. Imagem de origem dst. Tamanho da imagem de destino (w, h). Define o tamanho do kernel a ser usado (de pixels de largura w pixels e altura h) Ponto (-1, -1). Indica onde o ponto de ancoragem (o pixel avaliado) está localizado em relação ao bairro. Se houver um valor negativo, o centro do kernel é considerado o ponto de ancoragem. É executado pela função GaussianBlur: Aqui usamos 4 argumentos (mais detalhes, verifique a referência OpenCV):

No comments:

Post a Comment