dilluns, 29 de desembre del 2008

Grafica

Aci deixe un parell de grafiques que mostren la "qualitat" d'una imatge de disparitat per a cada combinació de paràmetres.
El paràmetre NDisp pot variar en el rang [8,128], d'ú e ú fins 64 i de 8 en 8 de 64 a 128 (pel que he pogut averiguar fins ara). Amés cal revisar la formula per mesurar la qualitat.


En aquesta grafica es pot observar que els valors més alts es troben en configuracions on Horopter es xicotet. Aixo es degut a que l'escena (a la dreta) conté, majorment, objectes llunyans.



En aquesta altra (corresponent a una caixa de sabates, com les dels posts anteriors) s'observa un desplaçament dels valors més alts cap a zones amb major Horopter. El problema és que quan major és l'Horopter la regió amb valors útils de disparitat decreix, per tant la qualitat també, per aixo els valors més alts no es troben a les zones amb major Horopter.

En les 2 grafiques es pot observar un soroll (en la 2n més) que s'intentarà eliminar fent la mitja de n repeticions amb els mateixos paràmetres.

dimarts, 16 de desembre del 2008

Capturant amb la camera

Ja he començat a fer escenes i prendre imatges amb la càmera. El programa busca primer una bona combinació de paràmetres per a la disparitat automàticament, i després pren 80 imatges de disparitat, cadascuna amb una combinació diferent de paràmetres (tan sols es canvien NDisp i Horopter, com ja s'ha dit anteriorment). Amés es pot indicar al programa la regió d'interes, es a dir, per a quina zona de la imatge ens interessa tindre la millor disparitat. Ací uns quants exemples:



Imatge original (esquerra), disparitat automàtica (centre) i imatge de disparitat amb regió d'interes centrada en la caixa (dreta). Es pot apreciar la diferencia entre les 2 imatges de disparitat, perquè en aquest cas la càmera pot identificar el fons al haver ombres.



Imatge original (esquerra), disparitat automàtica (centre) i imatge de disparitat amb regió d'interes centrada en l'objecte (dreta). En aquest cas no hi ha pràcticament diferencia perquè en la imatge no hi ha cap element apart dels 2 objectes (ja que el fons te una il·luminació plana).

S'han intentat crear imatges amb poca i amb molta il·luminació, però la càmera ajusta la sensibilitat automàticament segons la llum de la escena, per la qual cosa no s'aprecia diferencia alguna.

dilluns, 1 de desembre del 2008

Stereo Matching

He retocat el programa que vaig fer inicialment per calcular la disparitat entre 2 imatges. Funciona prou be i es poden ajustar prou paràmetres. Aci una mostra del resultat sobre una imatge renderitzada (amb 3 configuracions diferents):



El problema es que aquest programa es molt sensible als canvis de llum entre la imatge dreta i l'esquerra, i amés necessita que les imatges estiguen perfectament alineades (o calibrades), cosa que no sempre es aixi.

Fins que no obtinga unes imatges amb aquestes condicions de la camera no es podrán comparar resultats.

El programa calcula la disparitat d'una forma molt simple: per a cada pixel de la imatge dreta busca, horitzontalment, aquell pixel de la imatge esquerra que es corresponga. Per trobar aquesta correspondencia es comparen les finestres de tamany t centrades en aquests pixels. Quan més distants estan entre si 2 pixels més proper está el punt real a la camera.
Es pot ajustar el nivell de confiança (per descartar coincidencies amb poca probabilitat) i el rang màxim per buscar correspondencies (aixi s'estalvia temps i s'obtenen millors resultats).

Aci hi ha un parell d'exemples més (amb més textura i amb imatges de la camera):

divendres, 28 de novembre del 2008

Disparitat II

Pareix ser que ja esta sol·lucionat el tema de trobar els millors paràmetres per a la imatge de disparitat (tan sols es varien NDisp i Horopter, com ja vaig explicar en aquest post). Ara be, com que la mesura de la qualitat ha variat respecte al post abans comentat, he de fer altres mesures per veure si els paràmetres abans descartats ara tenen alguna influencia en la qualitat - no, tenen la mateixa influencia que es va observar amb l'altra mesura, o no influeixen o influeixen sempre en el mateix sentit, per tant no es tindràn en compte per al calcul automàtic -.

Ara s'empra com a mesura de qualitat el %d'us (el nombre de pixels que contenen informacio) multiplicat pel nombre de valors en l'histograma que son majors o iguals a 1. Els resultats obtesos son prou satisfactoris, un exemple (la camera s'ha de calibrar de nou):

