2012-10-16 13 views
6

Ho tentato di smascherare le immagini da una telecamera grandangolare (se pertinente, sto utilizzando una GoPro) utilizzando la suite di calibrazione della telecamera di OpenCV. La maggior parte del processo funziona e posso generare immagini non distorte. Tuttavia, quando si usa la rimappa, l'immagine non distorta è il "rettangolo valido": in altre parole, l'immagine restituita è una versione ritagliata dell'originale per evitare i bordi neri curvi che sono inerenti ai fotogrammi non distorti.Calibrazione telecamera singola con OpenCV - Problemi nella generazione di un'immagine non distorta "completa"

Ho tentato di utilizzare getOptimalNewCameraMatrix() per correggere la situazione, con risultati molto strani. Spero che qualcuno di voi possa far luce sui miei problemi.

Attualmente calibrare la fotocamera come segue:

double error = calibrateCamera(worldPoints, sensorPoints, process_size, cameraMatrix, distCoeffs, rvecs, tvecs, calibration_flags); 

che genera la cameraMatrix ho bisogno. Questa parte funziona (penso), perché se eseguo questo attraverso initUndistortRectifyMap() seguito da rimappa(), ottengo un'immagine valida indietro. Comunque, sto cercando l'immagine completa, così la prossima cosa che faccio è cercare di correggere il mio cameraMatrix come segue:

int alpha = 1; 
cameraMatrix_corr = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, image.size(), alpha); 

Poi, ho generare le mappe X e Y per remap, come segue (questo è preso in prestito direttamente dal libro di cucina OpenCV 2.0, quindi sono abbastanza fiducioso che funzioni anche).

initUndistortRectifyMap(
    cameraMatrix_corr, // computed camera matrix 
    distCoeffs, // computed distortion matrix 
    Mat(), // optional rectification (none) 
    Mat(), // camera matrix to generate undistorted 
    image.size(), // size of undistorted 
    CV_32FC1,  // type of output map 
    map1, map2); // the x and y mapping functions 

Infine, rimappare la mia immagine!

// Apply mapping functions 
remap(image, undistorted, map1, map2, INTER_LINEAR); 

Ecco i risultati fino ad ora. Se uso alpha = 0 (nessuna modifica alla matrice), ottengo risultati ragionevoli (anche se ritagliati).

Image (alpha = 1)

Se uso alpha = 1, che credo mi dovrebbe dare un'immagine con ogni pixel originale associata alla nuova immagine, ottengo il seguente:

Image(alpha = 0)

Quindi, la mia domanda è questa: cosa sto facendo male, e perché non riesco a ottenere un'immagine non distorta e non distorta dalla calibrazione?

Grazie a tutti per avermi sopportato, questa è la mia prima domanda qui, ma ho cercato di essere il più completo possibile. Fammi sapere se ho fottuto in qualche modo!

risposta

4

Credo che correggere la matrice della telecamera non sia qualcosa che dovresti fare per non distorcere, perché ti darebbe una matrice della macchina fotografica come se non ci fosse distorsione.

Se non si desidera "perdere" le informazioni sull'immagine, è probabilmente meglio spostare la mappa in xey e mappare l'immagine in un'immagine più grande. Questo perché quando si distaccano i pixel negli angoli si sposta verso l'esterno per rettificare l'immagine.

Ricorda che gli obiettivi fisheye hanno elevate distorsioni e potrebbero non essere completamente rettificati anche quando si utilizza il codice corretto.

+1

Ho avuto un problema simile in cui la regione di interesse fornita dalla funzione di ottimizzazione era troppo piccola. Sulla base del tuo consiglio "correggere la matrice della telecamera non è qualcosa che dovresti fare per non alterare", ho provato a eliminare il parametro 'newcameramtx' in' dst = cv2.undistort (img, camera_matrix, dist_coefs, None, newcameramtx) ', che ha risolto il problema problema per me. Grazie! –

Problemi correlati