簡體   English   中英

Motion Visualizer的結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM