2012-06-30 21 views
6

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.

  1. L'errore di re-proiezione è troppo alto? Come posso migliorarlo? (Ho usato più immagini e ho appena raggiunto una leggera diminuzione del valore).
  2. 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?

+0

Ho dimenticato di menzionare che il mio corpo di calibrazione è un motivo a griglia di cerchio, non la tipica scacchiera. –

risposta

2

Qual è la risoluzione dell'immagine? Il punto principale dovrebbe essere vicino al centro dell'immagine. qual è la lunghezza focale dell'obiettivo? Questo errore di calibrazione potrebbe andare bene in base alla precisione di cui hai bisogno. Al fine di evitare l'errore introdotto dalla distorsione dell'obiettivo, è necessario non distorcere i punti dell'immagine passati a POSIT utilizzando i punti non registrati.Quanto è grande questo errore dipende da quanto è grande la distorsione del tuo obiettivo.

+0

Non ho alcuna informazione riguardo la risoluzione dell'immagine e la lunghezza focale - è per questo che ho effettuato la calibrazione. Dalla matrice della telecamera ottengo la lunghezza focale in xey e il punto principale dell'immagine (è vicino al centro dell'immagine). La mia logica è da qualche parte sbagliata? –

+0

La risoluzione dell'immagine è la larghezza e l'altezza delle immagini. Dovresti conoscere la lunghezza focale reale dell'obiettivo (8 mm, 16 mm, ...). La risoluzione dell'immagine e la lunghezza focale reale determinano il valore della lunghezza focale che dovrebbe essere stimato con il processo di calibrazione. BTW, non dovrebbero cX e cY essere 228.655 e 252.617? –

+0

Appena preso ... Stavo facendo un'etichettatura errata dei punti dell'immagine, non potevo individuarla prima. Grazie per il tuo aiuto Javier! –

Problemi correlati