2013-10-06 28 views
9

Inizialmente avevo postato questo nei forum OpenCV, ma sfortunatamente non ho ricevuto troppe visualizzazioni/risposte quindi sto postando qui con la speranza che qualcuno possa avere una direzione per suggerire ?OpenCV Stereo Matching/Calibration

Sto usando la Bumblebee XB3 Stereo Camera e ha 3 obiettivi. Ho trascorso circa tre settimane a leggere forum, tutorial, il libro Learning OpenCV e la documentazione di OpenCV sull'utilizzo della calibrazione stereo e della funzionalità di abbinamento stereo. In sintesi, il mio problema è che ho una buona mappa di disparità generata ma molto povere nuvole di punti, che sembrano distorte/schiacciate e non sono rappresentative della scena attuale.

Quello che ho fatto finora:

utilizzati gli esempi OpenCV stereo_calibration e stereo_matching a:

calibrato la mia macchina fotografica stereo utilizzando immagini scacchiera

1) Immagini Scene Raw : http://answers.opencv.org/upfiles/1380850337241986.jpg
2) Rettificato le immagini non elaborate ottenute dalla fotocamera utilizzando le matrici dopo la calibrazione della fotocamera
: http://answers.opencv.org/upfiles/13808502665723237.png
3) generato un'immagine disparità dalle immagini raddrizzate utilizzando corrispondenza stereo (SGBM)
: 4) proiettata queste disparità a un 3D nuvola di punti

Quello che ho fatto finora, come l'eliminazione verso il mio problema:

  • ho provato il 1 ° e 2 immagini, quindi il 2 ° e 3 ° e lenti , infine, il 1 ° e 2 °. calibrazione
  • ho re-run della mia scacchiera cattura variando la distanza (più vicino/lontano)
  • ho usato oltre 20 coppie stereo per la calibrazione
  • dimensioni
  • Variante Scacchiera usato: ho ho usato un'immagine della scacchiera 9x6 per la calibrazione e ora passiamo a usare uno 8x5 invece
  • Ho provato a utilizzare le varianti di blocco dei blocchi e SGBM e ottenere risultati simili relativamente allo
    . Ottenere
    risultati migliori con SGBM finora.
  • ho variato la disparità gamme, cambiato la dimensione della finestra SAD ecc piccolo miglioramento

Quello che ho il sospetto che il problema è:

La mia immagine disparità sembra relativamente accettabile , ma il prossimo passo è passare alla nuvola di punti 3D usando la matrice Q. Sospetto, non sto calibrando correttamente le telecamere per generare la matrice Q corretta. Sfortunatamente, mi sono imbattuto nel pensare cosa altro potrei fare per ottenere una matrice Q migliore. Qualcuno può suggerire modi in anticipo?

L'altra cosa che penso possa essere problematica sono le supposizioni che sto facendo usando la funzione cv :: stereoCalibrate.Per il momento, ho calibrato individualmente ciascuna telecamera per ottenere le matrici della camera e della distorsione (cameraMatrix [0], distCoeffs [0] e cameraMatrix [1], distCoeffs [1]) in modo da rendere la complessità della funzione stereoCalibrate un po 'più semplice.

stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], 
        cameraMatrix[0], distCoeffs[0], 
        cameraMatrix[1], distCoeffs[1], 
        imageSize, R, T, E, F, 
        TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5), 
        //CV_CALIB_FIX_ASPECT_RATIO + 
        //CV_CALIB_ZERO_TANGENT_DIST + 
        //CV_CALIB_SAME_FOCAL_LENGTH + 
        CV_CALIB_RATIONAL_MODEL 
        //CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5 
        ); 

Inoltre, penso che potrebbe essere utile per parlare di come sto andando da disparità a nuvola di punti. Sto usando OpenVV cv :: reprojectImageTo3D e poi scrivendo i dati su una struttura cloud Point PCL. Ecco il codice rilevante:

