данные pointcloud для сопоставления данных

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

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 to mat]

Покрытие от PointCloud до Mat

Я новичок в этой области. Если кто знает или может помочь !!!

заранее спасибо


person Akash    schedule 03.04.2015    source источник


Ответы (2)


Должен быть:

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;
person Deepfreeze    schedule 04.04.2015
comment
Да .. Я сделал то же самое вчера. Но завтра попробую построить. Спасибо за помощь. Обновит какой бы результат ни был. :) - person Akash; 06.04.2015
comment
: Он создает исключение после того, как цикл был инициализирован в этом операторе output.at ‹cv :: Vec3f› (1, i) [0] = cloud- ›points [i] .x; ' - person Akash; 13.04.2015

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.

person Akash    schedule 14.04.2015
comment
Решено .... Просто нужно добавить нули при определении cvmat, чтобы он мог перезаписать значения. cv :: Mat output; output = cv :: Mat :: zeros (1, облако- ›points.size (), CV_32FC3); - person Akash; 23.04.2015