Pregunta

Estoy usando EmguCV y estoy tratando de restar 2 imágenes para crear un filtro similar al de AForge .NET. Moverse hacia filtrar.

Esto es lo que intenta hacer mi versión ligeramente modificada de la URL anterior.Dadas 2 imágenes, la fuente y la superposición, mueve lentamente la imagen fuente hacia la superposición.Lo hace basándose en lo siguiente:

result = source + movementFactor * (overlay - source);

donde resultado, fuente y superposición son imágenes y factor de movimiento es la tasa de cambio en el rango de 0 a 1.

Cuando probé esto en código con factor de movimiento igual a 1, los resultados parecían confusos (había algo así como un rastro de movimiento).Para probarlo más a fondo, eliminé el factor de movimiento de la ecuación anterior e hice resultado = fuente + superposición - fuente.Esperaba ver la imagen superpuesta como resultado, lo cual hice, pero junto con una región de la imagen que parpadeaba.

Supongo que las intensidades de los píxeles se recortan en los límites superior o inferior cuando se realiza la suma/resta.

Puedo lograr lo que quiero con esto:

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));
    }
}

Pero esto ralentiza significativamente el procesamiento.¿Cómo puedo superar el problema de suma/resta o el problema de velocidad con lo anterior?¡Gracias por tus respuestas!

¿Fue útil?

Solución

Publicaré la respuesta que encontré aquí, en caso de que alguien se encuentre con el mismo problema en el futuro.

Así es como lo harías:

Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);

Fuente:Foros de EmguCV, aquí está el correo eso me dio la respuesta

Otros consejos

Publicaré la respuesta que encontré aquí, en caso de que alguien corra el mismo problema en el futuro.

Así es como lo harías:

Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result); 

Fuente:Foros de Emgucv, aquí está la publicación que me dio la respuesta

Tenga en cuenta que existe una sintaxis más limpia para eso:

var result = frame.AddWeighted(1.0 - movementFactor, overlay, movementFactor, 0.0);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top