2015-04-03 3 views
0

Мне нужно преобразовать данные слоя в данные мата. Для этого я использовал plyreader pcl и конвертировал в облако точек, и теперь моим следующим шагом является преобразование его в данные мата из облака точек. Я думаю, облако точек, которое я получил от plyreader, неорганизован. Я пытаюсь извлечь значения xyz облака точек и затем скопировать их в данные.данные pointcloud для данных мата

pcl :: PointCloud :: Ptr cloud (новый 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); 

} 

Я знаю, что это неправильно. Я нашел один пост об этом, но это для организованной облака Ссылка здесь ->

Визит [PointCloud матировать]

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; 

     }} 

Там нет ошибки в коде и работает правильно, но все еще в ЦВ :: выход Mat, значения не копировать и дает некоторый абсурдный результат. Кто-нибудь знает ошибку или как получить значения на выходе только как данные cvmat.

+0

Решенный .... Просто нужно добавить нули при определении cvmat, чтобы он мог переписать значения. cv :: Mat output; output = cv :: Mat :: zeros (1, cloud-> points.size(), CV_32FC3); – Akash

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

+0

: Он создает исключение, после того как цикл был инициализирован в этом утверждении 'output.at (1, i) [0] = cloud-> points [i] .x; ' – Akash

 Смежные вопросы

  • Нет связанных вопросов^_^