28 {
29
30 out_blob_ = out_blob;
31
32
33 range_ = feature_param.point_cloud_range();
34 width_ = feature_param.width();
35 height_ = feature_param.height();
36 min_height_ = feature_param.min_height();
37 max_height_ = feature_param.max_height();
38 CHECK_EQ(width_, height_)
39 << "Current implementation version requires input_width == input_height.";
40 use_intensity_feature_ = feature_param.use_intensity_feature();
41 use_constant_feature_ = feature_param.use_constant_feature();
42
43
44 log_table_.resize(kMaxLogNum);
45 for (size_t i = 0; i < log_table_.size(); ++i) {
46 log_table_[i] = std::log(static_cast<float>(1 + i));
47 }
48
49
50 float* out_blob_data = nullptr;
51#if USE_GPU == 1
52 log_blob_.reset(
53 new base::Blob<float>(1, 1, 1, static_cast<int>(log_table_.size())));
54 float* log_table = log_blob_->mutable_gpu_data();
55 cudaMemcpy(log_table, log_table_.data(), log_table_.size() * sizeof(float),
56 cudaMemcpyHostToDevice);
58#else
60#endif
61
62
63 int channel_index = 0;
64 max_height_data_ = out_blob_data + out_blob_->
offset(0, channel_index++);
65 mean_height_data_ = out_blob_data + out_blob_->
offset(0, channel_index++);
66 count_data_ = out_blob_data + out_blob_->
offset(0, channel_index++);
67 if (use_constant_feature_) {
68 direction_data_ = out_blob_data + out_blob_->
offset(0, channel_index++);
69 }
70 if (use_intensity_feature_) {
71 top_intensity_data_ = out_blob_data + out_blob_->
offset(0, channel_index++);
72 mean_intensity_data_ =
73 out_blob_data + out_blob_->
offset(0, channel_index++);
74 }
75 if (use_constant_feature_) {
76 distance_data_ = out_blob_data + out_blob_->
offset(0, channel_index++);
77 }
78 nonempty_data_ = out_blob_data + out_blob_->
offset(0, channel_index++);
79 CHECK_EQ(out_blob_->
offset(0, channel_index), out_blob_->
count());
80
81
82 if (use_constant_feature_) {
83 int map_size = height_ * width_;
84 std::vector<float> direction_data(map_size);
85 std::vector<float> distance_data(map_size);
86 for (int row = 0; row < height_; ++row) {
87 for (int col = 0; col < width_; ++col) {
88 int idx = row * width_ + col;
89
90 float center_x =
Pixel2Pc(row,
static_cast<float>(height_), range_);
91 float center_y =
Pixel2Pc(col,
static_cast<float>(width_), range_);
92 direction_data[idx] =
93 static_cast<float>(std::atan2(center_y, center_x) / (2.0 *
kPI));
94 distance_data[idx] =
95 static_cast<float>(std::hypot(center_x, center_y) / 60.0 - 0.5);
96 }
97 }
98
99
100#if USE_GPU == 1
101 cudaMemcpy(direction_data_, direction_data.data(),
102 direction_data.size() * sizeof(float), cudaMemcpyHostToDevice);
103 cudaMemcpy(distance_data_, distance_data.data(),
104 distance_data.size() * sizeof(float), cudaMemcpyHostToDevice);
105#else
106 memcpy(direction_data_, direction_data.data(),
107 direction_data.size() * sizeof(float));
108 memcpy(distance_data_, distance_data.data(),
109 distance_data.size() * sizeof(float));
110#endif
111 }
112 return true;
113}
Dtype * mutable_cpu_data()
Dtype * mutable_gpu_data()
int offset(const int n, const int c=0, const int h=0, const int w=0) const
float Pixel2Pc(int in_pixel, float in_size, float out_range)