Add XRayPointsProcessor::bounding_box(). (#306)
Changes XRayPointsProcessor to use one bounding box for all floors. Makes the bounding box accessible via a public member function.master
							parent
							
								
									3d0d1e46b5
								
							
						
					
					
						commit
						4bb02c7240
					
				|  | @ -167,31 +167,22 @@ std::unique_ptr<XRayPointsProcessor> XRayPointsProcessor::FromDictionary( | |||
| 
 | ||||
| void XRayPointsProcessor::WriteVoxels(const Aggregation& aggregation, | ||||
|                                       FileWriter* const file_writer) { | ||||
|   Eigen::Array3i min(std::numeric_limits<int>::max(), | ||||
|                      std::numeric_limits<int>::max(), | ||||
|                      std::numeric_limits<int>::max()); | ||||
|   Eigen::Array3i max(std::numeric_limits<int>::min(), | ||||
|                      std::numeric_limits<int>::min(), | ||||
|                      std::numeric_limits<int>::min()); | ||||
| 
 | ||||
|   // Find the maximum and minimum cells.
 | ||||
|   for (mapping_3d::HybridGridBase<bool>::Iterator it(aggregation.voxels); | ||||
|        !it.Done(); it.Next()) { | ||||
|     const Eigen::Array3i idx = it.GetCellIndex(); | ||||
|     min = min.min(idx); | ||||
|     max = max.max(idx); | ||||
|   if (bounding_box_.isEmpty()) { | ||||
|     LOG(WARNING) << "Not writing output: bounding box is empty."; | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   // Returns the (x, y) pixel of the given 'index'.
 | ||||
|   const auto voxel_index_to_pixel = [&max, &min](const Eigen::Array3i& index) { | ||||
|   const auto voxel_index_to_pixel = [this](const Eigen::Array3i& index) { | ||||
|     // We flip the y axis, since matrices rows are counted from the top.
 | ||||
|     return Eigen::Array2i(max[1] - index[1], max[2] - index[2]); | ||||
|     return Eigen::Array2i(bounding_box_.max()[1] - index[1], | ||||
|                           bounding_box_.max()[2] - index[2]); | ||||
|   }; | ||||
| 
 | ||||
|   // Hybrid grid uses X: forward, Y: left, Z: up.
 | ||||
|   // For the screen we are using. X: right, Y: up
 | ||||
|   const int xsize = max[1] - min[1] + 1; | ||||
|   const int ysize = max[2] - min[2] + 1; | ||||
|   const int xsize = bounding_box_.sizes()[1] + 1; | ||||
|   const int ysize = bounding_box_.sizes()[2] + 1; | ||||
|   PixelDataMatrix image = PixelDataMatrix(ysize, xsize); | ||||
|   for (mapping_3d::HybridGridBase<bool>::Iterator it(aggregation.voxels); | ||||
|        !it.Done(); it.Next()) { | ||||
|  | @ -217,6 +208,7 @@ void XRayPointsProcessor::Insert(const PointsBatch& batch, | |||
|     const Eigen::Array3i cell_index = | ||||
|         aggregation->voxels.GetCellIndex(camera_point); | ||||
|     *aggregation->voxels.mutable_value(cell_index) = true; | ||||
|     bounding_box_.extend(cell_index.matrix()); | ||||
|     ColumnData& column_data = | ||||
|         aggregation->column_data[std::make_pair(cell_index[1], cell_index[2])]; | ||||
|     const auto& color = | ||||
|  |  | |||
|  | @ -52,6 +52,8 @@ class XRayPointsProcessor : public PointsProcessor { | |||
|   void Process(std::unique_ptr<PointsBatch> batch) override; | ||||
|   FlushResult Flush() override; | ||||
| 
 | ||||
|   Eigen::AlignedBox3i bounding_box() const { return bounding_box_; } | ||||
| 
 | ||||
|  private: | ||||
|   struct ColumnData { | ||||
|     double sum_r = 0.; | ||||
|  | @ -81,6 +83,9 @@ class XRayPointsProcessor : public PointsProcessor { | |||
| 
 | ||||
|   // Only has one entry if we do not separate into floors.
 | ||||
|   std::vector<Aggregation> aggregations_; | ||||
| 
 | ||||
|   // Bounding box containing all cells with data in all 'aggregations_'.
 | ||||
|   Eigen::AlignedBox3i bounding_box_; | ||||
| }; | ||||
| 
 | ||||
| }  // namespace io
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue