Преобразование из PointCloud в Mat

Допустим, я инициализирую облако точек. Я хочу сохранить свои каналы RGB в типе данных opencv Mat. Как я могу это сделать?

pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);   //Create a new cloud
pcl::io::loadPCDFile<pcl::PointXYZRGBA> ("cloud.pcd", *cloud);

person Community    schedule 30.03.2013    source источник


Ответы (3)


Я знаю, как конвертировать из Mat (3D-изображение) в XYZRGB. Я думаю, вы можете решить по-другому. Здесь Q — несоответствие матрице глубины.

 pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
 double px, py, pz;
 uchar pr, pg, pb;

 for (int i = 0; i < img_rgb.rows; i++)
 {
     uchar* rgb_ptr = img_rgb.ptr<uchar>(i);
     uchar* disp_ptr = img_disparity.ptr<uchar>(i);
     double* recons_ptr = recons3D.ptr<double>(i);
     for (int j = 0; j < img_rgb.cols; j++)
     {
         //Get 3D coordinates

          uchar d = disp_ptr[j];
          if ( d == 0 ) continue; //Discard bad pixels
          double pw = -1.0 * static_cast<double>(d) * Q32 + Q33; 
          px = static_cast<double>(j) + Q03;
          py = static_cast<double>(i) + Q13;
          pz = Q23;

          // Normalize the points
          px = px/pw;
          py = py/pw;
          pz = pz/pw;

          //Get RGB info
          pb = rgb_ptr[3*j];
          pg = rgb_ptr[3*j+1];
          pr = rgb_ptr[3*j+2];

          //Insert info into point cloud structure
          pcl::PointXYZRGB point;
          point.x = px;
          point.y = py;
          point.z = pz;
          uint32_t rgb = (static_cast<uint32_t>(pr) << 16 |
          static_cast<uint32_t>(pg) << 8 | static_cast<uint32_t>(pb));
          point.rgb = *reinterpret_cast<float*>(&rgb);
          point_cloud_ptr->points.push_back (point);
    }
}

point_cloud_ptr->width = (int) point_cloud_ptr->points.size();
point_cloud_ptr->height = 1;
person Froyo    schedule 18.04.2013
comment
Это определенно не ответ на этот вопрос! Кроме того, несколько переменных не определены, что добавляет путаницы! - person Färid Alijani; 12.08.2019

Правильно ли я понимаю, что вас интересуют только RGB-значения облака точек и не заботят его XYZ-значения?

Затем вы можете сделать:

pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); 
//Create a new cloud
pcl::io::loadPCDFile<pcl::PointXYZRGBA> ("cloud.pcd", *cloud);

cv::Mat result; 

if (cloud->isOrganized()) {
    result = cv::Mat(cloud->height, cloud->width, CV_8UC3);

    if (!cloud->empty()) {

        for (int h=0; h<result.rows; h++) {
            for (int w=0; w<result.cols; w++) {
                pcl::PointXYZRGBA point = cloud->at(w, h);

                Eigen::Vector3i rgb = point.getRGBVector3i();

                result.at<cv::Vec3b>(h,w)[0] = rgb[2];
                result.at<cv::Vec3b>(h,w)[1] = rgb[1];
                result.at<cv::Vec3b>(h,w)[2] = rgb[0];
            }
        }
    }
}

Я думаю, этого достаточно, чтобы показать основную идею.

НО это работает, только если ваше облако точек организовано:

Набор данных организованное облако точек — это имя, данное облакам точек, которые напоминают организованное изображение (или матрицу), подобную структуре, где данные разбиты на строки и столбцы. Примеры таких облаков точек включают данные, поступающие со стереокамер или камер Time Of Flight. Преимущество организованного набора данных заключается в том, что, зная взаимосвязь между соседними точками (например, пикселями), операции с ближайшими соседями становятся намного более эффективными, что ускоряет вычисления и снижает затраты на определенные алгоритмы в PCL. (Источник)

person Fei    schedule 11.07.2013
comment
Кроме того, если вы создаете пример кода, вы можете использовать pcl2png [/path/to.pcd] [/path/to.png] см. здесь - person Ardiya; 27.05.2019

У меня такая же проблема и мне удалось ее решить!

Сначала вы должны преобразовать координату так, чтобы ваша «плоскость земли» была плоскостью X-O-Y. Основным API является pcl::getTransformationFromTwoUnitVectorsAndOrigin.

Вы можете взглянуть на мой вопрос:

удачи!

person gouchaoer    schedule 26.04.2015