2015-12-16 30 views
6

Sto usando OpenCV per calibrare le immagini scattate con le fotocamere con obiettivi fish-eye.La calibrazione del fisheye OpenCV taglia troppo l'immagine risultante

Le funzioni che sto usando sono:

  • findChessboardCorners(...); per trovare gli angoli del motivo di calibrazione.
  • cornerSubPix(...); per rifinire gli angoli trovati.
  • fisheye::calibrate(...); per calibrare la matrice della telecamera ei coefficienti di distorsione.
  • fisheye::undistortImage(...); per non distorcere le immagini utilizzando le informazioni della fotocamera ottenute dalla calibrazione.

Mentre l'immagine risultante sembra avere un bell'aspetto (linee rette e così via), il mio problema è che la funzione taglia via troppa dell'immagine.

Questo è un problema reale, in quanto utilizzo quattro telecamere a 90 gradi tra di loro e quando viene tagliata la maggior parte dei lati, non vi è alcuna area sovrapposta che è necessaria mentre sto per cucire immagini.

Ho guardato in utilizzando fisheye::estimateNewCameraMatrixForUndistortRectify(...) ma non ho potuto farlo a dare buoni risultati, come io non so cosa dovrei mettere in come Ingresso R, come l'uscita di rotazione vettore di fisheye::calibrate è 3XN (dove N è il numero di delle immagini di calibrazione) e fisheye::estimateNewCameraMatrixForUndistortRectify richiede un 1x3 o 3x3.

Le immagini seguenti mostrano un'immagine del mio risultato di distorsione e un esempio del tipo di risultato che avrei desiderato idealmente.

Undistortion:

My undistortion

Esempio di risultato voluto:

Example of wanted result

risposta

0

si sta facendo bene, non resta che utilizzare per impostare getOptimalNewCameraMatrix()newCameraMatrix in undistort(). Per visualizzare tutti i pixel, devi impostare alpha su 1 in getOptimalNewCameraMatrix().

+0

ho provato, e per le immagini regolari (utilizzando le immagini nelle cartelle campioni OpenCV) ha dato il tipo di risultato che volevo, ma quando lo uso sulle mie immagini fisheye, non dà il risultato voluto – NoShadowKick

+0

[Cartella che mostra le immagini dei miei risultati] (https://www.dropbox.com/sh/pkudy2acgqyyjc5/AAAWEWE5cMEiT6dGB0hwDnVm69a?dl=0) – NoShadowKick

+0

Le immagini sembrano provenire da una fotocamera grandangolare (~ 180 gradi fov). Se si desidera includere tutti i pixel, si avrà un'immagine di dimensioni infinite (poiché i pixel con angolo dall'asse della telecamera principale> = 180 verranno proiettati all'infinito). Quindi dovrai scartarne alcuni per ottenere immagini di dimensioni finite. A proposito, che alpha hai usato? – alexisrozhkov

2

Penso di essermi imbattuto in un problema simile, cercando il nodo "alpha" in getOptimalNewCameraMatrix per fisheye.

girato originale: Original

Ho calibrato con cv2.fisheye.calibrate, ottenuto il K e D parametri

K = [[ 329.75951163 0.   422.36510555] 
[ 0.   329.84897388 266.45855056] 
[ 0.   0.   1.  ]] 

D = [[ 0.04004325] 
[ 0.00112638] 
[ 0.01004722] 
[-0.00593285]] 

Questo è quello che ottengo con

map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, d, np.eye(3), k, (800,600), cv2.CV_16SC2) 
nemImg = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) 

E Penso che tagli troppo.Voglio vedere il cubo di Rubik tutta

initUndistortRectifyMap/remap with the K,D

posso risolvere il problema con

nk = k.copy() 
nk[0,0]=k[0,0]/2 
nk[1,1]=k[1,1]/2 
# Just by scaling the matrix coefficients! 

map1, map2 = cv2.fisheye.initUndistortRectifyMap(k, d, np.eye(3), nk, (800,600), cv2.CV_16SC2) # Pass k in 1st parameter, nk in 4th parameter 
nemImg = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) 

TADA!

This is what I want