Como posso comparar duas fotos da câmera e saber se existem diferenças suficientes para detectar movimento?

18

Quero usar meu telefone como um sistema de CFTV para controlar um cômodo da minha casa e exibir um alerta quando algo estiver em movimento.

Por enquanto, o que consegui fazer é tirar uma foto a cada minuto e enviá-las por meio de um script PHP para o meu servidor. Agora, eu gostaria de comparar a imagem atual e a imagem 1 minuto atrás e detectar se alguém entrou na sala. Então, basicamente, eu precisaria comparar as diferenças de pixels na imagem (mas também levando em consideração que uma nuvem pode apenas dizer olá e alterar o brilho durante um minuto)

Alguém tem alguma pista sobre como conseguir esse documento ou algum documento para ler?

Waza_Be
fonte
4
Eu fiz algo assim anos atrás. Minha técnica foi dividir a imagem em seções, digamos uma grade 20 * 20, encontrar um valor para a cor média em cada célula (pegando a cor média em cada pixel naquela célula) e armazenando-a. Faça o mesmo para a próxima imagem e, se houver uma diferença suficiente (deixarei essa tolerância com você) nas cores médias, você poderá assumir o movimento. Não faça a tolerância tão fina que vai notar mudanças sutis na luz ou passar sombras etc.
1
Aqui está uma publicação interessante sobre o assunto, que você pode achar útil codeproject.com/KB/audio-video/Motion_Detection.aspx #
CHDK também divide a imagem em uma grade. chdk.wikia.com/wiki/UBASIC/Scripts:_AdaptiveMD Para detectar movimento e não detectar alterações na iluminação, eu diria que uma mudança em muitas células da grade não é movimento, enquanto uma alteração em apenas algumas células da grade é.
endolith

Respostas:

10

Parece-me que você está procurando uma técnica de subtração em segundo plano. Com imagens barulhentas e mudanças nas condições de iluminação, pode não ser trivial. A técnica atual do estado da arte para isso é a representação matricial de baixo escalão, mas exige não duas, mas muitas (~ dúzias) imagens. Seguem algumas matemáticas de serviço pesado: cada imagem considerada como um vetor de pixels, vetores combinados em matriz e essa matriz é decomposta em matriz e remanescente de baixo escalão. As colunas da matriz de baixa classificação são fundos e o restante está movendo objetos. Existem algumas implementações de código aberto, mas apenas para a fatoração em si, não o pipeline de imagem completo IIRC

Aqui estão um documento e um código para a fatoração matricial http://www.ece.rice.edu/~aew2/sparcs.html

Aqui está uma visão geral do blog do CS e link para outro código:

https://sites.google.com/site/igorcarron2/matrixfactorizations

http://nuit-blanche.blogspot.com/search/label/MF

Pesquisa de algumas outras técnicas: http://www.vis.uni-stuttgart.de/uploads/tx_vispublications/Brutzer2011-2.pdf

mirror2image
fonte
1
você fez intencionalmente essa CW?
Lorem Ipsum
1
O que significa "CW"?
Mirror2image
Ahh, pergunta do wiki. Eu pensei que seria uma boa idéia apresentar esses novos técnicos para fazer coisas práticas. Sinta-se livre para removê-lo se você não concordar. Também outras pessoas podem ter mais experiência com essa tecnologia - eu só comecei a entrar nela.
Mirror2image
Uma CW é uma pergunta do wiki da comunidade. O que isso significa é que você não obterá reputação (neste caso, 4x10 = 40) pelos votos positivos na sua resposta. Algumas pessoas intencionalmente dão suas respostas assim, mas na maioria das vezes é acidental. Reverti isso para você, para que você obtenha seu representante. É agora 181 126 :)
Lorem Ipsum
5

Lembre-se: existem sombras (não apenas brilho).

Eu realmente não gosto da idéia de James Webster, já que ela basicamente reduz a resolução em cada dimensão e compara as imagens reduzidas (também não gosto de limites - eles são arbitrários, você precisa testá-los e ajustá-los) até você obter um bom valor e no dia seguinte esses valores ficarem obsoletos por causa do clima diferente ou de outros efeitos ambientais)

