Register two point clouds using phase correlation
computes the rigid transformation that registers the moving point cloud
tform = pcregistercorr(
moving, to the fixed point cloud
fixed, using an image-based phase correlation
The function performs registration by first converting both point clouds to a 2-D occupancy grid in the X-Y plane with center at the origin (0,0,0). The occupancy of each grid cell is determined using the Z-coordinate values of points within the grid.
[___] = pcregistercorr(___,
specifies options using one or more name-value arguments in addition to any
combination of arguments from previous syntaxes. For example,
Window=false sets the
name-value argument to
false to suppress using windowing
Register Lidar Moving Point Cloud to Fixed Point Cloud
Read data from a Velodyne packet capture (PCAP) file into the workspace.
veloReader = velodyneFileReader('lidarData_ConstructionRoad.pcap','HDL32E');
Read a fixed and a moving point cloud from frames of the lidar data.
frameNumber = 1; skipFrame = 5; fixed = readFrame(veloReader,frameNumber); moving = readFrame(veloReader,frameNumber + skipFrame);
Find the ground planes for both the moving and the fixed point clouds. Set the maximum distance in meters.
maxDistance = 0.4; referenceVector = [0 0 1]; groundMoving = pcfitplane(moving,maxDistance,referenceVector); groundFixed = pcfitplane(fixed,maxDistance,referenceVector);
Transform the point clouds so that their ground planes are parallel to the X-Y plane.
tformMoving = normalRotation(groundMoving,referenceVector); tformFixed = normalRotation(groundFixed,referenceVector); movingCorrected = pctransform(moving,tformMoving); fixedCorrected = pctransform(fixed,tformFixed);
Register the moving point cloud against the fixed point cloud. Set the occupancy grid size to 100-by-100 meters and the size of each grid cell to 0.5-by-0.5 meters.
gridSize = 100; gridStep = 0.5; tform = pcregistercorr(movingCorrected,fixedCorrected,gridSize,gridStep);
Transform the moving point cloud using the estimated rigid transformation.
combinedTform = rigidtform3d(tformFixed.A * tformMoving.A * tform.A); movingReg = pctransform(moving,combinedTform);
Visualize the registration.
figure subplot(121) pcshowpair(moving,fixed) title('Before Registration') view(2) subplot(122) pcshowpair(movingReg,fixed) title('After Registration') view(2)
gridSize — Size of square occupancy grid
Size of square occupancy grid, specified as a scalar value in world units.
The occupancy grid has both width and height equal to this value. The
occupancy grid is centered at the origin (0, 0, 0) and the spatial extent of
the occupancy grid is [-
gridStep — Size of each grid cell
Size of each grid cell, specified as a scalar value in world units.
Specify optional pairs of arguments as
the argument name and
Value is the corresponding value.
Name-value arguments must appear after other arguments, but the order of the
pairs does not matter.
Zlimit=[0 3] sets the Z-axis lower
0 and the upper limit to
Before R2021a, use commas to separate each name and value, and enclose
Name in quotes.
Zlimit — Z-axis limits
[0 3] (default) | vector of form [zmin
Z-axis limits to compute the occupancy of a grid
cell, specified as a vector of the form [zmin
zmax], where zmin and
zmax are numeric scalars. The function scales
points with a Z-axis value from
zmin to zmax to probabilities
in the range [0, 1]. Values less than zmin are
assigned an occupancy value of
0. Values greater than
zmax are assigned an occupancy value of
Window — Logical to use windowing
true) (default) |
Logical to use windowing to suppress spectral leakage effects in the
frequency domain, specified as a numeric or logical
true). When you set
true, the function uses a Blackman window to
increase the stability of registration results. If the common features
that will be aligned in the occupancy grids are oriented along the
edges, then setting
false could provide superior registration
tform — Rigid transformation
Rigid transformation, returned as a
rigidtform3d object. The
describes the rigid 3-D transformation that registers the moving point cloud
to the fixed point cloud.
rmse — Root mean square error
Root mean square error, returned as the Euclidean distance between the
aligned point cloud. A low
rmse value indicates a more
peak — Peak correlation value
Peak correlation value of the phase difference between the two occupancy
grids, returned as a scalar value. A peak value less than
0.03 indicates a poor registration result.
The phase correlation method is best used to register point clouds when the transformation can be described by a translation in the X-Y plane and a rotation around the Z-axis. For example, a ground vehicle with a horizontally mounted lidar moving on a flat surface.
The phase correlation algorithm expects motion to be exclusively along the X-Y plane, as with the ground plane. If motion is not exactly in the X-Y plane, you can use the
normalRotationfunction to transform the point clouds. For example, in vehicular motion, you can reduce the effects of vehicle suspension or surface features such as potholes and speed bumps by using the
Increasing the size of the occupancy grid increases the computational demands of this function. You can control the size of the occupancy grid by modifying the
If you obtain poor registration results and the
peakcorrelation value is less than
0.03, try setting the
 Dimitrievski, Martin, David Van Hamme, Peter Veelaert, and Wilfried Philips. “Robust Matching of Occupancy Maps for Odometry in Autonomous Vehicles.” In Proceedings of the 11th Joint Conference on Computer Vision, Imaging and Computer Graphics Theory and Applications, 626–633. Rome, Italy: SCITEPRESS - Science and Technology Publications, 2016.
 Reddy, B.S., and B.N. Chatterji. “An FFT-Based Technique for Translation, Rotation, and Scale-Invariant Image Registration.” IEEE Transactions on Image Processing 5, no. 8 (August 1996): 1266–71. https://doi.org/10.1109/83.506761.
Version HistoryIntroduced in R2020b
Starting in R2022b, most Computer Vision Toolbox™ functions create and perform geometric transformations using the
premultiply convention. Accordingly, the
function now returns
tform as a
rigidtform3d object, which uses the premultiply convention. Before,
the function returned
tform as a
object, which uses the postmultiply convention.