que jpg imagen formato convertir opengl graphics opencv opencl image-rotation

opengl - convertir - formato de imagen jpg



Girar cientos de archivos JPEG en segundos en lugar de horas (3)

Hay un plugin jpeg no-recompression para irfanview que IIRC puede rotar y cambiar el tamaño de las imágenes (de manera simple) sin recompresión, también puede ejecutar un directorio de imágenes, esto debería ser mucho más rápido

La GPU probablemente no ayudaría, casi con toda seguridad está limitado a E / S en opencv, en realidad no está optimizado para el acceso a archivos de alta velocidad

Tenemos cientos de imágenes que nuestra computadora recibe a la vez y necesitamos rotarlas y redimensionarlas lo más rápido posible. La rotación se realiza en 90, 180 o 270 grados.

Actualmente estamos usando la herramienta de línea de comandos GraphicsMagick para rotar la imagen. Rotar las imágenes (5760 * 3840 ~ 22MP) toma alrededor de 4 a 7 segundos.

El siguiente código python tristemente nos da resultados iguales

import cv img = cv.LoadImage("image.jpg") timg = cv.CreateImage((img.height,img.width), img.depth, img.channels) # transposed image # rotate counter-clockwise cv.Transpose(img,timg) cv.Flip(timg,timg,flipMode=0) cv.SaveImage("rotated_counter_clockwise.jpg", timg)

¿Hay una forma más rápida de rotar las imágenes usando la potencia de la tarjeta gráfica? OpenCL y OpenGL vienen a la mente, pero nos preguntamos si un aumento en el rendimiento sería notorio.

El hardware que estamos utilizando es bastante limitado ya que el dispositivo debe ser lo más pequeño posible.

El software es Debian 6 con controladores radeon oficiales (de código cerrado).


puede realizar una rotación sin pérdida que simplemente modificará la sección EXIF. Esto rotará tus fotos más rápido.

y eche un vistazo a la utilidad jpegtran que realiza modificaciones jpeg sin pérdidas. http://linuxmanpages.com/man1/jpegtran.1.php


No soy un experto en temas de jpeg y compresión, pero como su problema es bastante limitado a E / S (suponiendo que pueda rotar sin una computación pesada relacionada con de / codificación), es posible que no pueda acelerarlo mucho en la GPU que tienes. (Un) Afortunadamente su referencia es una CPU Atom bastante lenta.

Supongo que el Radeon tiene memoria principal separada. Esto significa que los datos deben comunicarse a través de PCI-E, que es la latencia adicional en comparación con la ejecución de la CPU y sin ocultar puede estar seguro de que es el cuello de botella. Esta es la razón más probable por la que su código que usa OpenCV en la GPU es lento (además del hecho de que hace dos operaciones de memoria, transposición y volteo, en lugar de una sola).

La clave es ocultar la mayor cantidad posible de tiempos de transferencia de PCI-E con el cálculo mediante el uso de buffer múltiple . La superposición de transferencias hacia y desde la GPU con el cálculo mediante el uso de la capacidad de dúplex completo de PCI-E solo funcionará si la tarjeta en cuestión tiene motores DMA dual como Radeons de gama alta o las tarjetas NVIDIA Quadro / Tesla - que dudo mucho.

Si el tiempo de cálculo de su GPU (el tiempo que tarda la GPU en hacer la rotación) es menor que el tiempo que tarda la transferencia, no podrá superponerse por completo. La HD 4530 tiene una interfaz de memoria bastante lenta con solo 12,8 Gb / s de pico, y el núcleo de rotación debe estar bastante atado a la memoria. Sin embargo, solo puedo estimar, pero diría que si alcanzas la velocidad de transferencia máxima PCI-E de ~ 1.5 Gb / s (4x PCI-E AFAIK), el kernel de cómputo será unas veces más rápido que la transferencia y tú " Seré capaz de superponer muy poco. Simplemente puede sincronizar las piezas por separado sin requerir un código asincrónico elaborado y puede estimar qué tan rápido puede obtener cosas con una superposición óptima.

Una cosa que debería considerar es obtener hardware que no muestre PCI-E como un cuello de botella, por ejemplo:

  • Sistema AMD APU . En estas plataformas, podrá bloquear la memoria de la página y usarla directamente desde la GPU;
  • GPU integradas que comparten la memoria principal con el host;
  • una CPU rápida de bajo consumo como un Intel Ivy Bridge móvil, por ejemplo, i5-3427U, que consume casi tan poco como el Atom D525 pero tiene soporte AVX y debe ser varias veces más rápido.