Mas, para ser justo, também não tenho uma solução muito boa. Minha primeira idéia foi diferenciar cada imagem com uma imagem de referência da sala vazia e executar uma detecção de borda na imagem diferencial. Mas isso também detectaria sombras. Mas acho que você não pode diferir entre sombras e outros objetos ... pelo menos não sei como. Mas talvez você possa comparar o resultado após a detecção do Edge entre dois quadros, já que as sombras estão se movendo lentamente (ainda haverá problemas quando os carros passam ou quando uma nuvem passa)

Philipp Wendt
fonte
Você deseja detectar algo que muda repentinamente. As sombras não mudam muito de um minuto para o outro. O brilho geral do sol, no entanto.
endolith
2
As sombras se moverão rapidamente, se houver, por exemplo, um carro passando e soltando sua própria sombra pela janela ou sombras de alguns outros objetos pelo farol.
Philipp Wendt
4

A técnica de "fatoração matricial" NÃO o ajudará a fazer seu trabalho! O artigo referido por @ mirror2image é sobre a subtração de segundo plano, mas NÃO com base na "fatoração da matriz".

Usar o vídeo em execução para detectar objetos em movimento (humanos ou veículos) é uma área ativa de pesquisa.

Como princípio básico, o sistema estima um plano de fundo estático típico através da amostragem de várias fotos e leva uma diferença de energia entre a imagem recebida e o plano de fundo. Se a energia é significativa, o pixel é classificado como primeiro plano. Esse conjunto de primeiro plano informa se existe uma entrada do objeto no sistema.

A melhor referência ao seu trabalho de pesquisa (e também relativamente mais simples, se você realmente deseja implementar) seria: o W4 System o encontra aqui e o artigo Picardi aqui como uma pesquisa mais detalhada para outras técnicas no sistema.

Existem muitos desafios que se aplicam ao problema:

  1. A presença de ruído cria questões de grande ambiguidade. A abordagem aqui é aplicar filtragem temporal eficiente e considerar a variação do ruído para torná-lo imune ao limiar.

  2. A presença da sombra cria ambiguidade de nem ser um primeiro plano nem. Existem trabalhos que modelam a distinção cor x intensidade para distinguir sombra x primeiro plano real.

  3. O fundo pode ser complexo, como agitar árvores ou mar etc.

  4. O fundo pode ter variação lenta ou repentina da iluminação, onde o fundo "aprendido" anterior é então adaptado ao novo.

Um dos documentos de referência mais referidos é chamado algoritmo de flor de parede, que mostra a melhor maneira de combinar vários cenários para produzir uma detecção robusta de objetos em movimento.

Dipan Mehta
fonte
2

Não sei a solução exata, mas você deve fazer algum tipo de hash da imagem; um conjunto de dados menor extraído da imagem, comparável melhor do que a imagem inteira.

Eu acho que o histograma colorido é uma boa escolha para ele.

Se você dividir sua imagem em áreas e criar histogramas separados para essas áreas, poderá determinar a posição / caminho do invasor.


fonte
Muito obrigado, vou esperar por outras soluções, se não encontrar melhor, aceitarei a sua. Para sua informação, não quero determinar o caminho do invasor, pois 1 minuto não é suficiente para isso, mas apenas enviar um alerta é ótimo. Obrigado.
1
Cuidado, alguns intrusos podem terminar em 1 minuto! Faça a verificação o mais frequente possível. Se o seu programa estiver muito lento, diminua a resolução da imagem.
1
Sim, na verdade, pretendo tirar uma foto a cada 10 segundos e enviá-las apenas quando detectar um invasor, ou a cada minuto quando não houver problema.
1

Tomar a diferença duas vezes, ou seja, a diferença de diferenças pode ajudar. Portanto, se a derivada dupla de pixels for maior que um limite em algumas regiões, você poderá denominá-la como alguém que entrou na sala. A mudança no brilho fornecerá gradiente aproximadamente constante em toda a imagem, mas usar o Hessian ou derivada dupla fornecerá uma boa indicação de movimento ou grandes mudanças na sala.

KV Vijay Girish
fonte