dijous, 27 de novembre del 2008

Disparitat

Ara va i resulta que la mesura de la qualitat de la imatge de disparitat que estava usant fins ara (% de us * varianza en els valors) no sempre dona la millor imatge de disparitat. En alguns casos la imatge amb millor "qualitat" es una imatge completament erronia, plena de illes, amb valors completament dispars que no es corresponen amb la disparitat real, per tant hauré de canviar el criteri. Un exemple:


Imatge de disparitat correcta (son un parell d'estanteries).


Imatge incorrecta de la mateixa escena, pero amb un rang de valors més alt (més varianza).

Una sol·lució podria ser intentar aconseguir la imatge amb un histograma més uniforme. A vore com ix...

dimarts, 25 de novembre del 2008

Borrón y cuenta nueva

Despres d'unes setmanes d'absencia -degut a la participació en el festival Inquiet de cinema en valencia- tornem al projecte, o millor dit, comencem projecte. La idea ara és més simple, bàsicament consisteix a evaluar la càmera videre.
Per començar he fet un programa que pren una serie d'imatges amb la camera variant els paràmetres de disparitat. Aci es pot vore una mostra d'alguns resultats obtinguts:















Ara falta comprovar que l'ajust automàtic de paràmetres dóna sempre la millor imatge de disparitat, pero aixo altre dia.

dilluns, 13 d’octubre del 2008

Poisson Surface Reconstruction

Be, despres d'intentar fer funcionar el programa "zipper" per fer el cosit de les malles sense exit, he probat amb la reconstrucció de Poisson, un algorisme que pren un nuvol de punts i genera una malla a partir d'aquests i les seues normals. El programa i l'article on es descriu l'algorisme es poden descarregar des de http://www.cs.jhu.edu/~misha/Code/PoissonRecon/.

Ací hi han 2 models generats amb el programa:


Aquest model ha sigut generat a partir d'un fitxer de mostra, que conté 100.000 punts.




Aquesta malla ha sigut generada a partir d'un unic segment generat per la camera (amb males condicions d'iluminacio). Es d'esperar que es puguen obtindre millors resultats, emprant més d'un segment entre altres coses. En la imatge es pot intuir el cap, el nas, els ulls i els muscles... que no es poc.

divendres, 19 de setembre del 2008

Per fi!!!

Despres de barallar-me prou he conseguit que el programa alinee els segments de forma acceptable. De moment tan sols es calcula la translacio, i és l'usuari qui ha de rotar els segments i proporcionar una bona posició inicial. En el video es veu tot el proces d'alineat. El resultat no es perfecte, pero aixo es degut a la part manual, ja que al no tindre textura el model és un poc dificil d'aliniar.

El model ha sigut generat amb blender per provar el funcionament sobre models "correctes", ja que els segments obtesos per la camera contenen molt més soroll i errors.

Ara em queda treballar en la edició de segments (afegir alguna que altra ferramenta) i el cosit (les textures poden esperar).

