2015-04-03 113 views
0

我必須將ply數據轉換爲mat數據。爲此,我使用pcl的plyreader並將其轉換爲點雲,現在我的下一步是將其轉換爲點雲的mat數據。 我想我從plyreader獲得的點雲是無組織的。我一直在嘗試提取點雲的xyz值,然後將其複製到數據中。pointcloud data to mat data

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); 

} 

我知道這是錯誤的。我發現一個帖子關於這個但這是有組織的雲連接是在這裏 - >

訪問[點雲到MAT]

Coversion from PointCloud to Mat

我是新來這個領域。如果有人知道或可以幫助!

在此先感謝

回答

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; 

     }} 

有一個在代碼中沒有錯誤,並在簡歷::墊輸出正常運行,但仍然,值不會複製並給出一些荒謬的結果。有誰知道這個錯誤,或者只知道如何在輸出中獲取值作爲cvmat數據。

+0

解決....只需要在定義cvmat時添加零,以便它可以覆蓋值。 cv :: Mat輸出; output = cv :: Mat :: zeros(1,cloud-> points.size(),CV_32FC3); – Akash 2015-04-23 07:16:47

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; 
+0

是的,我昨天做了同樣的事情。但明天會試着建造它。謝謝您的幫助。 無論結果如何都會更新。 :) – Akash 2015-04-06 12:21:15

+0

:它正在創建一個異常,而循環已經初始化在這個語句 'output.at (1,i)[0] = cloud-> points [i] .x; ' – Akash 2015-04-13 09:55:52