EmguCV / OpenCV disso Imagem / subtração
-
16-09-2019 - |
Pergunta
Eu estou usando EmguCV e estou tentando subtrair 2 imagens para criar um filtro semelhante ao AForge .NET da MoveTowards filtro.
Isto é o que a minha versão ligeiramente modificada a partir das tentativas URL acima para fazer. Dado 2 imagens, a fonte ea sobreposição - se move lentamente a imagem de origem para a sobreposição. Ele faz isso com base no seguinte:
result = source + movementFactor * (overlay - source);
onde resultado, fonte e sobreposição são imagens e movementFactor é a taxa de mudança no intervalo de 0 a 1.
Quando eu tentei isso no código com movementFactor igual a 1, os resultados parecia confuso (havia algo como um rastro de movimento). Para testar ainda mais, eu removido movementFactor a partir da equação acima, e fez resultado = fonte de sobreposição + - fonte. Eu esperava ver a imagem de sobreposição, como resultado, o que fiz, mas junto com uma região da imagem que estava piscando.
Eu estou supondo que as intensidades de pixel se cortada nos limites superiores ou inferiores quando a adição / subtração ocorre.
Eu posso realizar o que eu quero com isto:
for (int i = 0; i < src.Height; i++)
{
for (int j = 0; j < src.Width; j++)
{
res[i, j] = new Gray(src[i, j].Intensity + movementFactor * (ovr[i, j].Intensity - src[i, j].Intensity));
}
}
Mas isso diminui significativamente o processamento. Como posso superar o problema de adição / subtração ou o problema de velocidade com o acima? Obrigado por suas respostas!
Solução
Vou postar a resposta que eu encontrei aqui, no caso de alguém atravessa o mesmo problema no futuro.
Esta é a forma como você faria isso:
Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);
Fonte: fóruns de EmguCV, aqui é o pós que me deu a resposta ??p>
Outras dicas
Vou postar a resposta que eu encontrei aqui, no caso de alguém é executado em todo o mesmo problema no futuro.
Esta é a forma como você faria isso:
Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size); CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);
Fonte: fóruns de EmguCV, aqui é o post que me deu a resposta ??p>
Note que há uma sintaxe mais limpa para que:
var result = frame.AddWeighted(1.0 - movementFactor, overlay, movementFactor, 0.0);