Ho una serie di immagini di un corpo rigido con alcuni indicatori collegati. Ho definito un sistema di coordinate con origine in uno di questi indicatori e voglio ottenere la rotazione e la traduzione tra questo sistema di coordinate e quello definito all'origine della telecamera.Calibrazione fotocamera (OpenCV 2.3) - come utilizzare i parametri di distorsione?
Ho provato per qualche tempo POSIT (dopo this) senza mai ottenere risultati accettabili, fino a quando ho capito che dovevo calibrare la fotocamera al primo posto. Basato su this e utilizzando alcune immagini acquisite con un corpo di calibrazione, ho ottenuto la matrice intrinseca della telecamera e i parametri di distorsione. Ho anche ottenuto un brutto (?) Errore di re-proiezione di 1.276.
- L'errore di re-proiezione è troppo alto? Come posso migliorarlo? (Ho usato più immagini e ho appena raggiunto una leggera diminuzione del valore).
- Posso utilizzare i parametri di distorsione in POSIT? Come?
Grazie.
Sembra che l'unico modo per ottenere una diminuzione nell'errore riproiezione (è cambiato da ~ 1,3 a ~ 0,7) è impostando a '0' i seguenti parametri nel file di configurazione XML:
<Calibrate_FixAspectRatio> 0 </Calibrate_FixAspectRatio>
<Calibrate_AssumeZeroTangentialDistortion> 0 </Calibrate_AssumeZeroTangentialDistortion>
<Calibrate_FixPrincipalPointAtTheCenter> 0 </Calibrate_FixPrincipalPointAtTheCenter>
L'utilizzo di più immagini non modifica l'errore e non sono ancora sicuro se questo nuovo errore è accettabile o meno.
Ho usato i valori che la calibrazione ha fornito come uscita (ovvero la lunghezza focale e il centro ottico) in POSIT ma i risultati erano molto simili a quelli che ottenevo quando stavo usando i valori di pre-calibrazione. Non ho usato i parametri di distorsione perché non so come gestirli in POSIT (potrebbero fare la differenza nei risultati?).
La matrice telecamera ho ottenuto dopo la calibrazione:
<Camera_Matrix type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
2.0613885351075501e+003 0. 2.2865517805186334e+002 0.
2.2546461307897816e+003 2.5261706201677623e+002 0. 0. 1.
</data>
</Camera_Matrix>
e il modo in cui ho usato in POSIT:
#define FOCAL_LENGTH 2158.0175
#define FOCAL_LENGTH_X 2061.389
#define FOCAL_LENGTH_Y 2254.646
#define cX 203.655
#define cY 205.117
calcolai la differenza tra il nuovo centro coordina e quello per il calibrare le immagini e quindi applicare quella differenza sulle coordinate del centro delle immagini su cui sto lavorando con POSIT.
Sto usando POSIT su due immagini diverse dove teoricamente dovrei ottenere una rotazione di 0 (per la prima) e 10 (per la seconda) gradi tra il modello e il sistema di coordinate della telecamera. Dopo aver ottenuto la matrice di rotazione per ogni immagine, ho definito un vettore unitario sul sistema di coordinate della telecamera e l'ho calcolato sul sistema di coordinate del modello moltiplicandolo per l'inverso delle due matrici di rotazione fornite da POSIT, ottenendo due nuovi vettori nel modello sistema di coordinate. Quando calcoli l'angolo tra questi due vettori nel sistema di coordinate del modello, l'output non è come dovrebbe essere - 10 gradi.
Qualcuno ha un'idea di dove sto andando male?
Ho dimenticato di menzionare che il mio corpo di calibrazione è un motivo a griglia di cerchio, non la tipica scacchiera. –