News Articles

Back to the list of articles

PCL 1.4.0!

We're thrilled to announce that Point Cloud Library (PCL) version 1.4.0 has been released!

PCL 1.4

You can find the latest source and binaries on our download page:

Thanks to the hard work of all of our awesome contributors, we've got a big list of new features. The most notable overall changes are:


  • added float union to the pointXYZRGBL type, in order to aid PCD_viewer compatibility
  • bugfix: pcl::computeCovarianceMatrixNormalized did not normalize for each implementation
  • fixed bug #421: at(u,v) should return a const reference
  • added InitFailedException and UnorganizedPointCloudException. Created PCL_EXCEPTION helper macro
  • added the GFPFH global descriptor point type
  • added gaussian kernel class and utilities
  • added isTrivial to pcl::PointRepresentation which allows avoiding copy operations in special cases, thus speeding up operations like rep->isValid (p)
  • added eigen33 for smallest eigenvalue/vector and only eigenvalues version
  • added PointCloudColorHandlerHSVField implementation
  • deleted wrong definition of density in pcl::transformPointCloud
  • added copy constructor for PCLBase
  • fixed PointCloud's in range inserter: width and height were not updated
  • added PCL_MAJOR_VERSION and PCL_MINOR_VERSION #defines per Ryan's request
  • fixed the getMatrixXf advanced user API call to return the correct values now that we are forcing Eigen Matrices to be row major in 1.x
  • moved the content of win32_macros.h into pcl_macros.h
  • added an isFinite method to check for x/y/z = NaN in point_types.hpp
  • moved internal headers from pcl/ros/point_traits.h into pcl/point_traits.h and pcl/ros/for_each_type.h to pcl/for_each_type.h (these headers are for internal use only and should have never been imported by user code - however pcl_ros in perception_pcl_unstable will need to be modified when following trunk after this revision, as that is the only external piece of code that should import these headers)
  • fixed one of the constructors for pcl::PointCloud<T> (cloud, indices) that was incomplete
  • no longer checking "frame_id" parameters in header for operator += in pcl::PointCloud<T>
  • added operator + for pcl::PointCloud<T>
  • improved doxygen documentation all around libpcl_common
  • added new specialization for pcl::PointCloud<Eigen::MatrixXf> - for advanced users only! (expect the API to change in trunk if needed)
  • moved NdCopyPointEigenFunctor and NdCopyEigenPointFunctor from voxel_grid.h to point_cloud.h
  • added CloudProperties class for optional properties for pcl::PointCloud<Eigen::MatrixXf>, and moved sensor_origin_ and sensor_orientation_ there (as properties.sensor_origin and properties.sensor_orientation), and removed header, while keeping header.stamp as properties.acquisition_time
  • fixed the copy constructor (vector<size_t> -> vector<int>) and added an implementation for the + operator
  • added a general convolution class. Convolution handles point cloud convolution in rows, columns and horizontal directions. Convolution allows for 3 policies: zero padding (default), borders mirroring and borders duplicating through PointCloudSpring class
  • refactorized PointCorrespondence and Correspondence into the same thing, per issue #458
  • added ChannelProperties in preparation for 2.0
  • fixed bug #445: Overloaded the setIndices method in PCLBase so that it can accept boost::shared_ptr<const std::vector> >
  • disabled unit test for getMatrixXfMap in DEBUG mode, as it was failing due to eigen's strictness on aligned/unaligned data, and added const+non consts versions


  • fixed bug in random_sample.cpp; The PointCloud2 filter wasn't working causing the unit test to fail
  • crop_box filter now supports PointT and PointCloud2 point clouds
  • added a normal space sampling filter
  • fixed bug #433: pcl::CropBox doesn't update width and height member of output point cloud
  • fixed bug #423 CropBox + VoxelGrid filters, order changes behaviour (using openni grabber)
  • add CropHull filter for filtering points based on a 2D or 3D convex or concave hull. The ray-polygon intersection test is used, which relys on closed polygons/surfaces
  • added clipper3D interface and a draft plane_clipper3D implementation
  • removed spurious old ColorFilter class (obsolete, and it was never implemented - the skeleton was just lurking around)
  • better Doxygen documentation to PassThrough, VoxelGrid and Filter
  • moved the set/getFilterLimits, set/getFilterFieldName, and get/setFilterLimitsNegative from Filter into VoxelGrid and PassThrough, as they were the only filters using it. The rest were not, thus leading to user confusion and a bloated API.


  • fixed bug #442: reversed template parameters preventing use of nearestKSearchT and radiusSearchT in pcl::search::Search and pcl::kdtree:KdTree


  • fixed a bug in OrganizedNeighbor where one of the radiusSearch signatures was working only if the cloud is not organized (#420 - thanks Hanno!)
  • updated pcl::search:OrganizedNeighbor to be back functional, radiusSearch is working back, 4-6x faster then KdTree, Knearest still need to implement this
  • changed pcl::search::FlannSearch: fixed style of class and tests, moved impl to hpp
  • cleaning up OrganizedNearestNeighbor as well as implementing one of the missing radiusSearch methods
  • improved documentation for libpcl_search and silenced all Doxygen warnings
  • removed auto (it needs to be completely rewritten and was left in a very bad state)
  • made sure all the output of the search method is consistently returning 0 in case the nearest neighbor search failed and not -1
  • updated kdtree wrapper code for the latest FLANN release


  • added method getVoxelBounds to octree iterator & removed result vector reserves
  • improved documentation for libpcl_octree and silenced all Doxygen warnings


  • fixed an omission of the sample size declaration for SACMODEL_PARALLEL_LINES (thanks Benergy)
  • replaced rand () with boost random number generators and fixed all failing unit tests
  • workaround to get rid of infinite loops if no valid model could be found


  • refactorization and consistent code indentation + make sure the timestamp is not set if we use PCL in ROS
  • fixed an older issue where the is_dense flag was not set appropriately when reading data from a binary file (thanks Updog!)
  • fixed an issue in the PLYWriter class where the element camera was not correctly set thus leading to crashes in Meshlab (thanks Bruno!)
  • the VTK library loads vertex colors in PLY files as RGB. Added that to the polymesh loader.
  • fixed 2 bugs in writing PolygonMesh and unpacking RGB
  • fixed a bug in the .OBJ exporter to strip the path from the material library filename (thanks Robert!)
  • added support for exporting vertex normals to the .OBJ (pcl::io::saveOBJFile) file exporter (thanks Robert!)
  • fixed a 32bit/64bit issue in pointcloud compression
  • added method to write obj files from PolygonMesh
  • added serial number support for Windows using mahisorns patch. Thanks to mahisorn
  • overloaded callbacks for OpenNIGrabber to output PointCloud<Eigen::MatrixXf> datasets
  • added the possibility to write binary compressed Eigen data to disk using two new methods: generateHeaderEigen and writeBinaryCompressedEigen. Performance improvements to 30Hz I/O
  • fix for #463 (Missing Symbol rgb_focal_length_SXGA_)
  • fix: rgb values need to be packed before saving them in PointCloud2 for PLYWriter
  • added example code for accessing synchronized image x depth data
  • added support for the Stanford range_grid element and obj_info for PLY files. If you chosse to use range_grid instead of camera then only valid vertices will be written down to the PLY file.


  • added refine method for Harris3D corner detector
  • rewrote big parts of the NARF keypoint extraction. Hopfully fixing some stability issues. Unfortunately still pretty slow for high resolution point clouds.
  • fixed bug #461 (SIFT Keypoint result cloud fields not complete); cleaned up the line-wrapping in the error/warning messages


  • fixed a bug in MarchingCubes's getIndexIn1D which led to the result variable to overflow when the data_size was larger than something around 2^10 (thanks Robert!)
  • reviewed and slightly modified mls implementation. Added MovingLeastSquaresOMP OpenMP implementation
  • new architecture for the mesh processing algorithms using VTK: MeshProcessing
  • overloaded reconstruction and performReconstruction in SurfaceReconstruction to output a PointCloud<T> and vector<Vertices> as well
  • added a new class called MeshConstruction per API design decision to split the surface reconstruction methods into topology preserving (EarClipping, @OrganizedFastMesh, GreedyProjectionTriangulation) and the rest. The new class implements a reconstruction/performReconstruction for PolygonMesh (for backwards compatibility purposes) and a faster set of the same methods for vector<Vertices>
  • refactorized GreedyProjectionTriangulation by making it inherit from the new MeshConstruction base class, and removed a lot of old buggy code
  • overloaded performReconstruction (PointCloud<T> &, vector<Vertices> &) per the new SurfaceReconstruction API
  • fixed a bug in OrganizedFastMesh where the x/y/z indices were assumed to be 0/1/2, and made it part of the MeshConstruction API
  • optimizations for OrganizedFastMesh. Now in 30Hz+ flavor.
  • fixed a segfault from last night's EarClipping refactorization and improved the efficiency of the algorithm considerably
  • updated ConvexHull and ConcaveHull to inherit from the new MeshConstruction class
  • renamed mesh_processing.h to processing.h and performReconstruction/reconstruct to performProcessing/process for the new MeshProcessing API


  • fixed bug #439: 3DSC unit test fails on MacOS
  • fixed IntegralImage2Dim : setting first line to zero was buggy producing undefined output data.
  • fixing an issue in PrincipalCurvaturesEstimation where the pc1 and pc2 magnitudes were not normalized with respect to the neighborhood size, thus making comparisons of different neighborhoods impossible (thanks Steffen!)
  • fixed ShapeContext3DEstimation computation and unit tests by switching from stdlib.h's random () to Boost.
  • fixed a bug in IntensityGradient: need to demean also intensity values, otherwise its assumed that the hyperplane goes always through origin which is not true
  • overloaded compute in pcl::Feature to save the output in an PointCloud<Eigen::MatrixXf>. Added partial specialization on Eigen::MatrixXf to all features and implemented computeFeature (PointCloud<MatrixXf> &output)
  • major doxygenization work
  • added optimization checks for is_dense for some features, implemented NaN output for most (per #457)
  • added new unit tests for the Eigen::MatrixXf output
  • fixing the MacOS GCC 4.2.1 compiler segfault by removing the OpenMP #pragma (related to ?).
  • fixed bug #468: refactored to make floor explicit.
  • added a setUseInternalCache method for PFHEstimation to use the internal cache on demand only. Other fixes to PFH/FPFH/PPF signatures (histogram sums were not adding up to 100.0 in some cases)
  • major improvements for integral images + added template specialization for one dimensional integral images


  • fixed some bugs in ELCH, thanks Frits for pointing them out
  • Big ELCH cleanup.
    • elch.h (API changes):
      - Use Boost bundled properties for LoopGraph, every vertex stores a
      pointer to the corresponding point cloud in graph[vertex].cloud.
      - loop_graph_ is now stored as a shared_ptr.
      - loop_start_ and loop_end_ are saved as ints for now (will change in
      the future).
      - loop_transform_ is not stored as a pointer (may change in the future).
    • elch.hpp:
      - Remove call to PCLBase::initCompute() as ELCH doesn't use a single
      input cloud or indices.
      - Change loopOptimizerAlgorithm to use start and end of the loop as
      stored in the object.
      - Adapt to API changes in elch.h.
  • added 2D implementation of Normal Distributions Transform for registration (Biber, Strasser; 2003), including example tool program.
  • reworked internal Registration API: Remove private computeTransformation without guess, make computeTransformation with guess abstract, Adapt all classes implementing Registration accordingly.
  • implemented SampleConsensusInitialAlignment with initial guess (thanks Dennis Guse)
  • cleaned up the CorrespondenceRejector API, per #375
  • apply Mourad's patch for #454; add more doc comments


  • fixed an issue in pcl::visualization::PointPickingCallback where iren->GetMousePosition () didn't seem to work on some VTK versions/systems, so we replaced it instead with iren->GetEventPosition () (#444 - thanks Adam!)
  • fixed a bug in PointCloudColorHandlerRGBField<sensor_msgs::PointCloud2> where one of the offsets for Z was incorrectly calculated thus leading to erroneous data (#404 - thanks Lucas!)
  • set the lighting off on setShapeRenderingProperties when the user tries to control the color of the object precisely (maybe add a different lighting on/off property later?)
  • revert pcl::visualization::PCLVisualizer::setShapeRenderingProperties vtk5.2, default in ubuntu LTS, doesn't support the SetLighting method on vtkActor
  • fixed an issue in PointCloudColorHandlerRGBField where using an "rgba" field was causing an error in pcd_viewer (#428 - thanks Maurice!)
  • added PointCloudColorHandlerHSVField
  • fixed the PointPickingCallback behavior on Windows 7: iren->GetShiftKey () returns 4 instead of 1 (thanks bepe)
  • added updateFeatureHistogram functionality to PCLHistogramVisualizer, per #456 (thanks Asil!)
  • added patch from Adam Stambler (Bug #396)
  • added removePolygonMesh to make the API more user friendly (addPolygonMesh was already existing, but the polygon meshes were removed using removeShape until now)
  • made the polygon meshes actually implement CloudActor structures internally, so that we can use different colors per vertex
  • added updatePolygonMesh and improved the efficiency of addPolygonMesh for fast online rendering (i.e., produced via OrganizedFastMesh)

New to PCL? Visit our downloads page and give it a try. If you're looking for ideas on how to get started, be sure to check out our growing collection of tutorials.

Add a Comment

Latest Posts

Latest Comments