es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La manera más rápida de convertir un búfer de datos de imagen entrante a un mapa de bits (utilizando Winform C# y la biblioteca Aforge)

Tengo un proyecto y tengo dos cámaras web que enviarán fotogramas y luego el programa debe extraer unos pocos colores en los fotogramas.
Estoy usando la biblioteca Aforge para esto y he editado los métodos de Aforge.Video.DirectShow y ahora el evento del remitente me enviará el búfer de datos del fotograma de la cámara web y su longitud.
Tengo problemas para convertir estos datos del fotograma de la cámara web en un mapa de bits.

Este proyecto es parte del proyecto de seguridad humana y es importante procesar los marcos muy rápido, ahora el tiempo de este proceso de conversión es de aproximadamente 1.30ms.

Después de un poco de intentarlo, descubrí que cuando establezco InvalidarDatosDeImagen en falso, el problema se resolverá y el tiempo de procesamiento será de alrededor de 0.5ms, y esto es bueno. Pero el siguiente problema después de hacer esto ocurre al extraer el color en otro método que contiene el fotograma de este método y allí el proceso LockBit lleva mucho tiempo (~1.2ms) y si establezco InvalidateImageData en verdadero en el método principal, el problema se resolverá y LockBit llevará un tiempo de alrededor de ~0.4ms, ¡pero me enfrentaré al primer problema nuevamente!

¿Por qué el proceso LockBit lleva tiempo cuando InvalidateDatosDeImagen es falso en Bitmap.FromStream?
¿Hay alguna manera más rápida de convertir búferes de datos de imagen (JPG o JPEG) en un mapa de bits?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Respuestas

    ¿Por qué el proceso de bloqueo de bits tarda tiempo cuando InvalidateImageData es false en Bitmap.FromStream?

    Cuando se establece InvalidateImageData en false en Bitmap.FromStream, los datos del bitmap se marcan como válidos y se puede llamar a LockBits sin necesidad de volver a crear los datos de píxeles del bitmap. Esto puede mejorar el rendimiento, pero también significa que cualquier modificación realizada en los datos de píxeles del bitmap no se reflejará en la imagen hasta que se llame a Invalidate. El proceso de LockBits todavía puede tardar tiempo porque implica acceder y manipular los datos de píxeles sin procesar, pero debería ser más rápido que cuando InvalidateImageData es verdadero.

    ¿Hay alguna forma más rápida de convertir los búferes de datos de imagen (JPG o JPEG) en Bitmap?

    El método utilizado en el código proporcionado ya está optimizado para el rendimiento, pero hay algunas optimizaciones potenciales que podrían considerarse:

    1. En lugar de usar Bitmap.FromStream, intenta usar Bitmap.FromFile si los datos de imagen se almacenan en disco. Esto puede ser más rápido porque evita los gastos generados por la lectura y análisis de los datos de imagen.
    2. Si los datos de imagen están en un formato con el que AForge puede trabajar directamente, considera pasar por alto la conversión de Bitmap y trabajar directamente con los datos de imagen sin procesar. Por ejemplo, la clase VideoSourcePlayer de AForge tiene un evento NewFrame que proporciona acceso directo a un búfer IntPtr que contiene datos de imagen sin procesar. Este enfoque puede requerir más trabajo por adelantado para manejar correctamente los datos de imagen sin procesar, pero podría ser potencialmente más rápido que la conversión de Bitmap.

Comments are closed.