Fluxo óptico aproximado rápido / mudança de imagem

9

Preciso detectar a rapidez com que uma câmera está fazendo o movimento panorâmico (horizontal / vertical) para alertar o operador para diminuir a velocidade.

A imagem inteira está se movendo como um bloco, não preciso de uma direção real (embora H ou V seja um bônus) e só preciso de uma magnitude aproximada - ou seja. disparar se mais de 'N' pixels mudarem entre os quadros.

As imagens são grandes e geralmente uniformes, cenas de baixo contraste, não tenho destaques óbvios para rastrear. Eu preciso fazer isso em tempo real (60fps) e sem usar toda a CPU.

A solução Niave é escolher um RoI no centro, encontrar bordas, calcular semelhanças entre pares de quadros, mudar um dos quadros para a esquerda / direita / cima / baixo por um pixel, repetir - encontrar mínimos.

Gostaria de saber se havia uma solução mais inteligente?

Martin Beckett
fonte

Respostas:

3

Provavelmente, se você estiver procurando por um método simples , é para aplicar os algoritmos de estimativa de movimento padrão, que são muito amadurecidos na classe de codecs de compressão MPEG. Eles são fáceis de entender e acho que você terá muitos códigos prontos para usar. Esse algoritmo produz vetor de movimento bloco por bloco - e então você pode encontrar o cluster mais proeminente e obter a direção e magnitude média do vetor de movimento.

MPEG4 - possui outro conceito-chave chamado " Compensação de movimento global ", uma técnica que tenta primeiro estimar e compensar o movimento e o movimento da câmera. O bom é que esses métodos podem ser mais simples ou exaustivos, dependendo da complexidade. Aqui está um exemplo de papel e outro artigo para o mesmo.

Em geral, o panorama da câmera e a estimativa de movimento são um domínio de pesquisa bastante estabelecido. aqui está uma referência: papel e outro artigo .

Nesse assunto. Você encontrará algoritmos rigorosos e precisos, além de simples e rápidos.

Dipan Mehta
fonte
Se eu puder conectar-me convenientemente a uma biblioteca MPEG que seria boa, lembro que o GMC em Mpeg teve críticas. Eu pensei que seria uma área comum por causa de algoritmos de estabilização de câmera
Martin Beckett
Você pode definitivamente conectar (ou extrair) algoritmos MPEG. Você pode usar o FFMPEG como biblioteca e extrair isso - mas pode ser complicado. Como alternativa, você pode ler o código puro do MSSG para extrair.
Dipan Mehta 31/03
Em relação às críticas ao GMC - é uma promessa promissora reduzir drasticamente a taxa de bits e criar codificação baseada em objetos . No entanto, não é tão difícil estimar os parâmetros de movimento da câmera.
Dipan Mehta 31/03
obrigado, vou dar uma olhada no MSSG. Eu uso o ffmpeg, mas não é uma biblioteca fácil de extrair!
Martin Beckett
3

Essa pode ser uma solução lenta e terrível, mas você pode fazer uma correlação cruzada baseada em FFT dos quadros subsequentes e, em seguida, encontrar o pico para identificar o deslocamento entre os quadros. Talvez faça isso apenas em um pequeno subconjunto da imagem para salvar os ciclos do processador.

Não funcionaria com rotação ou mudanças drásticas de cena de um quadro para o seguinte, e provavelmente existem métodos melhores. É como uma solução "Eu tenho um martelo, então tudo parece uma unha". Eu acho que isso é exatamente como a sua solução ingênua, exceto que não há necessidade de detecção de borda e a FFT torna muito mais rápido do que mudar explicitamente um pixel de cada vez.

Essa pergunta é semelhante e ninguém está sugerindo outra coisa senão correlação cruzada, então talvez não seja tão ruim: Usando o MATLAB para calcular o deslocamento entre imagens sucessivas

endólito
fonte
Obrigado, é fácil supor que a FFT é lenta, mas posso fazer uma pequena janela 2 ^ n. ps. Apenas para a pesquisa stackoverflow.com/questions/1100100/…
Martin Beckett
3

Uma maneira de estimar a velocidade e a direção seria fazer uma estimativa de fluxo "local" de, por exemplo, quatro janelas no centro da imagem. O método diferencial Lucas-Kanade assume que o deslocamento é aproximadamente constante e, portanto, é possível resolver como uma equação.

Portanto, meu guia passo a passo seria:

  1. Obtenha uma janela de pixels no centro da imagem, por exemplo, 20x20
  2. Calcule os gradientes Ix e Iy.
  3. Divida a janela de gradiente em quatro partes, por exemplo, 4x10x10.
  4. Resolva as quatro equações dos mínimos quadrados lineares com o próximo quadro.
  5. Média dos quatro vetores de velocidade.

Isso determina a direção e a velocidade; no entanto, você pode usar uma janela ponderada para torná-la mais robusta. Veja o método Lucas-Kanade para suas extensões.

aagaard
fonte
0

Eu acho que a correlação cruzada é uma boa abordagem para encontrar o deslocamento, mas se você quiser fazê-lo muito rápido, tente restringi-lo a apenas uma única linha de varredura vertical e uma única horizontal (ou seja, através do centro da imagem). O cálculo da correlação cruzada entre as linhas de varredura nos dois quadros deve fornecer uma aproximação do deslocamento horizontal e vertical.

meanderix
fonte
Isso pode funcionar, mas se estiver girando na diagonal, não funcionará bem, mesmo que seja apenas um pouco instável para cima e para baixo enquanto se move lateralmente. Eu acho que uma sub-região retangular no centro da imagem seria melhor.
Endolith 04/04