trabajar_con_iplimage

=Como Accesar y modificar la información en una IplImage=

code format="c" /*Código de ejemplo:

Francisco Carlos Calderón

Libre de modificar difundir y aprender

2009

*/


 * 1) include 


 * 1) include 

int main(int argc, char** argv)

{

/* Declaración de *IplImage */

IplImage* Orig_Frame = 0;

IplImage* primera;

IplImage* segunda;

/* 1. Capturando y mostrando en pantalla */

Orig_Frame = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR );

if(Orig_Frame == 0)//si no hay nada en la imagen. puede contener salida al usuario para mejor debuging :)

return -1;

cvNamedWindow ("Original", CV_WINDOW_AUTOSIZE);

cvShowImage ("Original", Orig_Frame);

/* 2. Copia de la imagen original para modificar */

primera = cvCreateImage( cvSize(Orig_Frame->width,Orig_Frame->height), Orig_Frame->depth, Orig_Frame->nChannels );

segunda = cvCreateImage( cvSize(Orig_Frame->width,Orig_Frame->height), Orig_Frame->depth, Orig_Frame->nChannels );

// Sintaxis: cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL )

// uso la sobracarga de cvCopy y no añado nada en la mascara

cvCopy( Orig_Frame, primera); /*Ejemplo de uso de CvScalar comentar la linea anterior y descomentar la siguiente*/ //cvSet(primera,cvScalar(100,20,150));//un color magenta :P hay un #define que tambien se puede usar #define CV_RGB( r, g, b ) cvScalar( (b), (g), (r), 0 ) cvCopy( Orig_Frame, segunda);

/* 3. una forma de modificar datos dentro del IplImage */

for(int i=0;iheight;i+=20)

{// poner grilla para ayuda del usuario de color verde cada 20 pixeles

for(int j=0;jwidth;j+=20)

{

CV_IMAGE_ELEM( primera, uchar, i, primera->nChannels*(j) + 0 ) = uchar(0);//azul

CV_IMAGE_ELEM( primera, uchar, i, primera->nChannels*(j) + 1 ) = uchar(255);//verde

CV_IMAGE_ELEM( primera, uchar, i, primera->nChannels*(j) + 2 ) = uchar(0);//rojo

}

}

cvNamedWindow ("primera", CV_WINDOW_AUTOSIZE);

cvShowImage ("primera", primera);

/* 4. Otra forma de accesar datos de IplImage mas eficiente es recomendable usar esta que el macro*/

for( int y=0; yheight; y++ )

{

unsigned char * tmp_apun = (uchar*) (segunda->imageData + y * segunda->widthStep);//use uchar por que sé que la imagen es de 8 bits, en caso de no serlo use la clase correspondiente "char int float double"

for( int x=0; xwidth; x++ ) {

tmp_apun[segunda->nChannels*x+0] = 255 - tmp_apun[segunda->nChannels*x+0];

tmp_apun[segunda->nChannels*x+1] = 255 - tmp_apun[segunda->nChannels*x+1];

tmp_apun[segunda->nChannels*x+2] = 255 - tmp_apun[segunda->nChannels*x+2];

}

}

cvNamedWindow ("segunda", CV_WINDOW_AUTOSIZE);

cvShowImage ("segunda", segunda);

cvWaitKey (0);

/* Es una buena practica liberar todo antes de salir del programa y no

confiar que windows haga todo el trabajo sucio :) */

cvReleaseImage( &Orig_Frame );

cvReleaseImage( &primera );

cvReleaseImage( &segunda);

return 0;

}

code