Я пытаюсь объединить два набора точек из двух разных представлений в одно облако точек и визуализировать его с помощью средства просмотра облаков PCL.
mPtrPointCloud->points.clear();
mPtrPointCloud->points.resize(mFrameSize * 2);
auto it = mPtrPointCloud->points.begin();
received = PopReceived();
if (received != nullptr)
{
// p_data_cloud = (float*)received->mTransformedPC.data;
p_data_cloud = (float*)received->mCVPointCloud.data;
index = 0;
for (size_t i = 0; i < mFrameSize; ++i)
{
float X = p_data_cloud[index];
if (!isValidMeasure(X)) // Checking if it's a valid point
{
it->x = it->y = it->z = it->rgb = 0;
}
else
{
it->x = X;
it->y = p_data_cloud[index + 1];
it->z = p_data_cloud[index + 2];
it->rgb = convertColor(p_data_cloud[index + 3]); // Convert a 32bits float into a pcl .rgb format
}
index += 4;
++it;
}
}
frame = PopFrame();
if (frame != nullptr)
{
// p_data_cloud = frame->mSLPointCloud.getPtr<float>();
p_data_cloud = (float*)frame->mCVPointCloud.data;
index = 0;
for (size_t i = 0; i < mFrameSize; ++i)
{
float X = p_data_cloud[index];
if (!isValidMeasure(X)) // Checking if it's a valid point
{
it->x = it->y = it->z = it->rgb = 0;
}
else
{
it->x = X;
it->y = p_data_cloud[index + 1];
it->z = p_data_cloud[index + 2];
it->rgb = convertColor(p_data_cloud[index + 3]); // Convert a 32bits float into a pcl .rgb format
}
index += 4;
++it;
}
}
mPtrPCViewer->showCloud(mPtrPointCloud);
Я хочу, чтобы два набора точек были «слиты» в один кадр. Однако кажется, что эти два набора точек по-прежнему отображаются отдельно друг за другом.
Может ли кто-нибудь помочь объяснить, как действительно объединить два набора точек в одно облако? Спасибо
(1) Создайте новое пустое облако точек, которое в конце будет объединенным облаком точек.
pcl::PointCloud<pcl::PointXYZ> mPtrPointCloud;
(2) Преобразовать облака точек в исходную точку
pcl::PointCloud<pcl::PointXYZ> recieved_transformed;
Eigen::Transform<Scalar, 3, Eigen::Affine> recieved_transformation_mat(recieved.sensor_origin_ * recieved.sensor_orientation_);
pcl::transformPointCloud(recieved, recieved_transformed, recieved_transformation_mat);
pcl::PointCloud<pcl::PointXYZ> frame_transformed;
Eigen::Transform<Scalar, 3, Eigen::Affine> frame_transformation_mat(frame.sensor_origin_ * frame.sensor_orientation_);
pcl::transformPointCloud(frame, frame_transformed, frame_transformation_mat);
(3) Используйте оператор + =
mPtrPointCloud += received_transformed;
mPtrPointCloud += frame_transformed;
(4) Визуализируйте объединенное облако точек
mPtrPCViewer->showCloud(mPtrPointCloud);
Вот и все. См. Также пример http://pointclouds.org/documentation/tutorials/concatenate_clouds.phphttp://pointclouds.org/documentation/tutorials/matrix_transform.php
Это имеет тот же эффект, что и мое текущее решение, поскольку они оба добавляют точки в одно облако. Однако отображение двух облаков с разными именами может решить проблему (stackoverflow.com/questions/45783815/…). Я не совсем понимаю это сейчас. Я думаю, связано ли это с управлением буфером PCL.
Может быть, у ваших двух облаков разные трансформации? При объединении эта информация теряется.
Я не совсем уверен, что вы имеете в виду различные трансформации. Вы имеете в виду разные позы камеры? Их снимают в разных позах. Однако даже в этом случае они частично пересекаются друг с другом. Я думаю, что их можно будет объединить в одно и то же представление. И с помощью метода, указанного в ссылке, я могу видеть их в одном и том же виде.
Да, я имею в виду позы камеры. Зритель загружает два отдельных облака точек из соответствующей позы камеры. Вот почему это работает. Если вы хотите объединить два облака точек из двух разных поз камеры, вам нужно сначала преобразовать каждое из них в начало координат, а затем вы можете их объединить. Обновленный ответ!
Вы имеете в виду, что две позы камеры должны иметь одно и то же происхождение?
как вы получаете эти облака точек?