我正在研究Structure from Motion。我认为,当它从运动中构建时,人们会遇到MultiView Geometry一书。这是一本非常好的书,但我在那本书中发现了令人困惑的数据。在下面的代码中,有一个名为Populate point cloud的函数,它有两个参数pointcloud和pointcloud_RGB。我在pointcloud中有point3d类型的值,但我在该书中找不到关于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 :(得分: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为空而且因此不能大于i,程序将永远不会进入此程序。这就是为什么它应该没有任何问题。
实际点云为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]);
当然,总有可能向作者发送电子邮件并要求澄清。