You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
6.7 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkDepthImageToPointCloud.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkDepthImageToPointCloud
* @brief convert a depth image into a point cloud
*
*
* vtkDepthImageToPointCloud is a filter that acquires its input
* from a depth image and converts it to point cloud represented as a
* vtkPolyData. This can then be used in a visualization pipeline.
*
* The filter takes two input images, one of which is optional. The first
* image is a (required) depth image containing z-buffer values. The second
* image is an (optional) scalar image. The information in the z-buffer
* image, plus a specified camera, is used to generate x-y-z coordinates of
* the output point cloud (i.e., the points in a vtkPolyData). The second
* scalar image is (optionally) output as scalars to the output point
* cloud. Note that the depth image must be a single component image, with
* values ranging between the near and far clipping range [-1,1].
*
* Note that if only a single input is provided, then the input is
* interpreted in one of two ways. First, if the "ZBuffer" point data is
* provided, then the input image is assumed to be color scalars with the
* depth data provided in the "ZBuffer" data array. (This is consistent with
* the vtkRendererSource filter with DepthValues enabled.) Otherwise, the
* input image is assumed to be a depth image.
*
* It is (optionally) possible to cull points located on the near and far
* clipping planes. This may better simulate the generation of a scanned
* object point cloud.
*
* @warning
* For the camera to transform the image depths into a point cloud, this
* filter makes assumptions about the origin of the depth image (and
* associated color scalar image). This class performs point by point
* transformation. The view matrix is used to transform each pixel. IMPORTANT
* NOTE: The transformation occurs by normalizing the image pixels into the
* (-1,1) view space (depth values are passed through). The process follows the
* vtkCoordinate class which is the standard for VTK rendering
* transformations. Subtle differences in whether the lower left pixel origin
* are at the center of the pixel versus the lower-left corner of the pixel
* will make slight differences in how pixels are transformed. (Similarly for
* the upper right pixel as well). This half pixel difference can cause
* transformation issues. (The code is commented appropriately.)
*
* @warning
* This class has been threaded with vtkSMPTools. Using TBB or other
* non-sequential type (set in the CMake variable
* VTK_SMP_IMPLEMENTATION_TYPE) may improve performance significantly.
*
* @sa
* vtkRendererSource vtkWindowToImageFilter vtkCamera vtkPolyData
* vtkCoordinate
*/
#ifndef vtkDepthImageToPointCloud_h
#define vtkDepthImageToPointCloud_h
#include "vtkPolyDataAlgorithm.h"
#include "vtkRenderingImageModule.h" // For export macro
class vtkCamera;
class VTKRENDERINGIMAGE_EXPORT vtkDepthImageToPointCloud : public vtkPolyDataAlgorithm
{
public:
//@{
/**
* Standard instantiation, type and print methods.
*/
static vtkDepthImageToPointCloud* New();
vtkTypeMacro(vtkDepthImageToPointCloud, vtkPolyDataAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
/**
* Return the MTime also considering the camera.
*/
vtkMTimeType GetMTime() override;
/**
* Indicates what camera was used to generate the depth image. The camera
* parameters define a transformation which is used to perform coordinate
* conversion into the 3D x-y-z space of the point cloud.
*/
void SetCamera(vtkCamera*);
//@{
/**
* Returns the camera being used to generate the point cloud from the
* depth image.
*/
vtkGetObjectMacro(Camera, vtkCamera);
//@}
//@{
/**
* Indicate whether to cull points that are located on the near clipping
* plane. These typically are points that are part of the clipped foreground. By
* default this is disabled.
*/
vtkSetMacro(CullNearPoints, bool);
vtkGetMacro(CullNearPoints, bool);
vtkBooleanMacro(CullNearPoints, bool);
//@}
//@{
/**
* Indicate whether to cull points that are located on the far clipping
* plane. These typically are points that are part of the background. By
* default this is enabled.
*/
vtkSetMacro(CullFarPoints, bool);
vtkGetMacro(CullFarPoints, bool);
vtkBooleanMacro(CullFarPoints, bool);
//@}
//@{
/**
* Indicate whether to output color scalar values along with the
* point cloud (assuming that the scalar values are available on
* input). By default this is enabled.
*/
vtkSetMacro(ProduceColorScalars, bool);
vtkGetMacro(ProduceColorScalars, bool);
vtkBooleanMacro(ProduceColorScalars, bool);
//@}
//@{
/**
* Indicate whether to output a vertex cell array (i.e., Verts) in the
* output point cloud. Some filters require this vertex cells to be
* defined in order to execute properly. For example some mappers will
* only render points if the vertex cells are defined.
*/
vtkSetMacro(ProduceVertexCellArray, bool);
vtkGetMacro(ProduceVertexCellArray, bool);
vtkBooleanMacro(ProduceVertexCellArray, bool);
//@}
//@{
/**
* Set the desired precision for the output points.
* See vtkAlgorithm::DesiredOutputPrecision for the available choices.
* The default is double precision.
*/
vtkSetMacro(OutputPointsPrecision, int);
vtkGetMacro(OutputPointsPrecision, int);
//@}
protected:
vtkDepthImageToPointCloud();
~vtkDepthImageToPointCloud() override;
vtkCamera* Camera;
bool CullNearPoints;
bool CullFarPoints;
bool ProduceColorScalars;
bool ProduceVertexCellArray;
int OutputPointsPrecision;
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestUpdateExtent(
vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo) override;
int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector) override;
int FillInputPortInformation(int port, vtkInformation* info) override;
int FillOutputPortInformation(int port, vtkInformation* info) override;
private:
vtkDepthImageToPointCloud(const vtkDepthImageToPointCloud&) = delete;
void operator=(const vtkDepthImageToPointCloud&) = delete;
};
#endif