pointcloud данни към mat данни

Трябва да преобразувам данни от слоеве в данни за мат. За това използвах plyreader на pcl и го преобразувах в облак от точки и сега следващата ми стъпка е да го конвертирам в mat данни от облак от точки. Предполагам, че облакът от точки, който получих от plyreader, е неорганизиран. Опитвам се да извлека xyz стойностите на облака от точки и след това да го копирам в данни.

pcl::PointCloud::Ptr облак (нов 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 изход; изход = cv::Mat::zeros(1,cloud-›points.size(),CV_32FC3); - person Akash; 23.04.2015