Conversion de PointCloud en Mat

Disons que j’initialise un nuage de points. Je veux stocker ses canaux RVB dans le type de données Mat d’opencv. Comment puis je faire ça?

pcl::PointCloud::Ptr cloud (new pcl::PointCloud); //Create a new cloud pcl::io::loadPCDFile ("cloud.pcd", *cloud); 

Je sais comment convertir de Mat (image 3D) en XYZRGB. Je pense que vous pouvez comprendre l’inverse. Ici, Q est la disparité à la profondeur Masortingx.

  pcl::PointCloud::Ptr point_cloud_ptr (new pcl::PointCloud); double px, py, pz; uchar pr, pg, pb; for (int i = 0; i < img_rgb.rows; i++) { uchar* rgb_ptr = img_rgb.ptr(i); uchar* disp_ptr = img_disparity.ptr(i); double* recons_ptr = recons3D.ptr(i); for (int j = 0; j < img_rgb.cols; j++) { //Get 3D coordinates uchar d = disp_ptr[j]; if ( d == 0 ) continue; //Discard bad pixels double pw = -1.0 * static_cast(d) * Q32 + Q33; px = static_cast(j) + Q03; py = static_cast(i) + Q13; pz = Q23; // Normalize the points px = px/pw; py = py/pw; pz = pz/pw; //Get RGB info pb = rgb_ptr[3*j]; pg = rgb_ptr[3*j+1]; pr = rgb_ptr[3*j+2]; //Insert info into point cloud structure pcl::PointXYZRGB point; point.x = px; point.y = py; point.z = pz; uint32_t rgb = (static_cast(pr) << 16 | static_cast(pg) << 8 | static_cast(pb)); point.rgb = *reinterpret_cast(&rgb); point_cloud_ptr->points.push_back (point); } } point_cloud_ptr->width = (int) point_cloud_ptr->points.size(); point_cloud_ptr->height = 1; 

Si je comprends bien, vous ne vous intéressez qu’aux valeurs RVB du nuage de points et ne vous souciez pas de ses valeurs XYZ?

Ensuite, vous pouvez faire:

 pcl::PointCloud::Ptr cloud (new pcl::PointCloud); //Create a new cloud pcl::io::loadPCDFile ("cloud.pcd", *cloud); cv::Mat result; if (cloud->isOrganized()) { result = cv::Mat(cloud->height, cloud->width, CV_8UC3); if (!cloud->empty()) { for (int h=0; hat(w, h); Eigen::Vector3i rgb = point.getRGBVector3i(); result.at(h,w)[0] = rgb[2]; result.at(h,w)[1] = rgb[1]; result.at(h,w)[2] = rgb[0]; } } } } 

Je pense que cela suffit pour montrer l’idée de base.

MAIS cela ne fonctionne que si votre nuage de points est organisé:

Un dataset de nuage de points organisé est le nom donné aux nuages ​​de points qui ressemblent à une structure (ou une masortingce) structurée, telle que les données sont divisées en lignes et en colonnes. Des exemples de tels nuages ​​de points incluent les données provenant de caméras stéréo ou de caméras Time Of Flight. Les avantages d’un jeu de données organisé sont qu’en connaissant la relation entre les points adjacents (par exemple, les pixels), les opérations les plus proches sont beaucoup plus efficaces, accélérant ainsi le calcul et réduisant les coûts de certains algorithmes dans PCL. (La source)

J’ai le même problème et j’ai réussi à le résoudre!

Commencez par transformer la coordonnée pour que votre “plan de sol” soit le plan XOY. L’API principale est pcl :: getTransformationFromTwoUnitVectorsAndOrigin

Vous pouvez regarder ma question:

bonne chance!