将云数据指向mat数据

时间:2015-04-03 15:39:32

标签: point-cloud-library opencv-mat

我必须将ply数据转换为mat数据。为此,我使用了pcl的plyreader并转换为点云,现在我的下一步是将其转换为点云的mat数据。 我猜我从plyreader获得的点云是无组织的。我一直在尝试提取点云的xyz值,然后将其复制到数据中。

pcl :: PointCloud :: Ptr cloud(new pcl :: PointCloud);    //创建一个新的点云(POINTXYZ)

pcl::PLYReader reader;               
reader.read(filename,*cloud);         // read the ply file

cv::Mat output;
//...
output = cv::Mat(1,cloud->points.size(),CV_32FC3);
for(size_t i=0; i<cloud->points.size();++i)
{
    int m = cloud->points[i].x;
    int n = cloud->points[i].y;
    int l = cloud->points[i].z;

    float x0;
    float x1;
    float x2;

    output.at<cv::Vec3f>(x0,x1,x2)= cv::Vec3f(m,n,l);

}

我知道这是错的。我发现了一篇关于此的帖子,但这是有组织的云链接在这里 - &gt;

访问[pointcloud to mat]

Coversion from PointCloud to Mat

我是这个领域的新手。如果有人知道或可以帮助!!!

提前致谢

2 个答案:

答案 0 :(得分:0)

应该是:

output.at<cv::Vec3f>(1,i)[0] = cloud->points[i].x; //(1,i) is (row,col)
output.at<cv::Vec3f>(1,i)[1] = cloud->points[i].y; // [1] is y float
output.at<cv::Vec3f>(1,i)[2] = cloud->points[i].z;

答案 1 :(得分:0)

cv::Size sz;
sz= cv::Size(cloud->width,cloud->height);


cv::Mat output(sz,CV_32FC3);
cvWaitKey(50);



for (int j=0; j<output.rows;++j)
{
     for(int i= 0; i<output.cols;++i)
      {
    output.at<cv::Vec3f>(1,i)[0] = cloud->points[i].x;
    output.at<cv::Vec3f>(1,i)[1] = cloud->points[i].y;
    output.at<cv::Vec3f>(1,i)[2] = cloud->points[i].z;

      }}

代码中没有错误并且运行正常但仍然在cv :: Mat输出,值不是复制并给出一些荒谬的结果。有没有人知道错误或如何在输出中获取值仅作为cvmat数据。