Структура от визуализатора движения

Я работаю над структурой из движения. Я думаю, что когда дело доходит до структуры из движения, люди бы наткнулись на книгу MultiView Geometry. Это очень хорошая книга, но я нашел кое-что запутывающее в этой книге. В приведенном ниже коде есть функция под названием Заполнить облако точек, которая имеет два параметра pointcloud и pointcloud_RGB. У меня есть значения типа point3d в pointcloud, но я не нашел ничего о pointcloud_RGB в этой книге, и он внезапно появляется в этой функции, которая используется для заполнения VEC3d rgbv. Может кто-нибудь, пожалуйста, помогите, кто сталкивался с этой книгой.

void PopulatePCLPointCloud(const vector<cv::Point3d>& pointcloud,
const std::vector<cv::Vec3b>& pointcloud_RGB = std::vector<cv::Vec3b>()
)

{
cout<<"Creating point cloud...";
cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);

for (unsigned int i=0; i<pointcloud.size(); i++) {
// get the RGB color value for the point
cv::Vec3b rgbv(255,255,255);

if (i < pointcloud_RGB.size()) {
rgbv = pointcloud_RGB[i];
}

// check for erroneous coordinates (NaN, Inf, etc.)
if (pointcloud[i].x != pointcloud[i].x ||
pointcloud[i].y != pointcloud[i].y ||
pointcloud[i].z != pointcloud[i].z ||
#ifndef WIN32
isnan(pointcloud[i].x) ||
isnan(pointcloud[i].y) ||
isnan(pointcloud[i].z) ||
#else
_isnan(pointcloud[i].x) ||
_isnan(pointcloud[i].y) ||
_isnan(pointcloud[i].z) ||
false
)
{
continue;
}
pcl::PointXYZRGB pclp;
pclp.x = pointcloud[i].x;
pclp.y = pointcloud[i].y;
pclp.z = pointcloud[i].z;
// RGB color, needs to be represented as an integer
uint32_t rgb = ((uint32_t)rgbv[2] << 16 | (uint32_t)rgbv[1] << 8 |
(uint32_t)rgbv[0]);
pclp.rgb = *reinterpret_cast<float*>(&rgb);
cloud->push_back(pclp);
}
cloud->width = (uint32_t) cloud->points.size(); // number of points
cloud->height = 1; // a list of points, one row of data

//Create visualizer

pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
viewer.showCloud (cloud);

cv::waitKey(0);
return;
}

0

Решение

Я считаю, что это фрагмент кода от MasteringOpenCV — Глава 4. Я проверил весь проект, и кажется, что это какая-то ошибка pointcloud_RGB определяется в

const std::vector<cv::Vec3b>& pointcloud_RGB = std::vector<cv::Vec3b>()

и никакое значение не присваивается, кроме как здесь;

rgbv = pointcloud_RGB[i];

и это при условии

if (i < pointcloud_RGB.size())

программа никогда бы не пошла на это, если pointcloud_RGB пуст и поэтому не может быть больше, чем я. Поэтому он должен работать без проблем.

Реальное облако точек pcl::PointXYZRGB pclp; и здесь он заполнен координатами XYZ + значения RGB;

pcl::PointXYZRGB pclp;
pclp.x = pointcloud[i].x;
pclp.y = pointcloud[i].y;
pclp.z = pointcloud[i].z;
// RGB color, needs to be represented as an integer
uint32_t rgb = ((uint32_t)rgbv[2] << 16 | (uint32_t)rgbv[1] << 8 |
(uint32_t)rgbv[0]);

Конечно, всегда есть возможность отправить электронное письмо автору и попросить разъяснения.

0

Другие решения


По вопросам рекламы [email protected]