pub struct ICP { /* private fields */ }
Expand description
This class implements a very efficient and robust variant of the iterative closest point (ICP) algorithm. The task is to register a 3D model (or point cloud) against a set of noisy target data. The variants are put together by myself after certain tests. The task is to be able to match partial, noisy point clouds in cluttered scenes, quickly. You will find that my emphasis is on the performance, while retaining the accuracy. This implementation is based on Tolga Birdal’s MATLAB implementation in here: http://www.mathworks.com/matlabcentral/fileexchange/47152-icp-registration-using-efficient-variants-and-multi-resolution-scheme The main contributions come from:
- Picky ICP: http://www5.informatik.uni-erlangen.de/Forschung/Publikationen/2003/Zinsser03-ARI.pdf
- Efficient variants of the ICP Algorithm: http://docs.happycoders.org/orgadoc/graphics/imaging/fasticp_paper.pdf
- Geometrically Stable Sampling for the ICP Algorithm: https://graphics.stanford.edu/papers/stabicp/stabicp.pdf
- Multi-resolution registration: http://www.cvl.iis.u-tokyo.ac.jp/~oishi/Papers/Alignment/Jost_MultiResolutionICP_3DIM03.pdf
- Linearization of Point-to-Plane metric by Kok Lim Low: https://www.comp.nus.edu.sg/~lowkl/publications/lowk_point-to-plane_icp_techrep.pdf
Implementations§
Source§impl ICP
impl ICP
pub fn default() -> Result<ICP>
Sourcepub fn new(
iterations: i32,
tolerence: f32,
rejection_scale: f32,
num_levels: i32,
sample_type: i32,
num_max_corr: i32,
) -> Result<ICP>
pub fn new( iterations: i32, tolerence: f32, rejection_scale: f32, num_levels: i32, sample_type: i32, num_max_corr: i32, ) -> Result<ICP>
\brief ICP constructor with default arguments.
§Parameters
- iterations:
- tolerence: Controls the accuracy of registration at each iteration of ICP.
- rejectionScale: Robust outlier rejection is applied for robustness. This value actually corresponds to the standard deviation coefficient. Points with rejectionScale * &sigma are ignored during registration.
- numLevels: Number of pyramid levels to proceed. Deep pyramids increase speed but decrease accuracy. Too coarse pyramids might have computational overhead on top of the inaccurate registrtaion. This parameter should be chosen to optimize a balance. Typical values range from 4 to 10.
- sampleType: Currently this parameter is ignored and only uniform sampling is applied. Leave it as 0.
- numMaxCorr: Currently this parameter is ignored and only PickyICP is applied. Leave it as 1.
§C++ default parameters
- tolerence: 0.05f
- rejection_scale: 2.5f
- num_levels: 6
- sample_type: ICP::ICP_SAMPLING_TYPE_UNIFORM
- num_max_corr: 1
Sourcepub fn new_def(iterations: i32) -> Result<ICP>
pub fn new_def(iterations: i32) -> Result<ICP>
\brief ICP constructor with default arguments.
§Parameters
- iterations:
- tolerence: Controls the accuracy of registration at each iteration of ICP.
- rejectionScale: Robust outlier rejection is applied for robustness. This value actually corresponds to the standard deviation coefficient. Points with rejectionScale * &sigma are ignored during registration.
- numLevels: Number of pyramid levels to proceed. Deep pyramids increase speed but decrease accuracy. Too coarse pyramids might have computational overhead on top of the inaccurate registrtaion. This parameter should be chosen to optimize a balance. Typical values range from 4 to 10.
- sampleType: Currently this parameter is ignored and only uniform sampling is applied. Leave it as 0.
- numMaxCorr: Currently this parameter is ignored and only PickyICP is applied. Leave it as 1.
§Note
This alternative version of [new] function uses the following default values for its arguments:
- tolerence: 0.05f
- rejection_scale: 2.5f
- num_levels: 6
- sample_type: ICP::ICP_SAMPLING_TYPE_UNIFORM
- num_max_corr: 1
Trait Implementations§
Source§impl Boxed for ICP
impl Boxed for ICP
Source§unsafe fn from_raw(ptr: <ICP as OpenCVFromExtern>::ExternReceive) -> Self
unsafe fn from_raw(ptr: <ICP as OpenCVFromExtern>::ExternReceive) -> Self
Source§fn into_raw(self) -> <ICP as OpenCVTypeExternContainer>::ExternSendMut
fn into_raw(self) -> <ICP as OpenCVTypeExternContainer>::ExternSendMut
Source§fn as_raw(&self) -> <ICP as OpenCVTypeExternContainer>::ExternSend
fn as_raw(&self) -> <ICP as OpenCVTypeExternContainer>::ExternSend
Source§fn as_raw_mut(&mut self) -> <ICP as OpenCVTypeExternContainer>::ExternSendMut
fn as_raw_mut(&mut self) -> <ICP as OpenCVTypeExternContainer>::ExternSendMut
Source§impl ICPTrait for ICP
impl ICPTrait for ICP
fn as_raw_mut_ICP(&mut self) -> *mut c_void
Source§fn register_model_to_scene(
&mut self,
src_pc: &impl MatTraitConst,
dst_pc: &impl MatTraitConst,
residual: &mut f64,
pose: &mut Matx44d,
) -> Result<i32>
fn register_model_to_scene( &mut self, src_pc: &impl MatTraitConst, dst_pc: &impl MatTraitConst, residual: &mut f64, pose: &mut Matx44d, ) -> Result<i32>
Source§fn register_model_to_scene_vec(
&mut self,
src_pc: &impl MatTraitConst,
dst_pc: &impl MatTraitConst,
poses: &mut Vector<Pose3DPtr>,
) -> Result<i32>
fn register_model_to_scene_vec( &mut self, src_pc: &impl MatTraitConst, dst_pc: &impl MatTraitConst, poses: &mut Vector<Pose3DPtr>, ) -> Result<i32>
Source§impl ICPTraitConst for ICP
impl ICPTraitConst for ICP
fn as_raw_ICP(&self) -> *const c_void
impl Send for ICP
Auto Trait Implementations§
impl Freeze for ICP
impl RefUnwindSafe for ICP
impl !Sync for ICP
impl Unpin for ICP
impl UnwindSafe for ICP
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<Mat> ModifyInplace for Matwhere
Mat: Boxed,
impl<Mat> ModifyInplace for Matwhere
Mat: Boxed,
Source§unsafe fn modify_inplace<Res>(
&mut self,
f: impl FnOnce(&Mat, &mut Mat) -> Res,
) -> Res
unsafe fn modify_inplace<Res>( &mut self, f: impl FnOnce(&Mat, &mut Mat) -> Res, ) -> Res
Mat
or another similar object. By passing
a mutable reference to the Mat
to this function your closure will get called with the read reference and a write references
to the same Mat
. This is unsafe in a general case as it leads to having non-exclusive mutable access to the internal data,
but it can be useful for some performance sensitive operations. One example of an OpenCV function that allows such in-place
modification is imgproc::threshold
. Read more