Comparar dos imágenes con fines de detección de movimiento

Comencé a diferenciar dos imágenes contando el número de píxeles diferentes usando un algoritmo simple:

private int returnCountOfDifferentPixels(String pic1, String pic2)
    {
        Bitmap i1 = loadBitmap(pic1);
        Bitmap i2 = loadBitmap(pic2);
        int count=0;

        for (int y = 0; y < i1.getHeight(); ++y)
               for (int x = 0; x < i1.getWidth(); ++x)
                    if (i1.getPixel(x, y) != i2.getPixel(x, y)) 
                        {
                        count++;
                        }

          return count;

    }

Sin embargo, este enfoque parece ser ineficiente en su forma inicial, ya que siempre hay un número muy alto de píxeles que difieren incluso en fotos muy similares. Estaba pensando en una forma de determinar si dos píxeles son realmente tan diferentes. el bitmap.getpixel (x, y) de android devuelve un objeto Color.

¿Cómo puedo implementar una diferenciación adecuada entre dos objetos de Color, para ayudar con mi detección de movimiento?

Respuesta 1

Tiene razón, debido al ruido y otros factores, generalmente hay muchos cambios de píxeles sin procesar en una transmisión de video. Aquí hay algunas opciones que puede considerar:

  1. Primero difumina la imagen, idealmente con un filtro gaussiano o con un filtro de caja simple. Esto solo significa que toma el promedio (ponderado) sobre el píxel vecino y el píxel mismo. Esto ya debería reducir bastante el ruido del sensor.

  2. Solo agregando la diferencia a countsi es mayor que algún umbral. Esto tiene el efecto de considerar solo los píxeles que realmente han cambiado mucho. Esto es muy fácil de implementar y ya puede resolver su problema solo.

Pensando en ello, prueba estas dos opciones primero. Si no funcionan, puedo darle algunas opciones más.

EDITAR: Acabo de ver que en realidad no estás sumando diferencias, sino contando diferentes píxeles. Esto está bien si lo combina con la Opción 2. La Opción 1 aún funciona, pero podría ser una exageración.

Además, para descubrir la diferencia entre dos colores, use los métodos de la clase Color :

int p1 = i1.getPixel(x, y);
int p2 = i2.getPixel(x, y);
int totalDiff = Color.red(p1) - Color.red(p2) + Color.green(p1) - Color.green(p2) + Color.blue(p1) - Color.blue(p2);

Ahora puede llegar a un umbral que totalDiffdebe superar para contribuir count.

Por supuesto, puedes jugar con estos números de varias maneras. El código anterior, por ejemplo, solo calcula cambios en la intensidad de píxeles (brillo). Si también quisiera tener en cuenta los cambios en el tono y la saturación, tendría que calcular totalDiffasí:

int totalDiff = Math.abs(Color.red(p1) - Color.red(p2)) + Math.abs(Color.green(p1) - Color.green(p2)) + Math.abs(Color.blue(p1) - Color.blue(p2));

Además, eche un vistazo a los otros métodos Color, por ejemplo RGBToHSV(...).

Respuesta: 2

He estado atrapado en este problema durante unos meses y todavía no puedo hacerlo funcionar. ¿Cómo comienzo a comunicarme, enviar comandos e imprimir a una impresora de recibos que está conectada a través de USB?

No sé si es una buena pregunta. EJB 3.1 ofrece la posibilidad de etiquetar los métodos con asychronous. Me pregunto si la llamada asíncrona dura más que el hilo del servlet o si el hilo del servlet ...

Codifiqué un servidor multiproceso y puede manejar muchos clientes que se conectan a la vez. El único problema es que solo se comunica con ese cliente específico. Aquí hay un ejemplo de lo que estoy tratando de lograr: ...

Esto debería ser relativamente sencillo, sin embargo, estoy inundado de información SQL cada vez que busco ayuda con esto. Básicamente tengo 3 clases y cada una genera un número y quiero ...