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 #ifndef PCL_FILTERS_IMPL_RANDOM_SAMPLE_H_
00039 #define PCL_FILTERS_IMPL_RANDOM_SAMPLE_H_
00040
00041 #include <pcl/filters/random_sample.h>
00042
00043
00045 template<typename PointT> void
00046 pcl::RandomSample<PointT>::applyFilter (PointCloud &output)
00047 {
00048 unsigned N = static_cast<unsigned> (input_->size ());
00049 float one_over_N = 1.0f / float (N);
00050
00051
00052
00053 if (sample_ >= N)
00054 {
00055 output = *input_;
00056 }
00057 else
00058 {
00059
00060 output.points.resize (sample_);
00061 output.width = sample_;
00062 output.height = 1;
00063
00064
00065 std::srand (seed_);
00066
00067 unsigned top = N - sample_;
00068 unsigned i = 0;
00069 unsigned index = 0;
00070
00071
00072 for (size_t n = sample_; n >= 2; n--)
00073 {
00074 unsigned int V = unifRand ();
00075 unsigned S = 0;
00076 float quot = float (top) * one_over_N;
00077 while (quot > V)
00078 {
00079 S++;
00080 top--;
00081 N--;
00082 quot = quot * float (top) * one_over_N;
00083 }
00084 index += S;
00085 output.points[i++] = input_->points[index++];
00086 N--;
00087 }
00088
00089 index += N * static_cast<unsigned> (unifRand ());
00090 output.points[i++] = input_->points[index++];
00091 }
00092 }
00093
00095 template<typename PointT>
00096 void
00097 pcl::RandomSample<PointT>::applyFilter (std::vector<int> &indices)
00098 {
00099 unsigned N = static_cast<unsigned> (input_->size ());
00100 float one_over_N = 1.0f / float (N);
00101
00102
00103
00104 if (sample_ >= N)
00105 {
00106 indices = *indices_;
00107 }
00108 else
00109 {
00110
00111 indices.resize (sample_);
00112
00113
00114 std::srand (seed_);
00115
00116
00117 unsigned top = N - sample_;
00118 unsigned i = 0;
00119 unsigned index = 0;
00120
00121 for (size_t n = sample_; n >= 2; n--)
00122 {
00123 unsigned int V = unifRand ();
00124 unsigned S = 0;
00125 float quot = float (top) * one_over_N;
00126 while (quot > V)
00127 {
00128 S++;
00129 top--;
00130 N--;
00131 quot = quot * float (top) * one_over_N;
00132 }
00133 index += S;
00134 indices[i++] = (*indices_)[index++];
00135 N--;
00136 }
00137
00138 index += N * static_cast<unsigned> (unifRand ());
00139 indices[i++] = (*indices_)[index++];
00140 }
00141 }
00142
00143 #define PCL_INSTANTIATE_RandomSample(T) template class PCL_EXPORTS pcl::RandomSample<T>;
00144
00145 #endif // PCL_FILTERS_IMPL_RANDOM_SAMPLE_H_