How to convert cv::Mat to pcl::pointcloud

匿名 (未验证) 提交于 2019-12-03 02:52:02

问题:

How to get from a opencv Mat pointcloud to a pcl::pointcloud? The color is not important for me only the points itself.

回答1:

you can do this like:

pcl::PointCloud<pcl::PointXYZ>::Ptr SimpleOpenNIViewer::MatToPoinXYZ(cv::Mat OpencVPointCloud)          {              /*              *  Function: Get from a Mat to pcl pointcloud datatype              *  In: cv::Mat              *  Out: pcl::PointCloud              */               //char pr=100, pg=100, pb=100;              pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);//(new pcl::pointcloud<pcl::pointXYZ>);               for(int i=0;i<OpencVPointCloud.cols;i++)              {                 //std::cout<<i<<endl;                  pcl::PointXYZ point;                 point.x = OpencVPointCloud.at<float>(0,i);                 point.y = OpencVPointCloud.at<float>(1,i);                 point.z = OpencVPointCloud.at<float>(2,i);                  // when color needs to be added:                 //uint32_t rgb = (static_cast<uint32_t>(pr) << 16 | static_cast<uint32_t>(pg) << 8 | static_cast<uint32_t>(pb));                 //point.rgb = *reinterpret_cast<float*>(&rgb);                  point_cloud_ptr -> points.push_back(point);                }              point_cloud_ptr->width = (int)point_cloud_ptr->points.size();              point_cloud_ptr->height = 1;               return point_cloud_ptr;           } 

And also the otherway

 cv::Mat MVW_ICP::PoinXYZToMat(pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr){       cv::Mat OpenCVPointCloud(3, point_cloud_ptr->points.size(), CV_64FC1);      for(int i=0; i < point_cloud_ptr->points.size();i++){         OpenCVPointCloud.at<double>(0,i) = point_cloud_ptr->points.at(i).x;         OpenCVPointCloud.at<double>(1,i) = point_cloud_ptr->points.at(i).y;         OpenCVPointCloud.at<double>(2,i) = point_cloud_ptr->points.at(i).z;     }      return OpenCVPointCloud; } 


回答2:

To convert from a range image captured by a Kinect sensor and represented by depthMat to a pcl::PointCloud you can try this function. The calibration parameters are those used here.

{     pcl::PointCloud<pcl::PointXYZ>::Ptr MatToPoinXYZ(cv::Mat depthMat) {     pcl::PointCloud<pcl::PointXYZ>::Ptr ptCloud (new pcl::PointCloud<pcl::PointXYZ>);  // calibration parameters     float const fx_d = 5.9421434211923247e+02;     float const fy_d = 5.9104053696870778e+02;     float const cx_d = 3.3930780975300314e+02;     float const cy_d = 2.4273913761751615e+02;      unsigned char* p = depthMat.data;     for (int i = 0; i<depthMat.rows; i++)     {         for (int j = 0; j < depthMat.cols; j++)         {             float z = static_cast<float>(*p);             pcl::PointXYZ point;             point.z = 0.001 * z;             point.x = point.z*(j - cx_d)  / fx_d;             point.y = point.z *(cy_d - i) / fy_d;             ptCloud->points.push_back(point);             ++p;         }     }     ptCloud->width = (int)depthMat.cols;      ptCloud->height = (int)depthMat.rows;       return ptCloud;  } } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!