cv::reprojectImageTo3D(imgDisparity16S, reconstructed3D, Q, false, CV_32F); 
    for (int i = 0; i < reconstructed3D.rows; i++) 
    { 
    for (int j = 0; j < reconstructed3D.cols; j++) 
    { 
     cv::Point3f cvPoint = reconstructed3D.at<cv::Point3f>(i, j); 
      //Filling in a PCL structure 
      pcl::PointXYZRGB point; 
      point.x = cvPoint.x; 
      point.y = cvPoint.y; 
      point.z = cvPoint.z; 
      point.rgb = rectified_imgRight.at<cv::Vec3b>(i,j)[0]; //Grey information 

      point_cloud_ptr->points.push_back (point); 
    } 
    } 

    point_cloud_ptr->width = (int) point_cloud_ptr->points.size(); 
    point_cloud_ptr->height = 1; 
    pcl::io::savePCDFileASCII("OpenCV-PointCloud.pts", *point_cloud_ptr); 

PS: La ragione per cui ho scelto di caricare queste immagini sono che la scena ha alcune texture, così io mi aspettavo una risposta dicendo che la scena è troppo omogenea. Anche la copertina della partizione e quella della sedia sono piuttosto ricche di texture.

alcune domande:

Mi potete aiutare a rimuovere il piano dell'immagine/disparità che sembra essere parte della nuvola di punti? Perché sta succedendo?

C'è qualcosa di ovvio che sto facendo in modo errato? Vorrei pubblicare il mio codice, ma è estremamente simile agli esempi OpenCV forniti e non penso di fare nulla di più creativo. Posso se c'è una sezione specifica che potrebbe riguardare.

A mio parere ingenuo, sembra che l'immagine della disparità sia OK. Ma la nuvola di punti non è sicuramente nulla che mi sarei aspettato da un'immagine di disparità relativamente dignitosa, è molto peggio.

Se aiuta, ho menzionato la matrice Q che ottengo dopo la calibrazione della telecamera, nel caso in cui qualcosa di ovvio salta fuori. Confrontando questo al libro Learning OpenCV, non credo che ci sia qualcosa di palesemente errato ...

Q: rows: 4 
    cols: 4 
    data: [ 1., 0., 0., -5.9767076110839844e+002, 0., 1., 0., 
     -5.0785438156127930e+002, 0., 0., 0., 6.8683948509213735e+002, 0., 
     0., -4.4965180874519222e+000, 0. ] 

Grazie per la lettura e io sinceramente apprezzo eventuali suggerimenti a questo punto ...

+0

Non sono stato autorizzato a pubblicare più di 2 collegamenti. Quindi questi sono i rimanenti: 3) Generata un'immagine di disparità dalle immagini rettificate utilizzando Stereo Matching (SGBM): http://answers.opencv.org/upfiles/13808503551344959.png 4) Proiettate queste disparità in 3D Point Cloud: http://answers.opencv.org/upfiles/13808503649376151.png e: http://answers.opencv.org/upfiles/13808503782809438.png – BumblebeeUser89

+0

Domanda: sarai soddisfatto con una nuvola di punti nella fotocamera cornice coordinata?In tal caso, puoi utilizzare il file di calibrazione Point Grey per ottenere quello che desideri (senza calibrare con una scacchiera). Le immagini rettificate non hanno distorsione dell'obiettivo, quindi, dato un valore di disparità, lo converti in profondità (z = Bf/d), e lo proietti indietro sulle coordinate della telecamera usando la lunghezza focale nota f. – killogre

risposta

0

Ho riscontrato problemi simili quando utilizzo la funzione di ricostruzione 3D di OpenCV (v.2.4.6). Alcune persone, come Martin Peris, hanno implementato di nuovo da sole. http://blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

Purtroppo, a volte ho riscontrato problemi in entrambe le implementazioni con i miei dati. Quindi, suppongo che il mio problema in questi casi sia dovuto a una descrizione dei parametri della fotocamera estrinseca scadente. Forse è anche il tuo caso. : -?

PS. Per liberarti dello sfondo dovrai segmentarlo. O, almeno, controllare i valori di profondità più grandi di una soglia una volta che la ricostruzione funziona. handleMissingValues ​​flag elimina solo i punti a "infinito" PS2. Per favore, dicci se risolvi questo problema. Penso che sia prezioso per tutta la comunità. Thnx

+0

Il collegamento è morto ma l'accesso a internet lo ha. –