tutorial opencv

61
Tutorial de OpenCV 23/04/08 Raúl Igual Carlos Medrano

Upload: jeremiah-martinez

Post on 25-Nov-2015

88 views

Category:

Documents


6 download

DESCRIPTION

Este documento se inicia dentro del Trabajo Fin de Carrera de Raúl Igual, alumno de la E.U.Politécnica de Teruel, sobre algoritmos de seguimiento de objetos en tiempo real. Este Trabajo Finde Carrera ha sido financiado por la Fundación Universitaria Antonio Gargallo,(http://www.fantoniogargallo.org/).

TRANSCRIPT

  • TutorialdeOpenCV

    23/04/08

    RalIgualCarlosMedrano

  • TableofcontenstLicencia................................................................................................................................................3Historiadeldocumento.........................................................................................................................3Instalacinycompilacin.....................................................................................................................4TiposdedatosenOpencv....................................................................................................................8LibreraOpencv....................................................................................................................................7Funcionesinteresantes........................................................................................................................14FuncionesarealizarconOpencv........................................................................................................15

    Abririmgenes...............................................................................................................................15Guardarimgenes..........................................................................................................................16Accederaunpixel.........................................................................................................................19

    Gestionardistintostiposdeimgenes................................................................................................25Formatosdeficheros......................................................................................................................25Tiposdeimgenes.........................................................................................................................28Tiposdedatosdeunpxel.............................................................................................................29

    Transformacionesafines.....................................................................................................................30Traslacin.......................................................................................................................................30Escalado.........................................................................................................................................34Rotacin.........................................................................................................................................38

    Binarizacindeimgenes...................................................................................................................43Operacionesconmatrices...................................................................................................................47

    Inversindematrices.....................................................................................................................47Multiplicacindematrices.............................................................................................................48

    BIBLIOGRAFA................................................................................................................................51GNUFreeDocumentationLicense....................................................................................................54

  • LicenciaCopyright(c)2007RalIgualCataln,CarlosMedranoSnchez.

    Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNUFree Documentation License, Version 1.2or any later versionpublished by the FreeSoftwareFoundation;withnoInvariantSections,noFrontCoverTexts,andnoBackCoverTexts.Acopyofthelicenseisincludedinthesectionentitled"GNUFreeDocumentationLicense".

    HistoriadeldocumentoEstedocumento se inicia dentro del TrabajoFindeCarreradeRal Igual, alumnode la E.U.PolitcnicadeTeruel,sobrealgoritmosdeseguimientodeobjetosentiemporeal.EsteTrabajoFinde Carrera ha sido financiado por la Fundacin Universitaria Antonio Gargallo,(http://www.fantoniogargallo.org/).

    Versininicial:RalIgual,

    AadidodelaseccindeinstalacinydelasfuncionescvReleaseXX:CarlosMedrano

    Formato:CarlosMedrano,29122007

    Versinmodificada:RalIgual,22042008.Sehanaadidolassalidasdelosprogramasysehanefectuadoalgunaspequeasmodificacionesenalgunospuntos.

  • InstalacinycompilacinParainstalarla librera, loprimeroquedebemosdehaceresdescargarnosladelsitio:http://sourceforge.net/projects/opencvlibrary/

    Siladescargamosconuntar.gz,habrquedescomprimirlacon$tarxvzfopencv1.0.0.tar.gz

    Ennuestrocasoeslaversin1.0.0.Despusbajaremosaldirectorioopencv1.0.0$cdopencv1.0.0

    DespusconsultaremoselficheroINSTALL,yseguiremoslasinstruccionesqueallseexpliquen. Segn este documento, hay que tener en cuenta que se necesitan tenerinstaladasunaslibreras(porejemplolibpng).Estosepuedehacerdesdeelgestordepaquetes de nuestro equipo. Por ejemplo, en kubuntu suele aparecer como Adept(PackageManager)enformagrfica,odesdelalneadecomandosconaptitudeoapt.Cuandonoshablendelibreraconficherosdedesarrollo(developmentfiles),habrqueinstalarlaslib,perotambinlaslibdev(poeejemplo,libpng12dev).Unavezhechoesto,lainstalacinserealizaconlasinstruccionesqueindicaelficheroINSTALL:

    $./configure

    $make

    $sudomakeinstall

    Conestoseinstalarennuestroequipo.Noobstante,paraqueencuentrelalibreraalcompilaresnecesarioindicarlelarutaadecuada.ParaellosepuedemodificarlavariabledeentornoLD_LIBRARY_PATH,queesunalistadedirectoriosseparadosporpuntoycoma.Estohayquehacerloencadasesinobienennuestrofichero.bash_profiledenuestrodicrectorio/home/usuario/.OtraformamscmodaesaadirlarutadelalibreraOpenCV al fichero de configuracin /etc/ld.so.conf. En nuestro caso, la librera esten/usr/local/libporloqueelarchivoqueda

    $more/etc/ld.so.conf

    /usr/lib/atlas

    /usr/local/lib/

  • traslocualbastahacer

    $sudoldconfigv

    paraqueencuentrelalibreraalcompilar.

    Pero, cmocompilar un programa que usa la librera? Veamos un ejemplo con elsiguienteprograma,quecargarlaimagenlena.jpg,lomostrarenunaventana,yluegolo guardar en saliendo.jpg. Debe tener la imagen en el directorio de trabajo (aldescomprimiropencvesaimagenseencuentratambinenalgunaruta).

    #include"cv.h"

    #include"highgui.h"

    #include

    charname0[]="lena.jpg";//sedefineelficheroacargar

    intmain()

    {

    IplImage*imagen=NULL;//inicializoimagen

    imagen=cvLoadImage(name0,1);//cargamoslaimagen,

    //secargaentrescolores

    cvNamedWindow("test",1);//creamoslaventanadenombre"test"

    //indicndoleconel1queajuste

    //sutamaoaldelaimagen

    cvShowImage("test",imagen);//representamoslaimagenenlaventana

    cvSaveImage("saliendo.jpg",imagen);//guardamoslaimagen

    cvWaitKey(0);//sepulsateclaparaterminar

    cvDestroyAllWindows();//destruimostodaslasventanas

    cvReleaseImage(&imagen);

    return0;

    }

    Suponiendoqueesteprogramasellamaload_save.c,sepuedecompilarcon:

    $ gcc load_save.c o load_save I/usr/local/include/opencv/L/usr/local/liblcvlhighgui

  • EsrecomendablehacerunMakefile,quepodraseras:

    INC=/usr/local/include/opencv/

    LIB=/usr/local/lib

    all:load_save

    load_save:load_save.c

    gccWallload_save.coload_saveI$(INC)L$(LIB)lcvlhighgui

    clean:

    rmload_save

    LaopcinWallengccdagrancantidaddeinformacin.Aunqueespesada,convienetenerlaavecespuesnosindicaposiblesfallosenelprograma.Conesteficherobastahacer:

    $make

    omakeallcadavezquequeramoscompilar.

  • LibreraOpencv

    Las siglas Opencv provienen de los trminos anglosajones Open Source

    Computer Vision Library. Por lo tanto, Opencv es una librera de tratamiento de

    imgenes,destinadaprincipalmenteaaplicacionesdevisinporcomputadorentiempo

    real.

    Conesteinformesepretendeproveerdeladescripcindealgunasfuncionesde

    inters, as comoexponer ejemploscompletosy compilablesdesuuso, yaqueesto

    facilitar en gran medida su posterior aplicacin. Tambin es necesario definir los

    principalestiposdedatosqueutilizaOpencv,yqueestninvolucradosconelempleode

    lasfunciones,lamayoradeestostiposdedatossonestructurasdinmicas.

    AlgunosapuntessobreOpencv

    Es importante no confundir las funciones, con los tipos de datos propios de

    Opencv.Paraello,lapropialibrerautilizaunasintaxisdistintaparacadacaso,conligeras

    diferencias, aunqueenprincipiosi nosepresta ladebidaatencin, es fcil confundir

    ambassintaxis.

    CadaunadelasfuncionesreferenciadasenOpencvcomienzaconlassiglascv,

    seguidadelnombredelafuncin,conlaprimeraletradecadaunadelaspalabrasque

    componen dicho nombre en mayscula. Por ejemplo: cvCreateImage, cvInvert,

    cvMatMulAdd...

    Parareferirnosalostiposdedatoslasintaxisesmuysimilaraladelasfunciones,

    aunqueconlanicadiferenciadequelostiposcomienzanconlasiglasCv.Porejemplo:

    CvScalar, CvMat... No obstante existen algunos tipos que se declaran de forma

    totalmentedistinta(IplImage...).Paraconcretarestasindicacionespasamosaexponerlos

    principalestiposdedatos.

  • TiposdedatosenOpencv

    Opencvproporcionaunostiposdedatosbsicosparasuutilizacin.Tambinnos

    proveedetiposdedatosintroducidoscomoayudaal programador,parahacerqueel

    accesoainformacindeintersseamssimple.Comenzamosladescripcindelostipos

    dedatos:

    CvArr

    Esmuyimportantecomprenderqueestenoesuntipodedatosreal,sinoloquese

    denominaunmetatype,esdecir,untipodedatoficticioqueseutilizadeformagenrica

    alahoradedescribirlosparmetrosdelasfunciones.LanomenclaturaCvArr*seutiliza

    sloparaindicarquela funcinaceptaarraysdemsdeuntipo,comopuedenser

    IplImage*CvMat*oinclusoCvSeq*.

    IplImage

    El tipo de datos bsico en Opencv es el IplImage. Con este tipo de datos se

    representanlasimgenesseandeltipoquesean:BGR,intensidad...

    Pasamosamostrarlaordenacinyloscamposdeestaestructura:

    typedefstruct_IplImage{

    intnSize;/*tamaodelaestructuraiplImage*/

    intID;/*versindelacabeceradelaimagen*/

    intnChannels;

    intalphaChannel;

    intdepth;/*profundadaddelaimagenenpxeles*/

    charcolorModel[4];

    charchannelSeq[4];

    intdataOrder;

    intorigin;

    intalign;/*alineamientode4o8byte*/

    intwidth;

  • intheight;

    struct_IplROI*roi;/*punteroalaROIsiexiste*/

    struct_IplImage*maskROI;/*punteroalamxcaraROIsiexiste*/

    void*imageId;/*usodelaaplicain*/

    struct_IplTileInfo*tileInfo;/*containsinformationontiling

    intimageSize;/*tamaotilenbytes*/

    char*imageData;/*punteroalaimagenalineada*/

    intwidthStep;/*tamaodealineamientodelineaenbytes*/

    intBorderMode[4];/*thetop,bottom,left,andrightbordermode

    */

    intBorderConst[4];/*constantsforthetop,bottom,left,and

    rightborder*/

    char*imageDataOrigin;/*punteroalaimagencompleta,sinalinear

    */

    }IplImage;

    Vamosadescribirmsenprofundidadaquelloscamposquenosvanasertilesen

    nuestraaplicacin.

    Los campos width y height contienen la anchura y la altura de la imagen

    expresadasenpxeles.

    El campodepthcontiene informacinsobreel tipodevalorde lospxeles. Los

    posiblesvaloresdelcampodepthsonlossiguientes:

    IPL_DEPTH_8U:Enterossinsignode8bits(unsignedchar)

    IPL_DEPTH_8S:Enterosconsignode8bits(signedcharosimplementechar)

    IPL_DEPTH_16S:Enterosde16bitsconsigno(shortint)

    IPL_DEPTH_32S:Enterosconsignode32bits(int)

    IPL_DEPTH_32F:Nmerosenpuntoflotanteconprecisinsimplede32bits(float)

    El camponChannels indica el nmerode canales de color de la imagen. Las

    imgenesenescaladegrisestienenunslocanal,mientrasquelasdecolortienen3o4

    canales.

  • El campo widthStep contiene el nmero de bytes entre puntos de la misma

    columnayfilassucesivas.Paracalcularladistanciaconwidthnoessuficiente,yaque

    cadacolumnapuedeestaralineadaconunciertonmerodebytesparaobtenermayores

    velocidadesdeprocesamiento.

    ElcampoimageDatacontieneunpunteroalaprimeracolumnadelosdatosdela

    imagen.

    Es posible seleccionar algunas partes rectangulares de la imagen, lo que se

    conocecomoregionesdeinters(ROI).LaestructuraIplImagecontieneelcamporoi,que

    sinoesnulo(NULL),apuntaalaestructuraIplROI,quecontieneparmetrosdelaregin

    seleccionada.

    CvMat

    UnadelasestructurasmsempleadasparaoperarconlasimgenesesCvMat,

    quesedefinedelsiguientemodo:

    typedefstructCvMat

    {

    introws;//nmerodefilas

    intcols;//nmerodecolumnas

    CvMatTypetype;//tipodematriz

    intstep;//noseutiliza

    union

    {

    float*fl;//punteroalosdatosdetipofloat

    double*db;//punteroadatosdedobleprecisin

    }data;

    }CvMat

    Secaracterizaporqueapartedealmacenarloselementoscomocualquiermatriz,

    ofrecelaposibilidaddeaccederainformacinadicionalquepuederesultardeutilidad.En

    losprogramasquerealicemosestetipodedatossiempreirnasociadosconlafuncin

  • cvCreateMatquenospermitirconfigurarlaestructuramatricialdemaneramuysencilla.

    Estafuncinseencargadecrearal encabezadodela imagenydeubicarsusdatos.

    Exponemossuestructura:

    CvMat*cvCreateMat(introws,intcols,inttype);

    rows:nmerodefilasdelamatriz

    cols:nmerodecolumnasdelamatriz

    type:tipodeloselementosdelasmatrices.Seespecificadela

    forma:

    CV_(S|U|F)C.Siendo:

    bit_depth:profundidaddebit(8,16,31...)

    numberofchannels:elnmerodecanalesdelamatriz

    (S|U|F):eltipodedatosdebit:

    S:consigno

    U:sinsigno

    F:flotante

    Porejemplo.:

    CV_8UC1significaquesetieneunamatrizdeuncanalde8bitdetipounsigned.

    CV_32SC2equivaleaunamatrizdedoscanalesde32bitsigned.

    CvScalar

    LaestructuraCvScalaressimplementeunvectordecuatroelementos,peroque

    resultamuytilalahoradeaccederalospxelesdeunaimagen,sobretodosiesde

    color.LaestructuraCvScalareslasiguiente:

    CvScalar

    doubleval[4];//vector4D

    Para acceder al campodeestaestructurabastaconadjuntar el nombrede la

    mismaalapalabraval,conunpuntoentreambas,esdecir:

    CvScalars;//definicindelavariablesdetipoCvScalar

    s.val[0]=2;//inicializamoselprimerelementodesconelvalor

    arbitrario2

  • Normalmente esta estructura suele ir acompaada de la funcincvScalar, que

    permitedefinirtodoslosparmetrosdeunasolavez.Analizamoslafuncin:

    inlineCvScalarcvScalar(doubleval0,doubleval1,doubleval2,

    doubleval3=0);

    donde:val0,val1...sonlosvaloresquetomanloselementosdela

    estructura.

    Vemosunejemplo:

    CvScalars=cvScalar(1.0,3,4.6,5);

    CvPointyCvPoint2D32f

    LostiposdedatosCvPointyCvPoint2D32f,definenlascoordenadasdeunpunto,

    elprimerodeellosconnmerosenterosyelsegundoconnmerosenpuntoflotante.

    DescribimosenprimerlugarCvPoint:

    typedefstructCvPoint

    {

    intx;/*coordenadax*/

    inty;/*coordenaday*/

    }

    CvPoint;

    DeformaanlogatenemoslaestructuraCvPoint2D32f:

    typedefstructCvPoint2D32f

    {

    floatx;/*coordenadax*/

    floaty;/*coordenaday*/

    }

    CvPoint2D32f;

    Estas estructuras como algunas de las anteriores suelen ir acompaadas de

  • funcionesquefacilitansuusoydefinicin.EnestecasotenemoslasfuncionescvPointy

    cvPoint2D32f,conlossiguientesparmetros:

    inlineCvPointcvPoint(intx,inty);

    inlineCvPoint2D32fcvPoint2D32f(doublex,doubley);

    siendoxeylascoordenadasdelpunto.

    Ejemplodeaplicacin:

    CvPointpunto=cvPoint(100,200);

    CvPoint2D32fpuntof=cvPoint2D32f(100.0,200.0);

    CvSize

    Estructurautilizadaparadefinirlasdimensionesdeunrectnguloenpxeles:

    typedefstructCvSize

    {

    intwidth;/*anchuradelrectngulo(valorenpxeles)*/

    intheight;/*alturadelrectngulo(valorenpxeles)*/

    }

    CvSize;

    Estetiposeutilizasobretodoalahoradecrearimgenesnuevas,paradefinirsus

    dimensiones.LafuncinasociadaaestetipoescvSize:

    inlineCvSizecvSize(intwidth,intheight);//siendowidthyheight

    lasdimensiones

    Vemosunejemplodeaplicacin:

    CvSizetamano=cvSize(100,200);

  • Funcionesinteresantes

    Antesdeabordarloscasosdeintersseraconvenienteintroduciralgunasdelas

    funcionesquemsseutilizarnenlosprogramassiguientes,yquesepuedenconsiderar

    comunesatodoslostemasquetrataremos.

    voidcvNamedWindow(charname,inttype);

    Estafuncincreaunaventanagrfica.Analizamossusparmetros:

    name:cadenadecaracteresquesirvecomonombredelaventana

    type:formatodetamaodelaventana:

    UtilizaremosCV_WINDOW_AUTOSIZE,osimplementepondremosun

    1paraseleccionarestaopcin.

    voidcvShowImage(charname,CvArr*img)

    Estafuncindibujalaimagenindicadaenlaventanacorrespondiente.

    Tienecomoparmetros:

    name:nombredelaventanadondesedibujarlafuncin

    img:imagenquedeseamosdibujar

    voidcvDestroyAllWindows();

    Estafuncineliminatodaslasventanasgrficasquehayansidocreadas

    previamente.

    voidcvReleaseImage(&CvArr*img);

    Estafuncinseencargadeliberarelespaciodememoriaquehasido

    asignadoaunaestructuraCvArr*.Poseeunnicoparmetro:

    img:eselnombredelaimagenquesedesealiberar

    voidcvmSet(CvMat*mat,introw,intcol,doublevalue)

    Estafuncinguardaunelementoenunamatrizdeunsolocanalenpunto

    flotante:

    mat:Lamatrizdeentrada

    row:Elndicedelafila

    col:Elndicedelacolumna

    value:Elnuevovalordelelementodelamatriz

  • voidcvmGet(constCvMat*mat,introw,intcol);

    Retornaelvalorquetomaunelementodelamatrizindicada.

    mat:matrizdeentrada,delacualseextraerelvalordeunode

    suselementos

    row:valordelndicedeseadoenlasfilas(ejevertical)

    col:valordelndiceenlascolumnas(ejehorizontal).Juntocon

    lafiladefinela posicindelelementodentrodelamatriz.

    FuncionesarealizarconOpencv

    Abririmgenes

    ParaimplementarlaaccindeabririmgenesutilizandoOpencv,sehaceusodela

    funcincvLoadImage.

    Pasamos a describir los parmetros necesarios para poder trabajar con esta

    funcin:

    img=cvLoadImage(fileName,flag);

    Siendo:

    fileName:Nombredelficheroquesequierecargar

    flag:Caractersticasdecargaenelfichero:

    flag:>0:seobligaquelaimagencargadaseaunaimagendecolor

    de3canales

    flag=0:seobligaquelaimagencargadaseaunaimagenintensidad

    de1canal

    flag

  • deformasimilarafree().

    Guardarimgenes

    Se utiliza la funcin cvSaveImage para salvar las imgenes. Los parmetros

    requeridos para su uso son muy parecidos a los empleados en la funcin anterior.

    Pasamosadescribirloscamposdelafuncin:

    cvSaveImage(outFileName,img)

    Siendo:

    outFileName:Nombredelficherodesalidaquedebercontenerala

    imagenaguardar.

    img:Imagenquesevaaguardar

    Comoparticularidadcabedestacarquelaimagenquesesalvaescreadaporel

    propioprogramayalmacenadaeneldirectoriodondeseencuentreelprograma.Porlo

    tanto,noesnecesariodefinirningntipodeficherodealmacenamientoconantelacin.

    Programadepruebadelasfunciones cvLoadImage y cvSaveImage

    Para concretar los conceptos anteriormente expuestos vamos a mostrar dos

    ejemplosclarosysencillosdelasfuncionescvLoadImageycvSaveImage.

    Elprimerejemploeselsiguiente:

    #include"cv.h"#include"highgui.h"#include

    charname0[]="out10000.jpg";//sedefineelficheroacargar

    intmain(){IplImage*imagen=NULL;//inicializoimagenimagen=cvLoadImage(name0,1);//cargamoslaimagen,//secargaentrescolorescvNamedWindow("test",1);//creamoslaventanadenombre

    //"test"indicndoleconel1queajuste//sutamaoaldelaimagen

    cvShowImage("test",imagen);//representamoslaimagenenlaventana

  • cvSaveImage("saliendo.jpg",imagen);//guardamoslaimagen

    cvWaitKey(0);//sepulsateclaparaterminar

    cvDestroyAllWindows();//destruimostodaslasventanascvReleaseImage(&imagen);return0;}

    Alejecutarelprograma,semuestraenpantallaunaimagencomoladelafigura1

    (laquesedeseacargar),quepermaneceenelmonitorhastaquesedetectalapulsacin

    deunateclacualquiera.

    Ademssegenerar unficheroenlarutaindicadaenlainstruccindeguardar

    imagen,quecontendrestamismaimagen.

    Enelprogramaanterior,elficheroimagensedefinedirectamenteenelcdigodel

    mismo,asignandosunombreaunavariabledetipo char,queposteriormentesepasa

    comoparmetroalafuncincvLoadImage,donderealmentesecargalaimagen.

    Elsegundoejemplosediferencialigeramentedelanterior:

    #include"cv.h"#include"highgui.h"#defineventana"Ventana1"#defineventana1"Ventana2"

    intmain(intargc,char*argv[]){//Comprobamossihanpasadounaimagencomoparmetro,//sinopasamosunapordefectochar*filename=argc>=2?argv[1]:(char*)"lena.jpg";

    Figura1

  • IplImage*imagen=NULL,*imagen1=NULL;

    imagen=cvLoadImage(filename,1);//cargamoslaimagenenRGBimagen1=cvLoadImage(filename,0);//Cargamoslaimagen//enEscaladegrises

    cvNamedWindow(ventana,0);//MostramoslaimagenenlaventanacvNamedWindow(ventana1,0);cvShowImage(ventana,imagen);cvShowImage(ventana1,imagen1);

    cvWaitKey(0);

    cvDestroyAllWindows();//destruimostodaslasventanascvReleaseImage(&imagen);cvReleaseImage(&imagen1);return0;}

    Enestecdigoelnombredelficherosedebecargarporconsola,porlotantoesel

    propiousuarioelquedecidequeimagencargarsinnecesidaddemodificaryrecompilarel

    programa.Encasodequestenointroduzcaelnombredeningnficheroenlaconsola,

    secargarelqueelpropioprogramaposeepordefecto:lena.jpg.

    Portanto,sidesesemosabrir la imagenout4553.jpg,alahoradeejecutarel

    programa,porconsoladeberamosescribir:./nombre_programarutadondeseubicala

    imagenacargar.

    Porejemplo,sielprogramasellamaloadsave.cypretendemoscargarlaimagenconruta

    /home/raul/tpm2/out4553.jpg,escribimos:./loadsave/home/raul/tpm2/out4553.jpg.

    Lasfigurassiguientesmuestranlamismaimagencargadaendosmodosdistintos:

    encolor(figura4),yenescaladegrises(figura5).

    Figura2 Figura3

  • Accederaunpixel

    Comoessabido,elelementobsicodeunaimageneselpxel,portantoresulta

    primordialsaberaccederaellos.

    Opencvproporcionaunagranvariedaddemtodosparaaccedera lospxeles,

    aquvamosadescribiralgunosdelosmsusados.

    Mtodo1:Accesoindirectoalospxeles.

    SebasaenlautilizacindelasfuncionescvGet2DycvSet2Dqueseencargande

    encontrarelementosdeunarrayyconfigurarelementosdeunarrayrespectivamente.Las

    describimosacontinuacin:

    CvScalarcvGet2D(constCvArr*arr,intidx0,intidx1);

    Siendo:

    arr:arrayenelcualvamosabuscarelvalordelelementodeseado

    idx0:ndicedefilasdelelemento

    idy1:ndicedecolumnasdelelemento

    LasalidadelafuncineselvalordelelementoyesdetipoCvScalar(unescalar).

    voidcvSet2D(CvArr*arr,intidx0,intidx1,CvScalarvalue);

    Siendo:

    arr:arraydeentradaenelquevamosadefinirunodesuselementos

    idx0:ndicedefilasdelelemento

    Figura4 Figura5

  • idx1:ndicedecolumnasdelelemento

    value:valorquedeseamosasignaralelemento(idx0,idx1)

    Laestructuradedatosimplicadaenelaccesoalospxeleses CvScalar yest

    definidaenlaslibrerasdeOpencv.

    Pasamosamostrar el accesoa unpxel en unsistemamonocanal (imgenes

    binariasoenescaladegrises):

    IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

    //Obtenemoselvalordeintensidadenunpxel

    CvScalars;//definimoslaestructuradondealmacenaremoslosdatos

    s=cvGet2D(img,i,j);//seobtieneelvalor(i,j)delpxel,que

    quedaalmacenadoens.val[0]

    printf("intensity=%f\n",s.val[0]);//imprimimosesevalor

    //Fijamosunpxelaundeterminadoniveldeintensidad

    s.val[0]=111;//asignamoselvalordeintensidaddeseado

    cvSet2D(img,i,j,s);//configuramoselpxel(i,j)conesevalor

    Enelcdigoanteriorsloseutilizaelcampos.val[0]delaestructuraCvScalar,ya

    quealtenerunsoloniveldecolor,nicamenteesnecesariounindicador.

    Enel casodetenerunsistemamulticanal(trescoloresparadefinirunpxel)el

    accesoalospxelesserealizaconelsiguientecdigo:

    IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

    //Obtenemoselvalordelpxel(i,j)deunaimagen

    CvScalars;

    s=cvGet2D(img,i,j);//obtenemoselvalorenelpxel(i,j)

    printf("B=%f,G=%f,R=%f\n",s.val[0],s.val[1],s.val[2]);//

    imprimimosesevalor

  • //Fijamosunpxelaunniveldecolordeterminado

    s.val[0]=111;//Niveldeazul

    s.val[1]=111;//Niveldeverde

    s.val[2]=111;//Nivelderojo

    cvSet2D(img,i,j,s);//asignamoslosnivelesanterioresalpxel

    (i,j)

    CabedestacarqueaquseutilizantrescamposdelaestructuraCvScalar,unopara

    cadaniveldecolor(rojo,verdeyazul).

    Podemosenunciaralgunadelascaractersticasdeestemtododeaccesoalos

    pxeles.Comoaspectopositivocontienelaventajadequeeslaformamssencillade

    accederaunpxel.Cmoinconvenientepodemoscitarqueespocoeficiente,ocomo

    mnimo,menoseficientequelosotrosmtodos.

    Mtodo2 :Utilizandopunterosalosdatosdelaimagen.

    Paraello esnecesario acceder a lossiguientescamposde la estructura

    IplImage*:height,width,widthstep,imageData.

    Al ser una estructura puntero el acceso como sigue: nombre_variable >

    nombre_del_campo

    Paraunaimagenmonocanalcodificadaenbytes,utilizamoselsiguientecdigo:

    IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

    intheight=img>height;//obtenemoslaalturadelaimagenen

    pxeles

    intwidth=img>width;//anchuradelaimagenenpxeles

    intstep=img>widthStep/sizeof(uchar);//calculamoselvalordel

    paso

    uchar*data=(uchar*)img>imageData;//cargamoslosdatosdela

    imagenendata

    data[i*step+j]=111;//fijamoselpixel(i,j)aundeterminado

    valor

  • Paraunaimagenmulticanalcodificadaenbytes,deberemosescribir:

    IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

    intheight=img>height;//obtenemoslaalturadelaimagenen

    pxeles

    intwidth=img>width;//anchuradelaimagenenpxeles

    intstep=img>widthStep/sizeof(uchar);//calculamoselvalordel

    paso

    intchannels=img>nChannels;//obtenemoselnmerodecanalesde

    laimagen

    uchar*data=(uchar*)img>imageData;//cargamoslosdatosdela

    imagenendata

    data[i*step+j*channels+k]=111;//fijamoselvalordeunodelos

    canalesdelpixel(i,j)aun

    determinadonivel,siendo:

    // k=0paraelazul

    // k=1paraelverde

    // k=2paraelrojo

    Comoventajasprincipalesdelaccesoalospxelesconpunterospodemoscitarque

    esunsistemarelativamentesencillo(aunquemenosqueelanterior),ysobretodoesun

    accesocontasasdeeficienciamuyelevadas.

    Mtodo3:Accesodirecto

    Estaesunade lasmejoresformasdeaccedera lospxeles,aunquesu

    sintaxisesunpocomenosevidentequelasanteriores.

    Para imgenesdeunsolo canal definimosel valor de un pxel a unacuanta

    arbitraria,porejemplo111.

    IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);//imagen

    de1canal

    ((uchar*)(img>imageData+i*img>widthStep))[j]=111;//accesoal

    elementoi,j

  • Paraimgenesmulticanal:

    IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);//imagen

    de3canales

    ((uchar*)(img>imageData+i*img>widthStep))[j*img>nChannels+

    0]=111;//B

    ((uchar*)(img>imageData+i*img>widthStep))[j*img>nChannels+

    1]=112;//G

    ((uchar*)(img>imageData+i*img>widthStep))[j*img>nChannels+

    2]=113;//R

    Seaccedeenelprimercasoalcolorazul,enelsegundoalverdeyenelterceroal

    rojo.Lafilosofadelmtodoeslamismaqueenelmtodo2,peroenestaocasinde

    formamscomprimidayeficiente.

    Mtodo4:Utilizandolainformacindelasfilas

    Sehaceusodeunafuncinauxiliarcomoenelcasoinicialparaelaccesoalos

    datos,yunavezestncargadosseoperaconelloscomosidematricessetrataran.En

    estaocasinutilizamoslafuncincvGetRawData:

    uchar*data;

    cvGetRawData(img,(uchar**)&data);

    data[x*img>Width+y]=111;

  • Ejemplosdeaccesoapxeles

    EnprimerlugarutilizamoselMtodo1(cvGet2D,cvSet2D)paraelaccesoalos

    pxeles:

    #include"cv.h"#include"highgui.h"#include

    charname0[]="lena.jpg";inti=2,j=2;intmain(){IplImage*imagen=NULL;//seinicializaimagenimagen=cvLoadImage(name0,1);//secargalaimagen

    CvScalars;//definimoselescalardondesealmacenar//elvalordelpxels=cvGet2D(imagen,i,j);//seobtieneelvalordelpxel(i,j)printf("B=%f,G=%f,R=%f\n",s.val[0],s.val[1],s.val[2]);//ens.val[0]quedaalmacenadoelprimer//color,ens.val[1]elsegundo...cvReleaseImage(&imagen);return0;}

    Ahora vamos a utilizar un acceso ms eficiente mediante punteros. Para ello

    aplicamoselmtodo3:

    #include"cv.h"#include"highgui.h"#include

    charname0[]="lena.jpg";inti=2,j=2;//elementoalqueacceder

    intmain(){IplImage*imagen=NULL;//inicializoimagenints;

    imagen=cvLoadImage(name0,1);//cargamoslaimagen

    ((uchar *)(imagen>imageData+i*imagen>widthStep))[j*imagen>nChannels+0]=111;//B ((uchar *)(imagen>imageData+i*imagen>widthStep))[j*imagen>nChannels+1]=112;//G ((uchar *)(imagen>imageData+i*imagen>widthStep))[j*imagen>nChannels

  • +2]=113;//R//paracomprobarsiefectivamenteelvalorhasidotomado,//leemoselcanalazuldelpxel s = ((uchar *)(imagen>imageData + i*imagen>widthStep))[j*imagen>nChannels+0];printf("B=%d\n",s);//imprimimoselresultado//(debeser111sifuncionacorrectamente);cvReleaseImage(&imagen);return0;}

    Gestionardistintostiposdeimgenes

    Una imagennoesmsqueunamatrizounarraybidemensional denmeros,

    siendocadaceldaelequivalenteaunpxel.Lasimgenesposeendimensionesdeancho

    xalto(widthxheight),siendoelancholascolumnasyelaltolasfilas.

    Formatosdeficheros

    FormatoBMP

    EsteformatofuedesarrolladoporMicrosoftparapermitirunarpidaentrada/salida

    pordisco/pantalla.

    Entrelascaractersticasdeestetipodealmacenamientodestacalagrancantidadde

    nivelesdeprofundidadqueoferta:1bitporpxel(imagende2coloresobinaria),4bits

    porpxel(imagende16colores),y24bitsporpxeloloqueeslomismo3bytes

    (imagendecolor).

    Este formato utiliza compresin sin prdida: RLE o sin comprimir. Adems, el

    almacenamientoesbottomleft(seempiezaporlaparteinferiorizquierda),yentrelaza

    loscanales.

    Lasventajasdeesteformatosonlassiguientes:

    Nohayprdidadecalidadenlasimgenes

    Lalecturayescriturasonmuyrpidas

  • Elformatoesmuysencillo:cabecera+datos

    Encuantoalosinconvenientespodemoscitar:

    El tamao de las imgenes es excesivamente grande, sobre todo en

    imgenesfotogrficas.

    Tamao_imagen=(aprox)ancho*alto*bits_por_pxel

    Noesadecuadoparalatransmisinporred.

    EspocopopularfueradelosentornosdeMSWindows(aunqueestlibrede

    patentes)

    Algunasdelasaplicacionesdeesteformatoson:

    Aplicacionesquerequieranunarpidasalidaporpantalla.

    Aplicaciones donde no deba haber prdida de calidad, aun a costa del

    tamao

    FormatoTIFF

    Fue creado por Aldus (ahora Adobe) pensado en trabajos de impresin de alta

    resolucinycalidad.

    Esteesunformatomuyflexible,basadoentags(etiquetas)quesonbloquesdedatos

    (de formatopredefinido) quecontienencierto tipode informacinsobre la imagen.

    Existenmuchostiposdetags(ysepuedencrearnuevos).Unficheropuedecontener

    muchostags,unodetrsdeotro.

    steesunodelosformatosmsabiertosqueexiste:admitehasta64000canales,un

    nmero arbitrario de bits por pxel (hasta enteros o reales de 64 bits), distintos

    espacios de color, mltiples imgenes por fichero, cualquier tipo de compresin

    existente...

  • Caberesearqueunaimagensepuedealmacenarportiras(cadauna1tag).

    Comoventajasdeesteformatotenemos:

    Esindependientedelaplataforma,flexibleyampliable.

    Puedeadaptarseamuchostiposdenecesidades.

    Puedecontener(encapsular)ficherosconotrosformatos.

    Losinconvenientesdelformatoson:

    Esdemasiadoflexible,porloqueesdifcilcrearunprogramaquesoporte

    todaslasopcionesytiposdetags.

    Elalmacenamientoentirasesinadecuadoparaciertosusos.

    Algunasdelasaplicaciones:

    Edicindefotografadealtacalidad,comoimpresindecarteles

    Aplicacionesconnecesidadesespeciales,comoimgenesmultiespectrales,

    conaltaresolucindecolor...

    FormatoJPEG

    Esunformatobastantereciente,estmselaboradoyorientadoalalmacenamiento

    deimgenesfotogrficas.

    Admitetantoimgenesenescaladegrises(1byteporpxel)comoimgenesencolor

    RGB(3bytesporpxel).Adems,incluyemecanismosavanzadosdecompresin,que

    puedenajustarseadistintosratiosdecompresin.

    Unadesusprincipalescaractersticaseslacompresinconprdida,medianteDCT.

    Elficheropuedeincluirunaversinreducidaparaprevisualizar la imagenantesde

    leerla.

    Otroaspectoatenerencuentaesqueseencuentralibredepatentes.

  • Ventajas: Enlamayoradeloscasosconsigueunratiocompresin/calidadmuchomejorque

    losotrosformatos.Adems,suniveldecompresinesajustable,tpicamenteentre1:10y1:100

    Esunformatomuypopularycasiexclusivoenmuchosmbitos.Inconvenientes: Poseecompresiones/descompresionescomplejasycostosas Noincluyetransparenciasnianimaciones Lainformacinperdidanoserecupera.SitrabajamosconunJPEGguardandoen

    discotrascadaoperacin,laimagensevadegradando.Aplicaciones: Seutilizaprcticamenteen todas lasaplicacionesde fotografadigital: captura,

    almacenamiento,transmisin,impresin... Noesconvenienteutilizarlosinosepermiteprdidadecalidadosisetrabajacon

    dibujos.

    Tiposdeimgenes

    Las imgenesquevamosa tratar sonbsicamentede tres tipos: imgenesde

    intensidad,binariasodecolor.

    Imagenbinaria

    Laprincipalcaractersticadelasimgenesbinariasesquesoloutilizandosnivelesde

    intensidadparasucodificacin:elblancoyelnegro,olosbits1y0.

    Enestetipodeimgenes1pxelcorrespondecon1bit,luegoeseltipomssencillo

    quenosvamosaencontrar.

    Imagendeintensidad

    Las imgenesde intensidad tambinsonconocidascomo imgenesenescalade

    grises,ysuprincipalcaractersticaesquepermitencodificarunpxelcon255niveles

    degrisdistintos:siendoel0=negroyel255=blanco.

    Enestetipodeimgenes1pxelsecorrespondecon1byte,deahlos255niveles

    permitidos.

  • Imgenesdecolor

    Enlaimgenesdecolorcadapxelsecodificacontrescoloresdistintos(rojo,verdey

    azul),teniendocadacolorlaprofundidadde1byte.

    Por tanto,cadapxel secodificar con3bytes, siendoel nmero total decolores

    posiblesdelordende16,7millones.Estoesloquesellamaunaimagenmulticanal,en

    estecasode3canales.AunquetambinexistenimgenesRGBAdecuatrocanales

    dondeelcuartocanalindicaelniveldetransparenciadeunpxel,conaplicacionesen

    visinnocturnaoimgenesporsatlite.Estetipodeimgenesnolasvamosatratar.

    Existendosformasbsicasdealmacenamientodeuna imagenRGB,comosonel

    entrelazado(dondesealmacenasiguiendoR0 G0 B0 ,R1G1 B1, R2G2 B 2 ...)oelno

    entrelazado(dondesealmacenasiguiendoR0R1R2...,G0G1G2...,B0B1B2...).

    Perotodoestonoestlimitadoaunosparmetrossinoqueexisteninfinitostipos

    posibles,yaqueunniveldegrisouncolorsepuedenrepresentarconmsomenosbits,

    loquesellamaprofundidaddecolor(depth).Astambinexistenlasimgenesenpunto

    flotantequesontilesparaprocesosintermediosdonde1pxel=1floatodouble.

    Tiposdedatosdeunpxel

    Unpxelpuedetomarunagrancantidaddetiposdedatosposible,parasaberel

    tipodedatodeunpxelbastarconaccederalcampodepthdelaimagen,noobstante

    existeunciertonmerodetiposdedatospermitidos,queyaexpusimosenladescripcin

    delaestructuraIplImage,peroquevolvemosahaceraquparamayorclaridad:

    IPL_DEPTH_8U:Enterossinsignode8bits(unsignedchar)

    IPL_DEPTH_8S:Enterosconsignode8bits(signedcharosimplementechar)

    IPL_DEPTH_16S:Enterosde16bitsconsigno(shortint)

    IPL_DEPTH_32S:Enterosconsignode32bits(int)

  • IPL_DEPTH_32F:Nmerosenpuntoflotanteconprecisinsimplede32bits(float)

    Transformacionesafines

    Seentiendeportransformacinafncualquiertipoderotacinescaladootraslacin

    queseproduzcaen lasdosdireccionesespacialesdelplano.Comotransformaciones

    afinesprincipalespodemoscitar:elescalado,larotacinylatraslacin.

    Elelementobsicodetodatransformacinafneslamatrizdetransformacin,que

    serlaencargadadedefinirlaclaseylosparmetrosdelatransformacinarealizar.As,

    tendremossiempreunamatrizasociadatantoparaelescalado,comoparalarotacin,

    comoparalatraslacin.

    Traslacin

    Latraslacintambinesconocidacomodesplazamiento,ysebasaenelcambio

    deposicindeunobjetodeacuerdoconunafrmula.

    Por lo tanto, la imagen de salida obtenida se relaciona con la entrada de la

    siguientemanera:

    Img_resultado(x,y)=Img_origen(x+dx,y+dy)

    Siendo,dx=desplazamientoenelejehorizontal

    dy=desplazamientoenelejevertical

    De forma grfica, podemos ejemplificar lo anterior con las siguientes figuras

    (suponiendoquecadacuadradoequivaleaunpxel):

    Situacin Aplicamostraslacin(1,1) Aplicamostraslacin(1,1)inicialImg_result(x,y)=Img_org(x+1,y+1)Img_rs(x,y)=Img_or(x1,y1)

  • Al trasladar la imagenaparecenpxelesquenoquedandefinidos.Alahorade

    programar tomaremosestospxelescomo0, esdecir colornegro.Las funcionesque

    utilizaOpencvparalatraslacin,noasignanningnvaloraestosrecuadros,conloque

    tenemoslibertadparaasignarleselvalormsconveniente.

    El parmetroquenosdefine lascaractersticasde la traslacines lamatrizde

    transformacin,queenestecasoesdeltipo:

    Matrizdetransformacin=

    1 0 dx

    0 1 dy

    En Opencv toda transformacin afn se puede implementar con la funcin

    cvWarpAffine quegeneraunaimagendesalidaalaqueselaaplicalatransformacin

    correspondiente.Losparmetrosdeestafuncinsonlossiguientes:

    voidcvWarpAffine(constCvArr*src,CvArr*dst,constCvMat*map_matrix,

    intflags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,

    CvScalarfillval=cvScalarAll(0));

    Siendocadaunodeellos:

    src:Imagenfuente,alacualseleaplicalatransformacin.

    dst:Imagendestino,dondeseobtienelatransformacinrealizada.

    map_matrix:Matrizdetransformacin,dedimensiones2x3.

    flags:

    Lostiposdeinterpolacinpuedenser:

    CV_INTER_NN:Interpolacintipovecinomsprximo

    CV_INTER_LINEAR:Interpolacinbilineal(eslaqueseutiliza

    pordefecto)

    CV_INTER_AREA:Seutilizalarelacindepxelyreaparaasignarvalores.Enel

    casodeampliarlaimagenactaanlogamenteaelmtodoCV_INTER_NN.

    CV_INTER_CUBIC:Interpolacinbicbica.

    Loqueacontececonlospxelessobrantes,seconfiguraconlas

    siguientesopciones:

    CV_WARP_FILL_OUTLIERS:Rellenatodoslospxelesdelaimagen

  • destino.Sialgunosdeelloscorrespondenconpartesquequedan

    fueradelaimagenorigen,sonrellenadosaunvalorfijo.

    CV_WARP_INVERSE_MAP:Indicaquelamatrizrepresentalarelacin

    detransformacininversa,esdecir,delaimagendestinoala

    fuente,porloquepuedeserutilizadaparalainterpolacinde

    pxeles.

    fillval:Eselvalorderellenoqueseusaparadefinirlostrozosque

    quedanfueradelaimagen.

    Porlotantoesnecesariodefinirpreviamentealaaplicacindeestafuncin,su

    matrizdetransformacin.

    Ejemplodetraslacin

    El siguiente programa implementa una traslacin haciendo uso de los

    recursosqueproporcionaOpencv.

    #include"cv.h"#include"highgui.h"#include"math.h"#includeintmain(intargc,char**argv){IplImage*src;/*elprimerparmetroquesepaseporconsoladebeserelnombredelfichero*/if(argc==2&&(src=cvLoadImage(argv[1],1))!=0){IplImage*dst=cvCloneImage(src);//clonamoslaimagen//fuente,paraquelaimagendestino//tengalosmismosparmetrosespacialesquelafuenteintdx=40;//desplazamientoenpxelesenelejex;intdy=40;//desplazamientoenpxelesenelejey;CvMat*M=cvCreateMat(2,3,CV_32FC1);//staserlamatrizdetransformacincvmSet(M,0,0,1);//asignamosvalor1alelemento(0,0)cvmSet(M,0,1,0);//asignamosvalor0alelemento(0,1)cvmSet(M,1,0,0);//asignamosvalor0alelemento(1,0)cvmSet(M,1,1,1);//asignamosvalor1alelemento(1,1)cvmSet(M,0,2,dx);//elcuartonmeroindicalospxeles//queserecorrenenelejex

    //Paraelloasignamosesenmeroalelemento(0,2)//delamatrizdetransformacincvmSet(M,1,2,dy);//idemejey

  • cvWarpAffine(src,dst,M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(0));

    //aplicamoslatransformacin,asignandoalospxelesno//definidoselvalor0(colornegro)

    cvNamedWindow("origen",1);//dibujamoslaimagendeentradacvNamedWindow("resultado",1);//dibujamoslaimagenresultantecvShowImage("origen",src);cvShowImage("resultado",dst);cvWaitKey(0);//paraterminarelprogramapulsartecla

    cvDestroyAllWindows();//destruimostodaslasventanas cvReleaseImage(&src);

    cvReleaseImage(&dst);cvReleaseMat(&M);}elseexit(0);cvReleaseImage(&src);return0;}

    Comocomentarioadicional,enesteprogramahemoscomprobadoquelaimagen

    src ha sido cargada correctamente (src no es un puntero nulo). Esto es bastante

    conveniente.

    Comosalidadeesteprogramasemuestrandosimgenes,laprimeradeellasesla

    imagenorigen, sobre la que vamosa realizar la traslacin. En la segunda figura se

    muestralaimagenresultadodeaplicarlatraslacinalaimagenorigen.

    Ambasfiguras(6y7),semuestranacontinuacin:

    Figura6 Figura7

  • Escalado

    Elescaladoesunatransformacinafnquepuedeaumentarodisminuirunobjeto

    porundeterminadofactor.

    La imagenqueseobtienea lasalidase relacionacon la entradasiguiendo la

    siguienteregla:

    Imag_destino(x,y)=Imag_origen(ex*x,ey*y)

    siendo:

    ex:escalaenelejex

    ey:escalaenelejey

    Dentro del escalado existen dos supuestos bsicos: que la imagen de salida

    aumenteconrespectoa la imagendeentrada(aumento), oque la imagendesalida

    disminuyaconrespectoalaimagendeentrada(reduccin).Laaplicacindeunauotra

    dependerdelfactordeescalaqueintroduzcamos.

    Siexoeysonmayoresque1,seproduceunaumentoozoomdelaimagen.

    Siexoeysonmenoresque1,seproduceunadisminucindelaimagen.

    Siexoeysoniguala1,laimagenquedainvariante.

    As,enfuncindelaumentoodeladisminucinquerealicemoslaimagendesalida

    quedarcodificadaconundeterminadonmerodepxeles:

    Si la imagendeentradaesdetamaopx*py,la imagendesalidaser de

    tamaopx/ex*py/ey.

    ConlalibreraOpencvexistendosmodosbsicosderealizarestasoperaciones:

    podemos utilizar la funcin genrica de transformaciones afines cvWarpAffine, o una

    funcinespecficadeescaladocvResizequenosaportaungradomayordeversatilidad.

    Tambinresultaimprescindibledefinirlamatrizdetransformacinquenosdictar

  • losparmetrosdelamisma:

    Matrizdetransformacin= ex 0 00 ey 0

    Ejemplosdeescalado

    Enprimer lugar vamosa mostrar un programaqueescala una imagencon la

    funcingenricacvWarpAffine.

    #include"cv.h"#include"highgui.h"#include"math.h"#includeintmain(intargc,char**argv){IplImage*src;/*elprimerparmetroquesepaseporconsoladebeserelnombredelfichero*/if(argc==2&&(src=cvLoadImage(argv[1],1))!=0){IplImage*dst=cvCloneImage(src);//clonamoslaimagenfuente,paraquelaimagendestino

    //tengalosmismosparmetrosespacialesquelafuentefloatex=1;//factordeescalaenelejex;floatey=0.5;//factordeescalaenelejey;CvMat*M=cvCreateMat(2,3,CV_32FC1);//matrizdetransformacin(2x3)cvmSet(M,0,0,ex);//factordeescalaejexcvmSet(M,0,1,0);//asignamosvalor0alelemento(0,1)cvmSet(M,1,0,0);//asignamosvalor0alelemento(1,0)cvmSet(M,1,1,ey);//factordeescalaejeycvmSet(M,0,2,0);//asignamosvalor0alelemento(0,2)cvmSet(M,1,2,0);//asignamosvalor0alelemento(1,2)

    cvWarpAffine(src,dst,M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,cvScalarAll(255));//aplicamoslatransformacin,asignandoalospxelesno

    //definidoselvalor0(colornegro)

    cvNamedWindow("origen",1);//dibujamoslaimagenresultantecvShowImage("origen",src);cvNamedWindow("resultado",1);//dibujamoslaimagenresultantecvShowImage("resultado",dst);cvWaitKey(0);//EsperaapulsarunateclacvDestroyAllWindows();//destruimostodaslasventanas

    cvReleaseImage(&src);

  • cvReleaseImage(&dst);cvReleaseMat(&M);}elseexit(0);cvReleaseImage(&src);return0;}

    Enlafigura9seapreciaelresultadodeaplicarunescaladoalaimagenoriginal

    (figura8).Enestecasonicamentesehaescaladosobreelejevertical(ejey),aplicando

    unfactordeescalade0,5,esdecir, reducindolaalamitad.Elejehorizontal(ejex),

    permaneceintacto(factordeescala1).

    Pasamos a mostrar un segundo programa de escalado utilizando la funcin

    cvResize.Enprimerlugaresnecesariocomprenderestafuncinysusparmetros:

    voidcvResize(constCvArr*src,CvArr*dst,

    intinterpolation=CV_INTER_LINEAR);

    Siendo:

    src:Imagenfuente.

    dst:Imagendestino.

    interpolation:Tipodeinterpolacin.Lainterpolacinpuedeserde

    lossiguientesmodos:

    CV_INTER_NN:Interpolacintipovecinomsprximo

    CV_INTER_LINEAR:Interpolacinbilineal(eslaqueseutiliza

    pordefecto)

    CV_INTER_AREA:Seutilizalarelacindepxelyreapara

    asignarvalores.Enelcasodeampliarlaimagenacta

    anlogamenteaelmtodoCV_INTER_NN.

    Figura8 Figura9

  • CV_INTER_CUBIC:Interpolacinbicbica.

    Elusodeestafuncinamplialasposibilidadesdeinterpolacin.Porejemplo,si

    ampliamos una imagen la opcin ms adecuada sera la utilizacin de interpolacin

    bilinealobicbica.

    Tambinesimportanteremarcar,queenestecasoelfactordeescalasedefineen

    pxeles, es decir, el propio usuario decide las dimensiones tanto horizontales como

    verticalesdelaimagendesalida.

    Pasamosamostrarunprograma,queescalaunaimagenconestafuncin:

    #include"cv.h"#include"highgui.h"#includecharname0[]="lena.jpg";//enestaocasincargamos//elficheroenelpropioprogramaintmain(){IplImage*imagen=NULL;//inicializoimagenimagen=cvLoadImage(name0,1);//cargamoslaimagenintpx=200;//pxelesenelejexdelaimagenescalada,//esdecir,estamosdefiniendolaescalaXintpy=400;//pxelesenelejexdelaimagenescalada,//esdecir,estamosdefiniendolaescalaY

    IplImage*resized=cvCreateImage(cvSize(px,py),IPL_DEPTH_8U,3);//creamoslaestructura//dondeubicaremoslaimagenescalada,//siendopxypylospxelesdelaimagen//destino,esdecir,elpropiofactordeescalacvResize(imagen,resized,CV_INTER_LINEAR);//escaladodelaimagencvNamedWindow("test",1);//representamoslaimagenescalada//(conel1indicamosquela//ventanaseajustealosparmetrosdelaimagen)cvShowImage("test",resized);cvWaitKey(0);//pulsamoscualquierteclaparaterminarelprogramacvDestroyAllWindows();//destruimostodaslasventanascvReleaseImage(&imagen);cvRelase(Image(&resized);return0;}

    Enestecasoladefinicindelescaladoesunpocodistinta,yaqueseindicaal

    programaelnmerodepxeles,tantoverticalescomohorizontales,queconstituirnla

    imagenresultado.

  • Enlafigura10semuestralaimagendeentrada,yenlafigura11obtenemosla

    imagenescalada,asignandoalejeverticaldelaimagenescalada400pxelesdelongitud

    yasuejehorizontal200pxeles.Elresultadosemuestraacontinuacin:

    Rotacin

    Larotacinesunatransformacinenlaquelosejesdecoordenadassonrotados

    undeterminadongulorespectoalorigen.

    Lasoperacionesenlascoordenadasquesellevanacaboenlarotacinsepueden

    sintetizarenlasiguienterelacin:

    Imagen_resultado(x,y)=Imagen_inicial(xcos +ysen , xsen +ycos )

    siendo =nguloderotacin

    Esdecir,siReslamatrizderotacin:

    cos() sen()

    sen() cos()

    yresunvectorcolumna:

    x

    y

    EntoncesImagen_destino(x,y)=Imagen_origen(Rr)

    Figura10Figura11

  • Conlamatrizdefinidaanteriormentelarotacinserealizarespectoalpunto(0,0)

    pero si queremos definir un centro de rotacin en el punto (cx, cy), la matriz de

    transformacincambia,siendodelsiguientemodo:

    cos() sen() cxcxcos()cysen()

    sen() cos() cy+cxsen()cycos()

    Puesahorasolorestaaplicarestosconceptosparaimplementarlaoperacinde

    rotacin.Opencvofrecedosposibilidadesdistintaspararealizarestaoperacin.Porun

    lado est el uso de la funcin genrica para transformaciones afines cvWarpAffine

    acompaada de la funcin cv2DRotationMatrix que calcula la matriz de rotacin

    necesaria.PorotroladodisponemosdelafuncincvGetQuadrangleSubPixquerealizala

    mismafuncinquelaanteriorconalgunamatizacin:

    Lafuncin cvWarpAffine exigequetanto imagendeentradacomodesalida

    tengan el mismo tipo de datos, mientras que cvGetQuadrangleSubPix permite

    compaginartiposdedatosdistintos.

    LafuncincvWarpAffinepuededejarpartedelaimagendesalidasinrellenaro

    sin modificar suvalor anterior, mientrasqueen cvGerQuadrangleSubPix todos los

    puntos de la imagen de salida toman un valor, incluso aquellos que no estn

    directamentedefinidossonasignadosalvalordelpxelmsprximo.

  • Ejemplosderotacin

    Comenzamosestudiandoelcasoderotarunaimagenutilizandolafuncingenrica

    cvWarpAffine, ya estudiada. Sin embargo, debemos introducir la funcin

    cv2DRotationMatrixparaelclculodelamatrizdetransformacin:

    CvMat*cv2DRotationMatrix(CvPoint2D32fcenter,doubleangle,double

    scale,CvMat*map_matrix);

    Siendo:

    center:Centroderotacindelaimagen(unacoordenadaen2D)

    angle:Elnguloderotacinengrados.Valorespositivosdeeste

    ngulorotanlaimagenenelsentidocontrarioalasagujasdelreloj.

    Elorigendecoordenadassesuponequeseencuentraenlaesquina

    superiorizquierdadelaimagen.ElngulosedaenGRADOS.

    map_matrix:Punteroalaubicacindelamatrizdedimensiones2x3.

    Eslasalidadelafuncin,esdecir,lamatrizderotacindeseada.

    Pasamos a mostrar un programa que utiliza estas estructuras para rotar una

    imagen:

    #include"cv.h"#include"highgui.h"#includecharname0[]="pasillo1.jpg";intmain(){IplImage*imagen=NULL;//inicializoimagenimagen=cvLoadImage(name0,1);//cargamoslaimagenarotar

    //definimoslaimagendesalidadonde//serepresentaraalaimagenrotadaIplImage *rotated=cvCreateImage(cvGetSize(imagen),IPL_DEPTH_8U, imagen>nChannels);

    CvPoint2D32fcenter;//definimoselelcentrodelarotacinintangle=30;//definimoselnguloderotacinengradosCvMat*mapMatrix=cvCreateMat(2,3,CV_32FC1);//definimoslasdimensionesdelamatrizdetransformacincenter.x=160;//asignamoslacoordenadaxdelarotacinquedeseemoscenter.y=120;//asignamoslacoordenadaydelarotacinquedeseemoscv2DRotationMatrix(center,angle,1.0,mapMatrix);//calculalosvaloresdemapMatrixcvWarpAffine(imagen,rotated,mapMatrix,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0));//realizalatransformacinderotacin

  • cvNamedWindow("origen",1);//representalaimagenrotadacvShowImage("origen",imagen);cvNamedWindow("resultado",1);//representalaimagenrotadacvShowImage("resultado",rotated);cvWaitKey(0);//esperaapulsarteclaparafinalizarcvDestroyAllWindows();//destruimostodaslasventanascvReleaseImage(&imagen);cvReleaseImage(&rotated);cvReleaseMat(&mapMatrix);return0;}

    Alaplicarunarotacinsobreunaimagencualquiera(figura12),conuntamaode

    320x240pxeles.Obtenemoslaimagenrotadaqueseobservaenlafigura13.Elcentro

    de la rotacincoincideeneste casoconel centro de la imagen (160x120). Seha

    definidounnguloarbitrarioderotacinde30grados.Lapartedelaimagenrotadaque

    quedasindefinir,sehafijadoacolorblanco.

    El segundo caso de rotacin bajo anlisis utiliza la funcin

    cvGetQuadrangleSubPix, enestecasodefinimoslamatrizdetransformacindeforma

    artesanal.Vamosaestudiarlosparmetrosdelafuncin:

    voidcvGetQuadrangleSubPix(constCvArr*src,CvArr*dst,constCvMat*

    map_matrix);

    Siendo:

    src:Imagenquequeremosrotar.

    dst:Trozodelaimagensrcquetomamos.Ennuestrocasotomaremosla

    imagenentera(dimensionesdesrcigualesalasdedst).

    map_matrix:Lamatrizdetransformacin(3x2).

    Figura12 Figura13

  • Loqueenrealidadhaceestafuncinestomarpxelesdelaimagenoriginalcon

    unaprecisinmayor, y losrepresentaen la imagendestinoconesamayorprecisin,

    aplicandolarelacindetransformacindefinidaporlamatriz.

    Elsiguienteprogramamuestracomorotarunaimagenconesafuncin:

    #include"cv.h"#include"highgui.h"#include"math.h"intmain(intargc,char**argv){IplImage*src;if(argc==2&&(src=cvLoadImage(argv[1],1))!=0)//cargamoslaimagenensrc{IplImage*dst=cvCloneImage(src);//hacemosunacopiadelaimagenendst,paraque//laimagendestinoposealosmismosparmetrosquelaorigenintangle=25;//definimoselnguloderotacinfloatm[6];//componentesdelamatrizMCvMatM=cvMat(2,3,CV_32F,m);//matrizdetransformacinintw=src>width;//anchuraenpxelesdelaimageninth=src>height;//alturaenpxelesdelaimagen

    m[0]=(float)(cos(angle*2*CV_PI/180.));//elementosdelamatrizm[1]=(float)(sin(angle*2*CV_PI/180.));m[2]=w*0.5f;m[3]=m[1];m[4]=m[0];m[5]=h*0.5f;

    cvGetQuadrangleSubPix(src,dst,&M);//aplicamoslarotacincvNamedWindow("origen",1);//representamoslarotacincvShowImage("origen",src);cvNamedWindow("resultado",1);//representamoslarotacincvShowImage("resultado",dst);cvWaitKey(0);//pulsarteclaparaterminarcvDestroyAllWindows();cvReleaseImage(&dst);}elseexit(0);cvReleaseImage(&src);return0;}

    Alaplicarlarotacinsobrelafigura14obtenemoslaimagenrepresentadaenla

    figura15.Elcentrodelarotacineselcentrodelaimagenyesngulodegiroseha

    fijadoa25grados.Comonovedaddestacaelrellenodelapartedelaimagenrotadaque

    quedasindefinir,conlosvaloresquestaposeeenelcontornodelamisma.

  • Binarizacindeimgenes

    Enestaseccinsepretendedaraentender lasarmasconlasquenosprovee

    Opencv para el cambio de codificacin entre imgenes. As, el principal objetivo es

    encontrarunafuncinoconjuntodefuncionesquerealicenlamismaoperacinquelas

    estructurasgraythreshyim2bwrealizanenMatlab.

    Portanto,debemossercapacesdetomarunaimagenenescaladegrises(imagen

    deintensidad)yconvertirlaenimagenbinaria,mediantelaaplicacindeunumbral.Todos

    losvaloressuperioresalvalorumbralsernbinarizadosa1ylosquenosuperenese

    valorloserna0.

    OpencvproporcionalafuncincvThresholdparaelprocesodebinarizacin.Vamos

    aanalizarlamsenprofundidad:

    voidcvThreshold(constCvArr*src,CvArr*dst,doublethreshold,double

    max_value,

    intthreshold_type);

    Siendo:

    src:Imagenorigen.Podrtenercodificacinde8bitsode32bits

    enpuntoflotante.

    dst:Imagendesalida.Deberserde8bitsodeigualtipoquela

    sealdeentrada.

    threshold:Elvalorumbraldelabinarizacin.

    max_value:Valormximoautilizarparalosdostiposdebinarizacinmsfrecuentes

    Figura14 Figura15

  • (CV_THRESH_BINARYyCV_THRESH_BINARY_INV). threshold_type:Eltipodebinarizacinarealizar.Exponemoslos

    tiposexistentes:

    threshold_type=CV_THRESH_BINARY:dst(x,y)=max_value,si

    src(x,y)>threshold

    0encasocontrario.

    threshold_type=CV_THRESH_BINARY_INV:dst(x,y)=0,si

    src(x,y)>thresholdmax_valueencasocontrario.

    threshold_type=CV_THRESH_TRUNC:dst(x,y)=threshold,si

    src(x,y)>threshold

    src(x,y)encasocontrario.

    threshold_type=CV_THRESH_TOZERO:dst(x,y)=src(x,y),si

    (x,y)>threshold

    0encasocontrario.

    threshold_type=CV_THRESH_TOZERO_INV:dst(x,y)=0,si

    src(x,y)>threshold

    src(x,y)encasocontrario.

    ApartedeestatransformacinOpencvtambinnosdalaposibilidaddetransformar

    unaimagenRGBenotraenescaladegrises,utilizandolafuncincvCvtColor:

    voidcvCvtColor(constCvArr*src,CvArr*dst,intcode);

    Siendo:

    src:Laimagenorigencodificadaen8bitsoenpuntoflotante

    dst:Laimagendestinocodificadaen8bitsoenpuntoflotante

    code:Definelaoperacindeconversinallevaracabo.Esta

    operacinsedefineutilizandolasconstantes

    CV_2.

    Caberemarcarqueexistengrancantidaddecombinacionesquesepueden

    llevaracabo.Nosotrosestamosinteresadosenlatransformacin

    BGR2GRAY.Todaslascombinacionesposiblessepuedenconsultarenel

    manualdelafuncin.

  • Ejemplodebinarizacin

    Pasamosaenunciarunejemplodeestafuncin:

    #include"cv.h"#include"highgui.h"#include"math.h"intmain(){IplImage*src;//imagendecolorbaseIplImage*colorThresh;//contendrlaimagendecolorbinarizadaIplImage*gray;//contendrlaimagenconvertidaenescaladegrisesIplImage*grayThresh;//imagenbinariaconseguida//apartirdelaimagenenescaladegrisesintthreshold=120;//definimoselvalorumbralintmaxValue=255;//definimoselvalormximointthresholdType=CV_THRESH_BINARY;//definimosel//tipodebinarizacin

    src=cvLoadImage("out4553.pgm",1);//cargamosimagendecolorcolorThresh=cvCloneImage(src);//copiamosesaimagendecolorgray=cvCreateImage(cvSize(src>width,src>height),IPL_DEPTH_8U,1);//laimagendeintensidadtendrlamismaconfiguracin//quelafuenteperoconunsolocanal

    cvCvtColor(src,gray,CV_BGR2GRAY);//pasamoslaimagendecolor//aescaladegrisesgrayThresh=cvCloneImage(gray);//copiamoslaimagenenescala//degrises(trucoanterior)

    cvNamedWindow("src",1);//representamoslaimagendecolorcvShowImage("src",src);

    cvNamedWindow("gray",1);//representamoslaimagendeintensidadcvShowImage("gray",gray);

    cvThreshold(src,colorThresh,threshold,maxValue,thresholdType);//binarizamoslaimagendecolor

    cvThreshold(gray,grayThresh,threshold,maxValue,thresholdType);//binarizamoslaimagendeintensidad

    cvNamedWindow("colorThresh",1);//representamoslaimagen//decolorbinarizadacvShowImage("colorThresh",colorThresh);

    cvNamedWindow("grayThresh",1);//representamoslaimagen//deintensidadbinarizadacvShowImage("grayThresh",grayThresh);

    cvWaitKey(0);//pulsamosteclaparaterminar

    cvDestroyWindow("src");//destruimostodaslasventanas

  • cvDestroyWindow("colorThresh");cvDestroyWindow("gray");cvDestroyWindow("grayThresh");

    cvReleaseImage(&src);//eliminamostodaslasimgenescvReleaseImage(&colorThresh);cvReleaseImage(&gray);cvReleaseImage(&grayThresh);return0;}

    Lafigura16representaunaimagendecolor.Enlafigura17seharepresentadola

    imagenanteriorperoconvertidaaescaladegrises.Sobreesaimagenenescaladegrises

    seharealizado la binarizacin, conumbral ennivel de intensidad120, obteniendo la

    instantneadelafigura18.

    Figura16 Figura17 Figura18

  • Operacionesconmatrices

    Opencvofertavariasfuncionesdetratamientodematrices,lamayoradeellasse

    basanen la realizacindeoperacioneselementoporelemento.Sinembargo,nuestro

    estudiosebasaenclculomatricialenconjuntoynoelementoporelemento,conloque

    noscentraremosenlamultiplicacindematricestradicionalyenelclculodelainversa.

    Inversindematrices

    Alahoradeinvertirmatricesdeformamanualsebarajandosotresmtodosms

    populares.Opencvtambinpermitedefinirelmtodoqueseconsideremsconveniente,

    oferta tres caminosdistintos por los que invertir unamatriz, todosellos dentro de la

    funcincvInvert.Lafuncineslasiguiente:

    doublecvInvert(constCvArr*src,CvArr*dst,intmethod=CV_LU);

    Ladescripcindelosparmetroseslasiguiente:

    src:Lamatrizquesedeseainvertir

    dst:Matrizdesalida,contienelainversadelamatrizdeentrada

    method:Mtododeinversin.Exponemoslosmtodosadjuntandosu

    descripcineningls,paranodistorsionarsusignificado:

    CV_LUGaussianeliminationwithoptimalpivotelementchose

    CV_SVDSingularvaluedecomposition(SVD)method

    CV_SVD_SYMSVDmethodforasymmetricpositivelydefinedmatrix

    Ejemplodeinvertirmatrices

    Exponemosunejemplo sencillo para concretar el funcionamiento de la funcin

    anterior:

    #include"cv.h"#include"highgui.h"#include"math.h"#include

  • intmain(){CvMat*M=cvCreateMat(2,2,CV_64FC1);//matrizainvertirCvMat*P=cvCreateMat(2,2,CV_64FC1);//contendrlamatrizinversa

    cvmSet(M,0,0,1.0);//definimoslamatrizainvertircvmSet(M,0,1,2.0);cvmSet(M,1,0,3.0);cvmSet(M,1,1,7.0);

    cvInvert(M,P,CV_LU);//invertimoslamatrizcvReleaseMat(&M);cvReleaseMat(&P);return0;}

    Sisedesearavisualizarelresultadodeestainversindematricesporpantalla,la

    expresinqueseobtendraseralasiguiente:

    1 23 71

    = 7 23 1

    Multiplicacindematrices

    La funcin de multiplicar dos matrices no est directamente implementada en

    Opencv,perosexistenfuncionesquerealizanlamultiplicacinconalgnmatizaadido.

    Estamoshablandode la funcin cvMulMatAdd queaparte demultiplicar dosmatrices

    tambin suma una tercera al producto, para utilizar esta funcin debemos definir

    convenientementelasmatricesutilizandocvInitHeader.Pasamosadarunadescripcinde

    estasdosestructuras:

    CvMat*cvInitMatHeader(CvMat*mat,introws,intcols,inttype,void*

    data=NULL, intstep=CV_AUTOSTEP

    );

    Siendo:

    mat:Punteroalacabeceradelamatrizquesevaainicializar

    rows:Nmerodefilasenlamatriz

    cols:Nmerodecolumnasenlamatriz

    type:Tipodeloselementosdelamatriz

  • data:Punteroalacabeceradelamatrizparalaasignacindedatos

    step:tamaocompletoenbytesdeunafiladedatos,pordefectose

    tomaelmnimopasoposible(CV_AUTOSTEP),esdecir,sesuponequeno

    quedanhuecosentredosfilasconsecutivasdelamatriz

    LafuncincvMatMulAddevalaelproductodedosmatricesyaadelaterceraal

    mismo:

    cvMatMulAdd(srcasrcbsrccdst)

    siendo:

    srca:Primeramatrizamultiplicar

    srcb:Segundamatrizamultiplicar

    src:Matrizasumaralproductoanterior

    dst:Matrizqueguardaelresultadofinaldelasoperaciones

    Ejemplodemultiplicacin

    ElsiguienteprogramarealizaelproductoMc=Ma*Mb,delsiguientemodo:

    #include"cv.h"#include"highgui.h"#include"math.h"#include

    intmain(){//Elindicedecolumnaeselquecorreprimerodoublea[]={1,2,3,4,5,6,7,8,9,10,11,12};//definimosloselementosdelamatriza

    doubleb[]={1,5,9,2,6,10,3,7,11,4,8,12};//definimosloselementosdelamatrizb

    doublec[9];//declaramosloselementosdelamatrizc

    CvMatMa,Mb,Mc;//declaramoslasmatrices

    cvInitMatHeader(&Ma,3,4,CV_64FC1,a,CV_AUTOSTEP);//RellenamoslasmatricescvInitMatHeader(&Mb,4,3,CV_64FC1,b,CV_AUTOSTEP);cvInitMatHeader(&Mc,3,3,CV_64FC1,c,CV_AUTOSTEP);

    cvMatMulAdd(&Ma,&Mb,0,&Mc);//realizamoselproductodelasmatrices(3x4)y(4x3)

  • printf("multiplicacion%f%f%f%f%f%f",c[0],c[1],c[2],c[3],c[4],c[5]);return0;}

    Portantoesteprogramaejecutalaoperacinsiguiente,conelresultadoquese

    muestraenlaecuacinsiguiente.

    1 2 3 45 6 7 89 10 11 121 5 92 6 103 7 114 8 12= 30 70 11070 174 278110 278 446

  • BIBLIOGRAFA

    Pasamosacitar, lamayorpartedelabibliografautilizadaenlaconfeccindel

    manual:

    LeedsGuidetoOpencv.CxCoreReferenceManual

    Autor:DrewMorgan

    ltimaactualizacin:3Noviembrede2006

    http://www.comp.leeds.ac.uk/vision/opencv/opencvref_cxcore.htm

    CvReferenceManual

    Autor:DrewMorgan

    ltimaactualizacin:3deNoviembrede2006

    http://www.comp.leeds.ac.uk/vision/opencv/opencvref_cv.html

    HighGUIReferenceManual

    Autor:EdLawson

    http://cs.gmu.edu/~vislab/opencvdocs/ref/opencvref_highgui.htm

    OpenSourceComputingVisionLibrary.ReferenceManual.Intel

    http://www.intel.com/technology/computing/opencv/

    ImageProcessingandAnalysisReference

    Autor:FranciscoBlanesGmez/LuisM.Jimnez

    ltimaactualizacin:17deMayode2006

    http://isa.umh.es/pfc/rmvision/opencvdocs/ref/OpenCVRef_ImageProcessing.htm

    BasicStructuresandOperationsReference

    Autor:FranciscoBlanesGmez/LuisM.Jimnez

  • ltimaactualizacin:17deMayode2006

    http://isa.umh.es/pfc/rmvision/opencvdocs/ref/OpenCVRef_BasicFuncs.htm

    ProcesamientoAudiovisual.

    Autor:GinsGarcaMateos

    IntroductiontoprogrammingwithOpenCV

    Autor:GadyAgam

    ltimaactualizacin:27deEnerode2006

    http://www.cs.iit.edu/~agam/cs512/lectnotes/opencvintro/opencvintro.html

    ExperimentalandObsoleteFunctionalityReference

    Autor:MauricioFerreira/AurelioMoraes

    ltimaactualizacin:8deagostode2007

    http://www.tecgraf.pucrio.br/~malf/opencv/ref/opencvref_cvaux.htm

    ObjectRecognitionReference

    http://isa.umh.es/pfc/rmvision/opencvdocs/ref/OpenCVRef_ObjectRecognition.htm

    OpenCvIHighGui

    Autor:DavidMilln

    ltimaactualizacin:20deMarzode2005

    http://www.artresnet.com/david/tutorial.jsp?id=4

    Pxelprocessing

    Autor:BerndJhne/SpringerVerlag

    http://mmc36.informatik.uniaugsburg.de/mediawiki/data/3/37/VSP0607

    Lecture2new.pdf

    IntroductiontoOpencv

  • Autor:VadimPisarevsky

    ltimaactualizacin:9deJuniode2007

    http://fsa.ia.ac.cn/files/OpenCV_China_2007June9.pdf

    OpenSourceComputerVisionLibrary

    ltimaactualizacin:14deSeptiembrede2006

    http://wwwrobotics.cs.umass.edu/Documentation/OpenCV

    LushManual

    Autor:YannLeCun/LeonBottou

    ltimaactualizacin:24deNoviembrede2002

    http://lush.sourceforge.net/lushmanual/8193ae9d.html

    ForodeOpencvenYahooGroups:ForooficialdelosusuariosdeOpencv

    http://tech.dir.groups.yahoo.com/dir/Computers___Internet/Software/Open_Source

  • GNUFreeDocumentationLicenseGNUFreeDocumentationLicense

    Version1.2,November2002

    Copyright(C)2000,2001,2002FreeSoftwareFoundation,Inc.

    51FranklinSt,FifthFloor,Boston,MA021101301USA

    Everyoneispermittedtocopyanddistributeverbatimcopies

    ofthislicensedocument,butchangingitisnotallowed.

    0.PREAMBLE

    ThepurposeofthisLicenseistomakeamanual,textbook,orotherfunctionalandusefuldocument"free"inthesenseoffreedom:toassureeveryonetheeffectivefreedomtocopyandredistributeit,withorwithoutmodifyingit,eithercommerciallyornoncommercially.

    Secondarily,thisLicensepreservesfortheauthorandpublisherawaytogetcreditfortheirwork,whilenotbeingconsideredresponsibleformodificationsmadebyothers.

    ThisLicenseisakindof"copyleft", whichmeansthatderivativeworksof thedocumentmustthemselvesbefreeinthesamesense.ItcomplementstheGNUGeneralPublicLicense,whichisacopyleftlicensedesignedforfreesoftware.

    Wehave designed this License in order to use it for manuals for free software, because freesoftwareneedsfreedocumentation:afreeprogramshouldcomewithmanualsprovidingthesamefreedomsthatthesoftwaredoes.ButthisLicenseisnotlimitedtosoftwaremanuals;itcanbeusedforanytextualwork,regardlessofsubjectmatterorwhetheritispublishedasaprintedbook.WerecommendthisLicenseprincipallyforworkswhosepurposeisinstructionorreference.

    1.APPLICABILITYANDDEFINITIONS

    ThisLicenseappliestoanymanualorotherwork,inanymedium,thatcontainsanoticeplacedbythecopyrightholdersayingitcanbedistributedunderthetermsofthisLicense. Suchanoticegrants a worldwide, royaltyfree license, unlimited in duration, to use that work under theconditionsstatedherein.The"Document",below,referstoanysuchmanualorwork.Anymemberofthepublicisalicensee,andisaddressedas"you".Youacceptthelicenseifyoucopy,modifyordistributetheworkinawayrequiringpermissionundercopyrightlaw.

  • A"ModifiedVersion"oftheDocumentmeansanyworkcontainingtheDocumentoraportionofit,eithercopiedverbatim,orwithmodificationsand/ortranslatedintoanotherlanguage.

    A"SecondarySection"isanamedappendixorafrontmattersectionoftheDocumentthatdealsexclusivelywiththerelationshipofthepublishersorauthorsoftheDocumenttotheDocument'soverallsubject(ortorelatedmatters)andcontainsnothingthatcouldfalldirectlywithinthatoverallsubject.(Thus,iftheDocumentisinpartatextbookofmathematics,aSecondarySectionmaynotexplainanymathematics.) Therelationshipcouldbeamatter ofhistoricalconnectionwiththesubjectorwithrelatedmatters,oroflegal,commercial,philosophical,ethicalorpoliticalpositionregardingthem.

    The"InvariantSections"arecertainSecondarySectionswhosetitlesaredesignated,asbeingthoseofInvariantSections,inthenoticethatsaysthattheDocumentisreleasedunderthisLicense.IfasectiondoesnotfittheabovedefinitionofSecondarythenitisnotallowedtobedesignatedasInvariant.TheDocumentmaycontainzeroInvariantSections.IftheDocumentdoesnotidentifyanyInvariantSectionsthentherearenone.

    The"CoverTexts"arecertainshortpassagesoftextthatarelisted,asFrontCoverTextsorBackCoverTexts,inthenoticethatsaysthattheDocumentisreleasedunderthisLicense. AFrontCoverTextmaybeatmost5words,andaBackCoverTextmaybeatmost25words.

    A"Transparent"copyoftheDocumentmeansamachinereadablecopy,representedinaformatwhosespecificationisavailabletothegeneralpublic,thatissuitableforrevisingthedocumentstraightforwardly with generic text editors or (for images composed of pixels) generic paintprogramsor(fordrawings)somewidelyavailabledrawingeditor,andthatissuitableforinputtotext formatters or for automatic translation to a variety of formats suitable for input to textformatters. AcopymadeinanotherwiseTransparentfileformatwhosemarkup,orabsenceofmarkup, has been arranged to thwart or discourage subsequent modification by readers is notTransparent.AnimageformatisnotTransparentifusedforanysubstantialamountoftext.Acopythatisnot"Transparent"iscalled"Opaque".

    ExamplesofsuitableformatsforTransparentcopiesincludeplainASCIIwithoutmarkup,Texinfoinputformat,LaTeXinputformat,SGMLorXMLusingapubliclyavailableDTD,andstandardconformingsimpleHTML,PostScript orPDFdesignedforhumanmodification. Examples oftransparent image formats include PNG, XCF and JPG. Opaque formats include proprietaryformatsthatcanbereadandeditedonlybyproprietarywordprocessors,SGMLorXMLforwhichtheDTDand/orprocessingtoolsarenotgenerallyavailable,andthemachinegeneratedHTML,PostScriptorPDFproducedbysomewordprocessorsforoutputpurposesonly.

  • The"TitlePage"means,foraprintedbook,thetitlepageitself,plussuchfollowingpagesasareneededtohold,legibly,thematerialthisLicenserequirestoappearinthetitlepage.Forworksinformats which do not have any title page as such, "Title Page" means the text near the mostprominentappearanceofthework'stitle,precedingthebeginningofthebodyofthetext.

    Asection"EntitledXYZ"meansanamedsubunitoftheDocumentwhosetitleeitherispreciselyXYZorcontainsXYZinparenthesesfollowingtextthattranslatesXYZinanotherlanguage.(HereXYZ stands for a specific section name mentioned below, such as "Acknowledgements","Dedications","Endorsements",or"History".)To"PreservetheTitle"ofsuchasectionwhenyoumodifytheDocumentmeansthatitremainsasection"EntitledXYZ"accordingtothisdefinition.

    TheDocumentmayincludeWarrantyDisclaimersnexttothenoticewhichstatesthatthisLicenseappliestotheDocument.TheseWarrantyDisclaimersareconsideredtobeincludedbyreferenceinthisLicense,butonlyasregardsdisclaimingwarranties:anyotherimplicationthattheseWarrantyDisclaimersmayhaveisvoidandhasnoeffectonthemeaningofthisLicense.

    2.VERBATIMCOPYING

    You may copy and distribute the Document in any medium, either commercially ornoncommercially,providedthatthisLicense,thecopyrightnotices,andthelicensenoticesayingthis License applies to the Document are reproduced in all copies, and that youaddnootherconditionswhatsoevertothoseofthisLicense.Youmaynotusetechnicalmeasurestoobstructorcontrolthereadingorfurthercopyingofthecopiesyoumakeordistribute. However,youmayacceptcompensationinexchangeforcopies.Ifyoudistributealargeenoughnumberofcopiesyoumustalsofollowtheconditionsinsection3.

    Youmayalsolendcopies,underthesameconditionsstatedabove,andyoumaypubliclydisplaycopies.

    3.COPYINGINQUANTITY

    If youpublish printed copies (or copies in media that commonly have printed covers) of theDocument,numberingmorethan100,andtheDocument'slicensenoticerequiresCoverTexts,youmustenclosethecopiesincoversthatcarry,clearlyandlegibly,alltheseCoverTexts:FrontCoverTextsonthefrontcover,andBackCoverTextsonthebackcover.Bothcoversmustalsoclearlyandlegiblyidentifyyouasthepublisherofthesecopies.Thefrontcovermustpresentthefulltitlewithallwordsofthetitleequallyprominentandvisible.Youmayaddothermaterialonthecoversinaddition.Copyingwithchangeslimitedtothecovers,aslongastheypreservethetitleoftheDocumentandsatisfytheseconditions,canbetreatedasverbatimcopyinginotherrespects.

  • Iftherequiredtextsforeithercoveraretoovoluminoustofitlegibly,youshouldputthefirstoneslisted(asmanyasfitreasonably)ontheactualcover,andcontinuetherestontoadjacentpages.

    IfyoupublishordistributeOpaquecopiesoftheDocumentnumberingmorethan100,youmusteitherincludeamachinereadableTransparentcopyalongwitheachOpaquecopy,orstateinorwitheachOpaquecopyacomputernetworklocationfromwhichthegeneralnetworkusingpublichasaccesstodownloadusingpublicstandardnetworkprotocolsacompleteTransparentcopyoftheDocument,freeofaddedmaterial.Ifyouusethelatteroption,youmusttakereasonablyprudentsteps,whenyoubegindistributionofOpaquecopiesinquantity,toensurethatthisTransparentcopywillremainthusaccessibleatthestatedlocationuntilatleastoneyearafterthelasttimeyoudistributeanOpaquecopy(directlyorthroughyouragentsorretailers)ofthateditiontothepublic.

    It is requested, but not required, that you contact the authors of the Document well beforeredistributinganylargenumberofcopies,togivethemachancetoprovideyouwithanupdatedversionoftheDocument.

    4.MODIFICATIONS

    YoumaycopyanddistributeaModifiedVersionoftheDocumentundertheconditionsofsections2and3above,providedthatyoureleasetheModifiedVersionunderpreciselythisLicense,withtheModifiedVersionfillingtheroleoftheDocument,thuslicensingdistributionandmodificationoftheModifiedVersiontowhoeverpossessesacopyofit.Inaddition,youmustdothesethingsintheModifiedVersion:

    A.UseintheTitlePage(andonthecovers,ifany)atitledistinctfromthatoftheDocument,andfromthoseofpreviousversions(whichshould,iftherewereany,belistedintheHistorysectionoftheDocument).Youmayusethesametitleasapreviousversioniftheoriginalpublisherofthatversiongivespermission.

    B.ListontheTitlePage,asauthors,oneormorepersonsorentitiesresponsibleforauthorshipofthemodificationsintheModifiedVersion,togetherwithatleastfiveoftheprincipalauthorsoftheDocument(allofitsprincipalauthors,ifithasfewerthanfive),unlesstheyreleaseyoufromthisrequirement.

    C.StateontheTitlepagethenameofthepublisheroftheModifiedVersion,asthepublisher.

    D.PreserveallthecopyrightnoticesoftheDocument.

    E. Addan appropriate copyright notice for your modifications adjacent to the other copyrightnotices.

    F.Include,immediatelyafterthecopyrightnotices,alicensenoticegivingthepublicpermissiontousetheModifiedVersionunderthetermsofthisLicense,intheformshownintheAddendum

  • below.

    G.PreserveinthatlicensenoticethefulllistsofInvariantSectionsandrequiredCoverTextsgivenintheDocument'slicensenotice.

    H.IncludeanunalteredcopyofthisLicense.

    I.PreservethesectionEntitled"History",PreserveitsTitle,andaddtoitanitemstatingatleastthetitle,year,newauthors,andpublisheroftheModifiedVersionasgivenontheTitlePage.IfthereisnosectionEntitled"History"intheDocument,createonestatingthetitle, year,authors,andpublisheroftheDocumentasgivenonitsTitlePage,thenaddanitemdescribingtheModifiedVersionasstatedintheprevioussentence.

    J.Preservethenetworklocation,ifany,givenintheDocumentforpublicaccesstoaTransparentcopyoftheDocument, andlikewisethenetworklocationsgivenintheDocumentforpreviousversionsitwasbasedon.Thesemaybeplacedinthe"History"section.Youmayomitanetworklocationforaworkthatwaspublishedatleast fouryearsbeforetheDocumentitself, orif theoriginalpublisheroftheversionitreferstogivespermission.

    K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of thesection, and preserve in the section all the substance and tone of each of the contributoracknowledgementsand/ordedicationsgiventherein.

    L.PreservealltheInvariantSectionsoftheDocument,unalteredintheirtextandintheirtitles.Sectionnumbersortheequivalentarenotconsideredpartofthesectiontitles.

    M. Delete any section Entitled "Endorsements". Such a section may not be included in theModifiedVersion.

    N.DonotretitleanyexistingsectiontobeEntitled"Endorsements"ortoconflictintitlewithanyInvariantSection.

    O.PreserveanyWarrantyDisclaimers.

    IftheModifiedVersionincludesnewfrontmattersectionsorappendicesthatqualifyasSecondarySectionsandcontainnomaterial copiedfromtheDocument,youmayatyouroptiondesignatesomeorallofthesesectionsasinvariant.Todothis,addtheirtitlestothelistofInvariantSectionsintheModifiedVersion'slicensenotice.Thesetitlesmustbedistinctfromanyothersectiontitles.

    YoumayaddasectionEntitled"Endorsements",provideditcontainsnothingbutendorsementsofyourModifiedVersionbyvariouspartiesforexample,statementsofpeerrevieworthatthetexthas

    beenapprovedbyanorganizationastheauthoritativedefinitionofastandard.

    YoumayaddapassageofuptofivewordsasaFrontCoverText,andapassageofupto25wordsasaBackCoverText,totheendofthelistofCoverTextsintheModifiedVersion. Onlyonepassage of FrontCover Text and one of BackCover Text may be added by (or through

  • arrangementsmadeby)anyoneentity.IftheDocumentalreadyincludesacovertextforthesamecover,previouslyaddedbyyouorbyarrangementmadebythesameentityyouareactingonbehalfof,youmaynotaddanother;butyoumayreplacetheoldone,onexplicitpermissionfromthepreviouspublisherthataddedtheoldone.

    Theauthor(s)andpublisher(s)oftheDocumentdonotbythisLicensegivepermissiontousetheirnamesforpublicityforortoassertorimplyendorsementofanyModifiedVersion.

    5.COMBININGDOCUMENTS

    YoumaycombinetheDocumentwithotherdocumentsreleasedunderthisLicense,underthetermsdefinedinsection4aboveformodifiedversions,providedthatyouincludeinthecombinationalloftheInvariantSectionsofalloftheoriginaldocuments,unmodified,andlistthemallasInvariantSectionsofyourcombinedworkin its licensenotice, andthatyoupreserveall their WarrantyDisclaimers.

    ThecombinedworkneedonlycontainonecopyofthisLicense,andmultipleidenticalInvariantSectionsmaybereplacedwithasinglecopy.IftherearemultipleInvariantSectionswiththesamenamebutdifferentcontents,makethetitleofeachsuchsectionuniquebyaddingattheendofit,inparentheses,thenameoftheoriginalauthororpublisherofthatsectionifknown,orelseauniquenumber.MakethesameadjustmenttothesectiontitlesinthelistofInvariantSectionsinthelicensenoticeofthecombinedwork.

    In the combination, you must combine any sections Entitled "History" in the various originaldocuments, forming one section Entitled "History"; likewise combine any sections Entitled"Acknowledgements", and any sections Entitled "Dedications". You must delete all sectionsEntitled"Endorsements".

    6.COLLECTIONSOFDOCUMENTS

    YoumaymakeacollectionconsistingoftheDocumentandotherdocumentsreleasedunderthisLicense,andreplacetheindividualcopiesofthisLicenseinthevariousdocumentswithasinglecopy that is included in the collection, provided that you follow the rules of this License forverbatimcopyingofeachofthedocumentsinallotherrespects.

    Youmayextractasingledocumentfromsuchacollection,anddistributeitindividuallyunderthisLicense,providedyouinsertacopyofthisLicenseintotheextracteddocument,andfollowthisLicenseinallotherrespectsregardingverbatimcopyingofthatdocument.

  • 7.AGGREGATIONWITHINDEPENDENTWORKS

    AcompilationoftheDocumentoritsderivativeswithotherseparateandindependentdocumentsorworks, in or ona volumeof a storage or distribution medium, is called an"aggregate" if thecopyrightresultingfromthecompilationisnotusedtolimitthelegalrightsofthecompilation'susersbeyondwhattheindividualworkspermit.WhentheDocumentisincludedinanaggregate,thisLicensedoesnotapplytotheotherworksintheaggregatewhicharenotthemselvesderivativeworksoftheDocument.

    IftheCoverTextrequirementofsection3isapplicabletothesecopiesoftheDocument,theniftheDocumentislessthanonehalfoftheentireaggregate,theDocument'sCoverTextsmaybeplacedoncoversthatbrackettheDocumentwithintheaggregate,ortheelectronicequivalentofcoversiftheDocumentisinelectronicform.Otherwisetheymustappearonprintedcoversthatbracketthewholeaggregate.

    8.TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of theDocumentunder thetermsofsection4. ReplacingInvariantSections with translations requiresspecialpermissionfromtheircopyrightholders,butyoumayincludetranslationsofsomeorallInvariantSectionsinadditiontotheoriginalversionsoftheseInvariantSections.Youmayincludea translation of this License, and all the license notices in the Document, and any WarrantyDisclaimers,providedthatyoualsoincludetheoriginalEnglishversionofthisLicenseandtheoriginalversionsofthosenoticesanddisclaimers.IncaseofadisagreementbetweenthetranslationandtheoriginalversionofthisLicenseoranoticeordisclaimer,theoriginalversionwillprevail.

    If a sectionin theDocument is Entitled"Acknowledgements", "Dedications", or"History", therequirement(section4)toPreserveitsTitle(section1)willtypicallyrequirechangingtheactualtitle.

    9.TERMINATION

    Youmaynotcopy,modify,sublicense,ordistributetheDocumentexceptasexpresslyprovidedforunderthisLicense. Anyotherattempttocopy,modify,sublicenseordistributetheDocumentisvoid,andwillautomaticallyterminateyourrightsunderthisLicense.However,partieswhohavereceivedcopies,orrights,fromyouunderthisLicensewillnothavetheirlicensesterminatedsolongassuchpartiesremaininfullcompliance.

    10.FUTUREREVISIONSOFTHISLICENSE

    TheFreeSoftwareFoundationmaypublishnew,revisedversionsoftheGNUFreeDocumentationLicensefromtimetotime.Suchnewversionswillbesimilarinspirittothepresentversion,but

  • maydifferindetailtoaddressnewproblemsorconcerns.Seehttp://www.gnu.org/copyleft/.

    EachversionoftheLicenseisgivenadistinguishingversionnumber.IftheDocumentspecifiesthataparticularnumberedversionofthisLicense"oranylaterversion"appliestoit,youhavetheoptionoffollowingthetermsandconditionseitherofthatspecifiedversionorofanylaterversionthathasbeenpublished(notasadraft)bytheFreeSoftwareFoundation.IftheDocumentdoesnotspecifyaversionnumberofthisLicense,youmaychooseanyversioneverpublished(notasadraft)bytheFreeSoftwareFoundation.

    LicenciaHistoria del documentoInstalacin y compilacinGNU Free Documentation License