Ho recentemente iniziato a lavorare con OpenCV 3.0 e il mio obiettivo è quello di acquisire una coppia di immagini stereo da una serie di telecamere stereo, creare una mappa di disparità corretta, convertire la mappa di disparità in una nuvola di punti 3D e infine mostrare la nuvola di punti risultante in un visualizzatore di nuvole di punti utilizzando PCL.Come generare una rappresentazione di nuvole di punti valida di una coppia di immagini stereo usando OpenCV 3.0 StereoSGBM e PCL
Ho già effettuato la calibrazione della fotocamera e l'RMS calibrazione risultante è 0,4
È possibile trovare i miei coppie di immagini (immagine a sinistra) 1 e (immagine a destra) 2 nel link qui sotto. Sto usando StereoSGBM per creare un'immagine di disparità. Sto anche usando le barre delle tracce per regolare i parametri della funzione StereoSGBM al fine di ottenere immagini con una migliore disparità. Purtroppo non posso pubblicare la mia immagine di disparità da quando sono nuovo in StackOverflow e non ho abbastanza reputazione per pubblicare più di due link di immagini!
Dopo aver ottenuto l'immagine di disparità ("disp" nel codice di seguito), utilizzo la funzione reprojectImageTo3D() per convertire le informazioni di immagine di disparità in coordinate XYZ 3D e quindi converto i risultati in un array di "pcl: : PointXYZRGB "punta in modo che possano essere visualizzati in un visualizzatore di nuvole di punti PCL. Dopo aver eseguito la conversione richiesta, quello che ottengo come nuvola di punti è una stupida nuvola di punti a forma di piramide che non ha alcun senso. Ho già letto e provato tutti i metodi suggeriti nei seguenti link:
1- http: //blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html
2- http: //stackoverflow.com/questions/13463476/opencv-stereorectifyuncalibrated-to-3d-point-cloud
3- http: //stackoverflow.com/questions/22418846/reprojectimageto3d-in- opencv
e non hanno funzionato !!!
Qui di seguito ho fornito la porzione di conversione del mio codice, che sarebbe molto apprezzato se mi si potrebbe dire che cosa mi manca:
pcl::PointCloud<pcl::PointXYZRGB>::Ptr pointcloud(new pcl::PointCloud<pcl::PointXYZRGB>());
Mat xyz;
reprojectImageTo3D(disp, xyz, Q, false, CV_32F);
pointcloud->width = static_cast<uint32_t>(disp.cols);
pointcloud->height = static_cast<uint32_t>(disp.rows);
pointcloud->is_dense = false;
pcl::PointXYZRGB point;
for (int i = 0; i < disp.rows; ++i)
{
uchar* rgb_ptr = Frame_RGBRight.ptr<uchar>(i);
uchar* disp_ptr = disp.ptr<uchar>(i);
double* xyz_ptr = xyz.ptr<double>(i);
for (int j = 0; j < disp.cols; ++j)
{
uchar d = disp_ptr[j];
if (d == 0) continue;
Point3f p = xyz.at<Point3f>(i, j);
point.z = p.z; // I have also tried p.z/16
point.x = p.x;
point.y = p.y;
point.b = rgb_ptr[3 * j];
point.g = rgb_ptr[3 * j + 1];
point.r = rgb_ptr[3 * j + 2];
pointcloud->points.push_back(point);
}
}
viewer.showCloud(pointcloud);
Si prega di controllare le immagini che avete fornito, sembrano uguali – alexisrozhkov
Siamo spiacenti, il mio male. Ho caricato i frame giusti! –