Tipos de datos auxiliares: CvPoint: coordenadas de un punto (un píxel) en una imagen. La numeración de filas y columnas empieza en 0. typedef struct CvPoint { int x; int y; } CvPoint;
CvSize: tamaño de una región rectangular, en píxeles. typedef struct CvSize { int width; // Anchura int height; // Altura } CvSize;
CvRect: rectángulo en la imagen, dado por el píxel superior izquierdo, anchura y altura. typedef struct CvRect { int x; int y; int width; // Anchura int height; // Altura } CvRect;
CvScalar: escalar o valor de un píxel, que puede contener 1, 2, 3 ó 4 números (según el número de canales). typedef struct CvScalar { double val[4]; } CvScalar;
Estos tipos aparecerán en los parámetros de las llamadas a muchas de las funciones. Existen funciones inline para crear e inicializar variables de estos tipos de datos: cvPoint, cvSize, cvRect, cvScalar, cvScalarAll.
CvPoint pt1= cvPoint(3,4), pt2; pt2.x= 5; pt2.y= 8; printf(“%d”, cvSize(100, 200).width); … cvRect(2, 2, 50, 50) … … cvScalarAll(3) … cvScalar(5, 7, 9) … cvLine(imagen, pt1, pt2, color); cvLine(imagen, cvPoint(1,1), cvPoint(10,10), color);
En las funciones para dibujar (puntos, líneas, círculos, elipses, etc.) el color se representa mediante un CvScalar, que almacena los canales RGB. Ejemplo, función para dibujar un círculo: void cvCircle(… CvPoint center, int radius, CvScalar color, …)
Para crearlo se puede usar el macro CV_RGB(r, g, b):
#define CV_RGB(r, g, b) cvScalar((b), (g), (r)) … cvCircle(img, cvPoint(100,100), 50, CV_RGB(0,0,255)); … Color azul
El tipo IplImage El tipo de datos para representar imágenes es el tipo IplImage (… las clásicas librerías IPL…) Las imágenes se guardan descomprimidas, como una matriz de píxeles que podemos consultar y modificar. Principales propiedades de una imagen: Tamaño (size): anchura (width) y altura (height). Profundidad de píxeles (depth): enteros de 8, 16 y 32 bits, reales de 32 y 64 bits. Número de canales (nChannels): 1, 2, 3 ó 4. Origen de coordenadas (origin): top-left, bottom-left; y orden de los canales (dataOrder): entrelazado de píxeles (0) o por canales (1).
Las variables manejadas serán punteros a IplImage. Creación de una imagen: IplImage* cvCreateImage(CvSize size, int depth, int channels) size: tamaño de la imagen depth: profundidad de píxel: IPL_DEPTH_8U – unsigned 8-bit integers IPL_DEPTH_8S – signed 8-bit integers IPL_DEPTH_16S – signed 16-bit integers IPL_DEPTH_32S – signed 32-bit integers IPL_DEPTH_32F – single precision floating-point numbers IPL_DEPTH_64F – double precision floating-point numbers channels: número de canales: 1, 2, 3 ó 4 Implícitamente, el origen es top-left y el orden es entrelazado. Con imágenes RGB el orden es: b0, g0, r0, b1, g1, r1, …
Definición del tipo IplImage. Observar que algunos campos no se usan en OpenCV (sólo se usaban en IPL).
typedef struct _IplImage { int nSize; /* sizeof(IplImage) */ int ID; /* version (=0)*/ int nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */ int alphaChannel; /* ignored by OpenCV */ int depth; /* pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported */ char colorModel[4]; /* ignored by OpenCV */ char channelSeq[4]; /* ditto */ int dataOrder; /* 0 – interleaved color channels, 1 – separate color channels. cvCreateImage can only create interleaved images */ int origin; /* 0 – top-left origin, 1 – bottom-left origin (Windows bitmaps style) */
int align; /* Alignment of image rows (4 or 8). OpenCV ignores it and uses widthStep instead */ int width; /* image width in pixels */ int height; /* image height in pixels */ struct _IplROI *roi; /* image ROI. when it is not NULL, this specifies image region to process */ struct _IplImage *maskROI; /* must be NULL in OpenCV */ void *imageId; /* ditto */ struct _IplTileInfo *tileInfo; /* ditto */ int imageSize; /* image data size in bytes (=image->height* image->widthStep) in case of interleaved data)*/ char *imageData; /* pointer to aligned image data */ int widthStep; /* size of aligned image row in bytes */ int BorderMode[4]; /* border completion mode, ignored by OpenCV */ int BorderConst[4]; /* ditto */ char *imageDataOrigin; /* pointer to a very origin of image data (not necessarily aligned) it is needed for correct image deallocation */ } IplImage;
Almacenamiento en memoria de los datos Los píxeles de la imagen están referenciados en:char *imageData; Los píxeles se almacenan por filas, de izquierda a derecha, empezando por la fila superior o la inferior (según origin sea 0 ó 1, respectivamente). Entre una fila y la siguiente hay widthStep bytes (al final de la fila pueden sobrar algunos bytes, con el propósito de alinear las filas). int width= 2 int height= 2 int nChannels= 3 int depth= 8U char *imageData IplImage *img widthStep= 8
Página siguiente |