Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef PCL_REGISTRATION_DISTANCES_H
00040 #define PCL_REGISTRATION_DISTANCES_H
00041
00042 #include <Eigen/Core>
00043 #include <vector>
00044
00045 namespace pcl
00046 {
00047 namespace distances
00048 {
00049
00054 inline double
00055 computeMedian (double *fvec, int m)
00056 {
00057
00058 std::vector<double> data (m);
00059 memcpy (&data[0], fvec, sizeof (double) * m);
00060
00061 std::nth_element(data.begin(), data.begin() + (data.size () >> 1), data.end());
00062 return (data[data.size () >> 1]);
00063 }
00064
00070 inline double
00071 huber (const Eigen::Vector4f &p_src, const Eigen::Vector4f &p_tgt, double sigma)
00072 {
00073 Eigen::Array4f diff = (p_tgt.array () - p_src.array ()).abs ();
00074 double norm = 0.0;
00075 for (int i = 0; i < 3; ++i)
00076 {
00077 if (diff[i] < sigma)
00078 norm += diff[i] * diff[i];
00079 else
00080 norm += 2.0 * sigma * diff[i] - sigma * sigma;
00081 }
00082 return (norm);
00083 }
00084
00089 inline double
00090 huber (double diff, double sigma)
00091 {
00092 double norm = 0.0;
00093 if (diff < sigma)
00094 norm += diff * diff;
00095 else
00096 norm += 2.0 * sigma * diff - sigma * sigma;
00097 return (norm);
00098 }
00099
00106 inline double
00107 gedikli (double val, double clipping, double slope = 4)
00108 {
00109 return (1.0 / (1.0 + pow (fabs(val) / clipping, slope)));
00110 }
00111
00116 inline double
00117 l1 (const Eigen::Vector4f &p_src, const Eigen::Vector4f &p_tgt)
00118 {
00119 return ((p_src.array () - p_tgt.array ()).abs ().sum ());
00120 }
00121
00126 inline double
00127 l2 (const Eigen::Vector4f &p_src, const Eigen::Vector4f &p_tgt)
00128 {
00129 return ((p_src - p_tgt).norm ());
00130 }
00131
00136 inline double
00137 l2Sqr (const Eigen::Vector4f &p_src, const Eigen::Vector4f &p_tgt)
00138 {
00139 return ((p_src - p_tgt).squaredNorm ());
00140 }
00141 }
00142 }
00143
00144 #endif