Archivos para 2 abril 2011

Porque no emplear cvSet2D. Why we shouldn’t use cvSet2D

Trás implementar la clase para el cambio de espacio de color he querido comprobar cuanta diferencia había entre los distintos métodos:

JETMAP: ha tardado: 9.7 milisegundos
JETMAPFAST: ha tardado: 1.555 milisegundos
HsvMap: ha tardado: 9.702 milisegundos
HsvMapFast: ha tardado: 1.556 milisegundos
HotMap: ha tardado: 9.735 milisegundos
HotMapFast: ha tardado: 1.555 milisegundos
CoolMap: ha tardado: 9.727 milisegundos
CoolMapFast: ha tardado: 1.556 milisegundos
SpringMap: ha tardado: 9.726 milisegundos
SpringMapFast: ha tardado: 1.569 milisegundos
SummerMap: ha tardado: 9.672 milisegundos
SummerMapFast: ha tardado: 1.568 milisegundos
AutumnMap: ha tardado: 9.789 milisegundos
AutumnMapFast: ha tardado: 1.554 milisegundos
WinterMap: ha tardado: 10.007 milisegundos
WinterMapFast: ha tardado: 1.555 milisegundos
GrayMap: ha tardado: 9.924 milisegundos
GrayMapFast: ha tardado: 1.554 milisegundos
BoneMap: ha tardado: 9.714 milisegundos
BoneMapFast: ha tardado: 1.555 milisegundos
CopperMap: ha tardado: 9.961 milisegundos
CopperMapFast: ha tardado: 1.564 milisegundos
PinkMap: ha tardado: 9.681 milisegundos
PinkMapFast: ha tardado: 1.556 milisegundos
LinesMap: ha tardado: 9.96 milisegundos
LinesMapFast: ha tardado: 1.568 milisegundos

Trás ver la evidente ventaja, a continuación expongo como sería el método rápido:

int alto    = entrada->height;
int ancho   = entrada->width;
int step    = entrada->widthStep;
int canales = entrada->nChannels;
uchar* data      = (uchar *)entrada->imageData;

for(int i=0; i < alto;i++)
for(int j=0; j <ancho;j++)
for(int k=0; k < canales;k++)
data[i*step+j*canales+k]= pink[data[i*step+j*canales+k]*3 +2-k];

After develop the class for space color changes, I wanted check the differences between both methods:

JETMAP: takes: 9.7 miliseconds
JETMAPFAST: takes: 1.555 miliseconds
HsvMap: takes: 9.702 miliseconds
HsvMapFast: takes: 1.556 miliseconds
HotMap: takes: 9.735 miliseconds
HotMapFast: takes: 1.555 miliseconds
CoolMap: takes: 9.727 miliseconds
CoolMapFast: takes: 1.556 miliseconds
SpringMap: takes: 9.726 miliseconds
SpringMapFast: takes: 1.569 miliseconds
SummerMap: takes: 9.672 miliseconds
SummerMapFast: takes: 1.568 miliseconds
AutumnMap: takes: 9.789 miliseconds
AutumnMapFast: takes: 1.554 miliseconds
WinterMap: takes: 10.007 miliseconds
WinterMapFast: takes: 1.555 miliseconds
GrayMap: takes: 9.924 miliseconds
GrayMapFast: takes: 1.554 miliseconds
BoneMap: takes: 9.714 miliseconds
BoneMapFast: takes: 1.555 miliseconds
CopperMap: takes: 9.961 miliseconds
CopperMapFast: takes: 1.564 miliseconds
PinkMap: takes: 9.681 miliseconds
PinkMapFast: takes: 1.556 miliseconds
LinesMap: takes: 9.96 miliseconds
LinesMapFast: takes: 1.568 miliseconds

Once we see the advantages of using pointers, I write the code for the fastest way:

int alto    = entrada->height;
int ancho   = entrada->width;
int step    = entrada->widthStep;
int canales = entrada->nChannels;
uchar* data      = (uchar *)entrada->imageData;

for(int i=0; i < alto;i++)
for(int j=0; j <ancho;j++)
for(int k=0; k < canales;k++)
data[i*step+j*canales+k]= pink[data[i*step+j*canales+k]*3 +2-k];
Anuncios

1 comentario

Mapas de Color en OpenCv

Recientemente he necesitado la obtención de imágenes en mapas de color distintos al RGB, como no he encontrado dentro de la librería OpenCv funciones para ello he decidido construirlas.

A continuación una imágen en las que se ve la imagen original y algunos de los mapas de color aplicados:

ColorMaps

Proveo dos funciones distintas para cada mapa, en la primera empleo la función cvSet2D para realizar el cambio, mientras que en las que denomino Fast empleo punteros. El rendimiento de las funciones Fast es aproximadamente 6 veces más rápido que las otras.

Se trata de funciones estáticas que están definidias en tres archivos:

  1. colormaps.h:  Contiene los arrays con los factores de conversión
  2. colorspace.h: Definición de las funciones.
  3. colorspace.cpp: Implementación de las mismas.

Deja un comentario