home *** CD-ROM | disk | FTP | other *** search
/ ftp.disi.unige.it / 2015-02-11.ftp.disi.unige.it.tar / ftp.disi.unige.it / pub / .person / OdoneF / tmp / laboratorio1.m < prev    next >
Text File  |  2011-01-30  |  5KB  |  146 lines

  1. %--------------------------------------------------------
  2. % Esperienza di laboratorio 1 - 01/02/2011
  3. % Francesca Odone - odone@disi.unige.it
  4. % basata sul "Structure and Motion Toolkit in Matlab" di P. Torr
  5. %--------------------------------------------------------
  6. % Disponibile su
  7. % Matlab central
  8. % http://www.mathworks.com/matlabcentral/fileexchange/4576-structure-and-motion-toolkit-in-matlab
  9. % e sulla pagina web di Philip Torr
  10. % http://cms.brookes.ac.uk/staff/PhilipTorr/
  11.  
  12. disp('--------------------------------------------------------------');
  13. disp('Esperienza di laboratorio 1 - 01/02/2011');
  14. disp('Francesca Odone - odone@disi.unige.it');
  15. disp('basata sul "Structure and Motion Toolkit in Matlab" di P. Torr');
  16. disp('--------------------------------------------------------------');
  17.  
  18. %--------------------------------------------------------
  19. % Settaggio dei parametri
  20. %--------------------------------------------------------
  21.  
  22. %profile on
  23. clear all;
  24.  
  25.  
  26. %--------------------------------------------------------
  27. % Generazione dei dati sintetici
  28. %--------------------------------------------------------
  29.  
  30. disp('--------------------------------------------------------------');
  31. disp('Generazione di punti sintetici e della ground truth');
  32. disp('--------------------------------------------------------------');
  33.  
  34. % terza componente
  35. m3 = 256;
  36.  
  37. % utilizzo valori di default
  38. [true_F,x1,y1,x2,y2,nx1,ny1,nx2,ny2,true_C,true_R,true_TX, true_E, true_X, true_t] = torr_gen_2view_matches;
  39.  
  40. % calcolo delle matrici di proiezione delle due telecamere
  41. [true_P1, true_P2] = torr_RCT2P(true_C,true_R, true_t);
  42.  
  43. % visualizza la struttura 3D (reale)
  44. torr_display_structure(true_X, true_P1, true_P2,1);
  45. title('punti reali');
  46.  
  47. no_matches = length(nx1);
  48.  
  49. % scelgo se impostare rumore su punti generati 
  50. % no_noise = 1 nessun rumore 
  51. % no_noise = 0 rumore gaussiano con stddev = 1 pixel
  52. no_noise = 1;
  53.  
  54. if (no_noise)
  55.     nx1 = x1;
  56.     nx2 = x2;
  57.     ny1 = y1;
  58.     ny2 = y2;
  59.     disp('Generati dati privi di rumore');
  60. else disp('Generati dati rumorosi');
  61. end
  62.  
  63. disp('Matrice delle corrispondenze tra le due viste [x1, y1, x2, y2]');
  64.  
  65. % matrice dei punti che utilizziamo per la ricostruzione
  66. matches = [nx1,ny1,nx2,ny2]
  67.  
  68. % matrice dei punti di ground truth (senza rumore)
  69. perfect_matches = [x1,y1,x2,y2];
  70.  
  71. pause;
  72.  
  73. %--------------------------------------------------------
  74. % Stimo la matrice fondamentale F
  75. %--------------------------------------------------------
  76.  
  77. disp('--------------------------------------------------------------');
  78. disp('Stima della matrice fondamentale');
  79. disp('--------------------------------------------------------------');
  80.  
  81. % Metodo di calcolo della matrice Fondamentale
  82. method = 'mapsac';
  83. %method = 'linear';
  84.  
  85. disp('Metodo utilizzato:');
  86. method
  87.  
  88. % parametro impostato a 1 se vogliamo imporre che la matrice F abbia rango
  89. % 2 (utilizzato della stima di F)
  90. set_rank2 = 1;
  91.  
  92. if (set_rank2==1)
  93.     disp('Impongo il rango della matrice F a 2');
  94. end
  95.  
  96. % stima di F 
  97. [f, e1, n_inliers,inlier_index,nF] = torr_estimateF( matches, m3, [], method, set_rank2);
  98.  
  99. disp('Numero di punti e numero di inlier');
  100. no_matches
  101. n_inliers
  102.  
  103. disp('--------------------------------------------------------------');
  104. disp('Visualizzo la geometria epipolare: ');
  105. disp('Fare click sui punti di un immagine e la linea epipolare corrispondente ');
  106. disp('comparirα sull altra...');
  107. disp('[in rosso le linee epipolari reali - in verde quelle stimate]');
  108. disp('--------------------------------------------------------------');
  109.  
  110. % visualizzo le due immagini e (interattivamente) le linee epipolari
  111. torr_compare_epipoles(true_F, nF,matches,m3);
  112.  
  113. disp('--------------------------------------------------------------');
  114. disp('Verifica dell errore di riproiezione');
  115. disp('--------------------------------------------------------------');
  116.  
  117. %verifica l'errore di riproiezione sul vincolo x'Fx=0
  118. e2 = torr_errf2(f, matches(:,1), matches(:,2), matches(:,3),matches(:,4), length(nx1), m3);
  119.  
  120. disp('errore medio');
  121. e2
  122.  
  123. disp('errore minimo');
  124. min(e2)
  125. disp('errore massimo');
  126. max(e2)
  127. disp('errore medio sui punti');
  128. mean(e2)
  129.  
  130.  
  131.  
  132. %-------------------------------------------------------------
  133. % OPZIONALE: Algoritmo di Sampson per la riduzione dell'errore 
  134. %-------------------------------------------------------------
  135. % % correggo i match in modo che rispettino il vincolo x'T F x=0
  136. % [corrected_matches error2] = torr_correctx4F(f, nx1,ny1,nx2,ny2, no_matches, m3);
  137. % %verifica l'errore dopo la correzione
  138. % %i match corretti dovrebbero avere un errore molto piccolo
  139. % e2 = torr_errf2(f, corrected_matches(:,1), corrected_matches(:,2), corrected_matches(:,3),corrected_matches(:,4), length(nx1), m3);
  140. % disp('errore medio dopo la correzione dei match');
  141. % e2
  142.  
  143.