Соответствующие данные пикселей и облако точек - PullRequest
1 голос
/ 04 мая 2019

Мне нужно организовать данные облака точек от 1D до 2D. У меня уже есть данные облака точек 1D, которые содержат данные только для пикселей (называемых действительными пикселями) с интенсивностью 255. Поэтому я должен организовать облако точек в соответствии с изображением. У меня проблемы с доступом к 2D-облаку точек. Я не знаю, как это сделать.

// Here the data from in_ThreeD_cloud which is of type tDistanceData is converted to tVec3f
const rrlib::math::tVec3f *points = reinterpret_cast<const rrlib::math::tVec3f*>(in_ThreeD_cloud->DataPtr());

int num_valid_points = 0;

// An object to class PointCloud is created
pcl::PointCloud<pcl::PointXYZI> cloud; 

// Image data from the camera is accessed as Matrix
cv::Mat image  = rrlib::coviroa::AccessImageAsMat(in_img->at(0));

// Dimensions of the point cloud is sent as parameters to overloaded constuctor
cloud(image.cols, image.rows); 

// The point cloud is expected to store the vector3f data in a 2D format
for(int i = 0; i <= image.rows; ++i)
for(int j = 0; j <= image.cols; ++j)
{
     if( image.at<uchar>(i,j) == 255)
     {
       // Error shown here
       cloud.points[i][j].getVector3fMap() = &points[num_valid_points];
       num_valid_points++;

      }


}

Показанная ошибка: ошибка: нет совпадения для оператора «[]» (типы операндов: «__gnu_cxx :: __ alloc_traits> :: value_type {aka pcl :: PointXYZI}» и «int»)

1 Ответ

0 голосов
/ 08 мая 2019

Уверен, проблема в вызове доступа к облаку точек.Вам нужно использовать запятую вместо вторых скобок, и я также считаю (поправьте меня, если я ошибаюсь), что координаты должны быть в порядке столбцов и строк.* вместо вашего порядка [row] [col].

Я также изменил ваше облако на xyz, поскольку вы не добавляете в него какую-либо интенсивность (а просто проверяете изображение, чтобы определить наличие точки).

Наконец, убедитесь, что вы знаете порядок (строка против столбца), в котором точки хранятся в вашем трехмерном облаке, и убедитесь, что вы проходите таким же образом.

// An object to class PointCloud is created
pcl::PointCloud<pcl::PointXYZ> cloud; 

// Image data from the camera is accessed as Matrix
cv::Mat image  = rrlib::coviroa::AccessImageAsMat(in_img->at(0));

// Dimensions of the point cloud is sent as parameters to overloaded constuctor
cloud(image.cols, image.rows); 

// The point cloud is expected to store the vector3f data in a 2D format
for(int i = 0; i <= image.rows; ++i)
for(int j = 0; j <= image.cols; ++j)
{
     if( image.at<uchar>(i,j) == 255)
     {
       // Error shown here
       cloud.points[j,i].getVector3fMap() = &points[num_valid_points];
       num_valid_points++;

      }
}
...