43 template <
typename scalar_t>
49 scalar_t dp2p1[3], n1_copy[3], n2_copy[3];
50 dp2p1[0] = p2[0] - p1[0];
51 dp2p1[1] = p2[1] - p1[1];
52 dp2p1[2] = p2[2] - p1[2];
53 feature[3] = sqrt(dp2p1[0] * dp2p1[0] + dp2p1[1] * dp2p1[1] +
55 if (feature[3] == 0) {
65 if (acos(fabs(angle1)) > acos(fabs(angle2))) {
88 const scalar_t v_norm = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
106 template <
typename scalar_t>
112 static_cast<int>(
floor(11 * (feature[0] + M_PI) / (2.0 * M_PI)));
113 h_index1 = h_index1 >= 11 ? 10 : max(0, h_index1);
115 int h_index2 =
static_cast<int>(
floor(11 * (feature[1] + 1.0) * 0.5));
116 h_index2 = h_index2 >= 11 ? 10 : max(0, h_index2);
118 int h_index3 =
static_cast<int>(
floor(11 * (feature[2] + 1.0) * 0.5));
119 h_index3 = h_index3 >= 11 ? 10 : max(0, h_index3);
121 spfh[idx * 33 + h_index1] += hist_incr;
122 spfh[idx * 33 + h_index2 + 11] += hist_incr;
123 spfh[idx * 33 + h_index3 + 22] += hist_incr;
126 #if defined(__CUDACC__) 127 void ComputeFPFHFeatureCUDA
144 bool is_radius_search;
146 if (indices.GetShape().size() == 1) {
147 is_radius_search =
true;
149 is_radius_search =
false;
150 nn_size = indices.GetShape()[1];
154 const scalar_t *points_ptr = points.
GetDataPtr<scalar_t>();
155 const scalar_t *normals_ptr = normals.GetDataPtr<scalar_t>();
157 const scalar_t *distance2_ptr = distance2.GetDataPtr<scalar_t>();
159 scalar_t *spfhs_ptr = spfhs.
GetDataPtr<scalar_t>();
160 scalar_t *fpfhs_ptr = fpfhs.GetDataPtr<scalar_t>();
165 int64_t idx = 3 * workload_idx;
166 const scalar_t *point = points_ptr + idx;
167 const scalar_t *normal = normals_ptr + idx;
169 const int indice_size =
170 is_radius_search ? (counts_ptr[workload_idx + 1] -
171 counts_ptr[workload_idx])
172 : counts_ptr[workload_idx];
174 if (indice_size > 1) {
175 const scalar_t hist_incr =
176 100.0 /
static_cast<scalar_t
>(indice_size - 1);
177 for (
int i = 1; i < indice_size; i++) {
178 const int point_idx =
182 counts_ptr[workload_idx]]
183 : indices_ptr[workload_idx *
187 const scalar_t *point_ref =
188 points_ptr + 3 * point_idx;
189 const scalar_t *normal_ref =
190 normals_ptr + 3 * point_idx;
191 scalar_t fea[4] = {0};
192 ComputePairFeature<scalar_t>(
193 point, normal, point_ref, normal_ref, fea);
194 UpdateSPFHFeature<scalar_t>(fea, workload_idx,
195 hist_incr, spfhs_ptr);
203 const int indice_size =
204 is_radius_search ? (counts_ptr[workload_idx + 1] -
205 counts_ptr[workload_idx])
206 : counts_ptr[workload_idx];
208 if (indice_size > 1) {
209 scalar_t sum[3] = {0.0, 0.0, 0.0};
210 for (
int i = 1; i < indice_size; i++) {
213 ? i + counts_ptr[workload_idx]
214 : workload_idx * nn_size + i;
215 const scalar_t dist = distance2_ptr[idx];
216 if (dist == 0.0)
continue;
218 for (
int j = 0; j < 33; j++) {
220 spfhs_ptr[indices_ptr[idx] * 33 + j] /
223 fpfhs_ptr[workload_idx * 33 + j] += val;
226 for (
int j = 0; j < 3; j++) {
227 sum[j] = sum[j] != 0.0 ? 100.0 / sum[j] : 0.0;
229 for (
int j = 0; j < 33; j++) {
230 fpfhs_ptr[workload_idx * 33 + j] *= sum[j / 11];
231 fpfhs_ptr[workload_idx * 33 + j] +=
232 spfhs_ptr[workload_idx * 33 + j];
OPEN3D_HOST_DEVICE OPEN3D_FORCE_INLINE void cross_3x1(const scalar_t *A_3x1_input, const scalar_t *B_3x1_input, scalar_t *C_3x1_output)
Definition: Matrix.h:82
void ParallelFor(const Device &device, int64_t n, const func_t &func)
Definition: ParallelFor.h:122
const char const char value recording_handle imu_sample recording_handle uint8_t size_t data_size k4a_record_configuration_t config target_format k4a_capture_t capture_handle k4a_imu_sample_t imu_sample playback_handle k4a_logging_message_cb_t void min_level device_handle k4a_imu_sample_t int32_t
Definition: K4aPlugin.cpp:408
OPEN3D_HOST_DEVICE OPEN3D_FORCE_INLINE scalar_t dot_3x1(const scalar_t *A_3x1_input, const scalar_t *B_3x1_input)
Definition: Matrix.h:96
OPEN3D_HOST_DEVICE void UpdateSPFHFeature(const scalar_t *feature, int64_t idx, scalar_t hist_incr, scalar_t *spfh)
Definition: FeatureImpl.h:107
Dtype GetDtype() const
Definition: Tensor.h:1169
Device GetDevice() const override
Definition: Tensor.cpp:1384
#define OPEN3D_DEVICE
Definition: CUDAUtils.h:64
FN_SPECIFIERS MiniVec< float, N > floor(const MiniVec< float, N > &a)
Definition: MiniVec.h:94
#define OPEN3D_HOST_DEVICE
Definition: CUDAUtils.h:63
Definition: PinholeCameraIntrinsic.cpp:35
void ComputeFPFHFeatureCPU(const core::Tensor &points, const core::Tensor &normals, const core::Tensor &indices, const core::Tensor &distance2, const core::Tensor &counts, core::Tensor &fpfhs)
Definition: FeatureImpl.h:131
#define DISPATCH_FLOAT_DTYPE_TO_TEMPLATE(DTYPE,...)
Definition: Dispatch.h:96
T * GetDataPtr()
Definition: Tensor.h:1149
int64_t GetLength() const
Definition: Tensor.h:1130
OPEN3D_HOST_DEVICE void ComputePairFeature(const scalar_t *p1, const scalar_t *n1, const scalar_t *p2, const scalar_t *n2, scalar_t *feature)
Definition: FeatureImpl.h:44