He creat 2 metodes per implementar el registre (potser l'usuari podria elegir quin emprar), concretament per traure els parells de punts corresponents entre 2 segments: per intersecció amb la normal i per punt més proxim. Aquest ultim és més rapid, pero el resultat es molt paregut amb els 2. Més endavant podria millorar-se l'algorisme per rotar tambe els segments, emprant un sistema paregut al que vaig emprar per al motion flow, i que va donar prou bons resultats.

En el video s'empra el métode lent, basat en intersecció amb normals i ha sigut editat per fer-lo més curt.



Aquest video mostra el resultat d'alinear 4 segments obtesos per la camera. Es pot apreciar la quantitat de soroll que produeix:

divendres, 12 de setembre del 2008

Soportant materials


Per fer més compatible el programa amb el format ".obj" que es en el qual es guarden i carreguen els segments he modificat l'estructura del model per poder soportar materials (amb les seues textures i colors). No esta complet al 100%, falta carregar les textures (i guardar els materials per als nous segments, per ara tan sols els carreguen).

dijous, 28 d’agost del 2008

Problemes alineant

Pareix ser que les coses no s'alineen be de la forma que ho tenia fet. Els models tenen massa soroll i el mètode que empre pareix no ser el correcte (no es que funcione malament del tot però no aconsegueix un ajust acceptable). Per tant intentaré canviar la forma en la que l'usuari alinea els segments, per incloure també un desplaçament. Així el procés serà més manual, però pot set molt millor, ja que la informació que ens dona la textura es molt més valuosa que la que dona la geometria.

dilluns, 11 d’agost del 2008

Alineant

Be, he tingut que lluitar un poc amb OpenGL, pero ja he creat la finestra des de la qual es podràn alinear els segments. En el video es veu la funcionalitat bàsica. Encara queda millorar un poc el proces i aplicar les transformacions per fer una versió simplificada del ICP (amb el calcul de la translació tan sols). Ja vorem si resulta...

dissabte, 9 d’agost del 2008

Textures!!!

Despres de lluitar molt amb el codi per fi estan habilitades les textures, ja no més colors de vertex. El problema es que he tornat a una versió anterior (les ultimes tenien masa canvis que ja no em son utils) i he perdut el color, i crec que deixare aixo per al final, de moment tot en blanc i negre...
En la imatge s'aprecia que malgrat estar creat el segment amb resolucio 8 (o 1/8 seria més correcte) el detall de la textura no s'ha perdut.

dijous, 7 d’agost del 2008

Començant a escriure

Pareix ser que ja esta clar l'objectiu del projecte. Despres d'unes vacances d'una setmana he tornat al treball i m'he oblidat del motion flow (i openCV) per fer que el process de registrat siga més manual (com ho es en tots els llocs) i he començat a escriure un poc la memoria (molt poc a poc).

Aci esta una breu descripció pel que respecta a la camera.

dijous, 10 de juliol del 2008

Mes motion flow!!!

Com que openCV no m'ha resolt moltes coses he tornat a l'algorisme original del motion flow, però esta vegada amb mes calma i fent les coses un poc millor. Aquest es el resultat de moment. Esta be, encara que he de dir que el vídeo ha eixit be... Si aconseguisc traure els 2 eixos de rotació que em falten estarà complet. De moment segueix el moviment en X, Y i Z i la rotació en l'eix Z.
En el vídeo es crea un model dels muscles i del cap, i açò no es massa bo, ja que no son rígids i el tracking (o motion flow) no sempre funciona be, però els resultats son prou satisfactoris (les condicions d'iluminació tampoc son les ideals).

He colorejat el segment creat en blau, perquè siga fàcil de vore, però es creen a color, com és llogic.

divendres, 4 de juliol del 2008

CamShift

He usat la implementació de l'algorisme CamShift per al reconeixement de cares i ofereix uns resultats molt millors que l'anterior (i amés és més ràpid), però el problema es que no identifica les cares, sinó tot allò que tinga un color paregut a la carn (mans, braços, coll). Supose que es podrà refinar un poc per identificar les cares. Amés de trobar la posició i tamany dels objectes també retorna la orientació (en l'angle Z), el qual serà molt útil com posició inicial per al motion flow.

dijous, 3 de juliol del 2008

Identificació de cares

He implementat l'algorisme d'identificació de cares que ve en un dels exemples d'openCV al meu programa, Però els resultats no em convencen. He provat amb diverses bases de dades per al reconeixedor, però mai he tingut resultats massa bons. Haure de buscar altre mètode per seguir el moviment i la posició de la cara (o del cap). Provaré amb CamShift o optical flow.

dimarts, 1 de juliol del 2008

Objectius programa

Ja estan definits els objectius del programa:
  • Modelat en 3D automàtic del cap amb textura.
  • Seguiment del cap (motion flow) usant el model generat.
Així es pot usar el model 3D del cap com avatar en jocs per exemple.
Amés dins del programa, aprofitant el motion flow, l'usuari pot afegir elements al seu cap (com ulleres) per veure el resultat amb realitat augmentada.
Per al reconeixement de les cares i el motion flow vaig a emprar openCV. Ara estic llegint la documentació i els exemples.

Al programa ara es prenen imatges en color de la càmera. Açò es necessari per a que openCV reconega les cares, ja que es basa en el color.

dimecres, 11 de juny del 2008

Canvi d'IGU

He decidit canviar l'aspecte del programa per fer-lo més flexible, ara ja no es un diàleg sino una aplicació basada en finestres (SDI).

Aixi hi ha més lloc per visualitzar els models, obtindre més resolució de les imatges de la camera, i sobretot organitzar millor totes les opcions i controls que abans plenaven el dialeg.
No ha sigut facil integrar openGL amb les finestres, pero al final ha funcionat.
Ara vaig a centrar-me en la edició manual del model i els segments (borrar, girar, etc), i en l'algorisme de cosit de malles. El motion flow el vaig a deixar per a mes endavant ja que m'estic trobant amb massa problemes.

dijous, 29 de maig del 2008

Carregar i Guardar

Ja es pot guardar el model (amb els seus segments) i carregar segments des de fitxers ".obj" (Wavefront), un format de model 3D suportat per molts programes d'edició 3D, com blender, 3D Studio Max o Autocad.

Cada segment es guarda (i es carrega) com un objecte per separat, de manera que l'usuari pot guardar el treball i continuar més endavant sense perdre informació.
Hi ha un petit problema amb les normals, pero res que no es puga resoldre facilment.

Amés he creat una funció (linia groga) que donat un punt A i un segment, retorna el punt sobre el segment que està més proxim a A (que pot estar sobre un vertex, un triangle o una aresta). Aquesta funció es necesaria per implementar la primera part del cosit de poligons (el registre rigid).
També he creat altra funció (linia blava) que retorna el punt d'interseccio entre una linia qualsevol i un segment. Aquesta funció pot ser tambe util per al registre rigid, ja que es pot implementar de diverses formes amb resultats diferents en quan a eficiencia i cost temporal.

dijous, 15 de maig del 2008

Disparitat automàtica

Per al calcul automàtic dels paràmetres de la imatge de disparitat s'intenta maximitzar la quantitat de pixels usats (amb informació de disparitat) i la distribució dels valors (varianza). Per veure com influeix cada paràmetre sobre aquest valor (us*varianza) he fet unes gràfiques en 3D que mostren els valors obtinguts per a cada combinació de paràmetres (les gràfiques les he fet com he pogut). En estes es mostra l'efecte de l'Horopter, NDisp i CorrWnd sobre diferents imatges:



I en aquestes s'ha substituït CorrWnd per TexFilter:



Com es pot observar el paràmetre CorrWnd no influeix molt en el resultat, i el paràmetre TexFilter sempre influeix igual. Els màxims locals (les esferes blanques) sempre es troben en el plànol definit per Horopter i NDisp, per tant centraré la búsqueda automàtica en aquests 2 paràmetres. Els altres hauran de ser introduïts per l'usuari (però no sempre és necessari), ja que depenen de la textura de l'objecte.

dimarts, 6 de maig del 2008

Motion Flow

Ja es capturen les imatges de la càmera, i perque el model final es puga completar és necesari, per a l'usuari i per a l'algorisme de cosit de malles, que cada segment estiga més o menys ben col·locat respecte la resta. Per conseguir aço és necesari que els segments seguisquen el moviment de l'objecte real (Motion flow).
Per fer aço vaig pensar en emprar ARToolkit, que és una llibreria pensada per implementar aplicacions de realitat augmentada en temps real, i mitjantçant marcadors pot obtindre la transformació de la camera respecte al marcador. El problema és que aquests marcadors no poden ser qualsevol cosa, sino que han de tindre un patró determinat, i per tant tots els models apareixerien amb aquest marcador.
Com no he trobat cap llibreria que puga fer el motion flow sense marcadors he intentat fer jo alguna cosa, i aço es el que tinc de moment. Per ara tan sols pot seguir el moviment en X i Y i sense rotar el model, pero ja es molt més del que esperava aconseguir a estes altures.

dijous, 17 d’abril del 2008

Poquet a poquet

Ja es poden crear diversos parxes a partir d'una imatge, cadascun amb una resolució diferent. També es poden col·locar i girar amb el ratolí, de manera que els nous parxes conserven la posició i rotació relativa amb els anteriors per formar un objecte solid entre tots. També he millorat la creació del parxe, de manera que tarda molt menys en crear-se (abans tardava segons i ara dècimes de segon).



Ara queda obtenir imatges directament de la càmera en lloc d'un arxiu, calcular automàticament els paràmetres de profunditat, fer un tracking de l'objecte per moure els parxes nous i crear-ne més, juntar-los tots en una única malla tancada i crear una textura per aquesta a partir de les imatges obtingudes en cada parxe. Quasi res!!!

Aci esta el projecte.

dilluns, 17 de març del 2008

ZCam

Ja fa uns quants dies vaig trobar, de casualitat, aquesta camera:

http://www.3dvsystems.com/



És prou barata (uns 100$) i la qualitat de la imatge de profunditat que obté es molt millor que la que obté la camera videre, perque empra altra tecnologia (infrarrojos).
En el segon 20 del video es pot vore clarament la profunditat obtesa per la camera.

Disparitat



Després d'un temps he fet un petit programa on es pot observar com afecta cada paràmetre, de tots els possibles, a la disparitat calculada. Sobre aquest mateix programa es podria implementar el programa final. Estos son els paràmetres i l'efecte que tenen:
  • Horopter: Es equivalent al focus del calcul de la profunditat; En 0 mira a l'infinit, i en valors majors detecta objectes més pròxims a la camera.
  • NDisp: Indica el rang de profunditats que detecta a partir de l'Horopter. Quan major siga es detectaran objectes més pròxims a la càmera, però augmenta el cost. Es pot emprar un valor petit amb un Horòpter gran per obtindre resultats similars amb menys cost.
  • CorrWnd: A valors majors obté una imatge de disparitat més suau i més fiable. És la mida de la finestra de correlació.
  • Uniqueness: A majors valors més fiables son els de la imatge de disparitat, però menys densa és aquesta.
  • Speckle: Amb valors pròxims a 0 apareixen valors erronis, cal mantindre'ls major que 5.

dilluns, 25 de febrer del 2008

Articles

He llegit uns quants articles i ací hi ha un xicotet resum de cadascun:
  • Zippered polygon meshes from range images [G. Turk i M. Levoy]: a partir de múltiples imatges de profunditat es reconstrueixen objectes reals en 3D amb molta precisió. Primer es genera una superfície a partir de cada imatge de profunditat. Després es troba per a cadascuna la transformació rígida (registracio) que coloca cada superfície en el seu lloc respecte a la resta. Després s'uneixen les superfícies amb un algorisme de cosit i finalment es fa una mitja de les posicions de la superfície emprant les diferents imatges i els seus valors.
  • A volumetric method for building complex models from range images [B. Curless i M. Levoy]: s'empra una graella de voxels per representar el model final, que es reconstrueix amb l'algorisme de marching cubes. Aquesta aproximació permet emprar un gran nombre de imatges ja que cada imatge es tracta a l'instant.
  • Efficient variants of the ICP algorithm [S. Rusinkiewicz i M. Levoy]: es comparen diferents variants per implementar registració (registration) i s'aporta un nou mètode per al mostreig que accelera el calcul de les transformacions.
  • Reconstructing Surfaces by Volumentric Regularization [H. Q. Dinh, G. Turk i G. Slabugh]: les imatges de profunditat obtingudes amb dispositius com la càmera videre solen tindre soroll i informació no uniform. Per aquest tipus d'informació es presenta un algorisme que obté resultats que minimitzen el soroll i aproximen la forma de l'objecte amb una superfície implícita, formulada com la suma de funcions radials ponderades.
Encara no he profunditzat en tots ells i he de buscar-ne uns quants mes, però de moment els més interessants pareixen ser el primer, tercer i quart.

dimecres, 30 de gener del 2008

Surface Simplification


Buscant un algorisme per reduir el nombre de polígons del model generat (es generaràn 2 triangles per cada píxel) vaig trobar casualment un que amés em podia resoldre el problema de la unió de les diferents parts generades.
L'algorisme es diu "Surface Simplification Using Quadric Error Metrics" i permet unir vèrtex molt pròxims entre si perquè al simplificar preserva l'aparença del model i no la topologia.
Ara mateix estic tractant d'implementar-lo sobre uns models coneguts per assegurar el seu correcte funcionament.

Canvi de projecte


A la tercera va la vençuda.

La idea es, emprant la càmera estereoscòpica Videre STOC-MDCS2, crear un escànner 3D. D'aquesta manera col·locant un objecte davant de la càmera i prenent aquesta diverses imatges de l'objete, es crearà un model 3D de l'objecte mostrat.
La càmera ens dona 2 imatges en color (o blanc i negre) i una matriu amb la disparitat d'aquestes.

Els pasos a seguir serien els següents:
- Obtindre imatges i saber l'orientació de cada una o de l'objecte present.
- Per a cada imatge reconstruir la part visible de l'objecte emprant la informació de disparitat.
- Unir les parts generades per formar un model solid.