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!

Foi útil?

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

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

Note que há uma sintaxe mais limpa para que:

var result = frame.AddWeighted(1.0 - movementFactor, overlay, movementFactor, 0.0);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top