[英]Structure from Motion Visualizer
我正在研究Motion的結構。 我認為,從運動到結構,人們會遇到《 MultiView Geometry》一書。 這是一本非常好的書,但是我發現那本書中的數據令人困惑。 在下面的代碼中,有一個稱為填充點雲的函數,該函數具有兩個參數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;
}
我相信這是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]);
當然,總有可能向作者發送電子郵件並要求澄清。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.