isl-org / isl-org/Open3D

Summarize the question. (e.g., "How to run reconstruction system with RealSense ? ")

Open
#6,531 0 comments 0 reactions 0 assignees View on GitHub
question
Dominant language
C++
Stars
14k
Forks
2.6k
Avg merge
5d 18h
Merged PRs (30d)
6

Description

### Checklist

- [X] I have searched for [similar issues](https://github.com/isl-org/Open3D/issues).
- [X] For Python issues, I have tested with the [latest development wheel](http://www.open3d.org/docs/latest/getting_started.html#development-version-pip).
- [X] I have checked the [release documentation](http://www.open3d.org/docs/release/) and the [latest documentation](http://www.open3d.org/docs/latest/) (for `master` branch).

### My Question

Hello, I am trying to register lidar point cloud data from vehicle with point cloud data generated from citygml lod2 data. While doing global registration, the initial and final output are same, there is no registration conducted. RegistrationResult with fitness=0.000000e+00, inlier_rmse=0.000000e+00, and correspondence_set size of 0
Which means there is no registration, if any one has similar issue and solution please help. This is the code i used:
import open3d as o3d
import numpy as np

def draw_registration_result(source, target, transformation):
source_temp = o3d.geometry.PointCloud(source)
target_temp = o3d.geometry.PointCloud(target)
source_temp.paint_uniform_color([1, 0.706, 0])
target_temp.paint_uniform_color([0, 0.651, 0.929])
source_temp.transform(transformation)
o3d.visualization.draw_geometries([source_temp, target_temp])

def preprocess_point_cloud(pcd, voxel_size):
print(":: Downsample with a voxel size %.3f." % voxel_size)
pcd_down = pcd.voxel_down_sample(voxel_size)

radius_normal = voxel_size * 2
print(":: Estimate normal with search radius %.3f." % radius_normal)
pcd_down.estimate_normals(
o3d.geometry.KDTreeSearchParamHybrid(radius=radius_normal, max_nn=30))

radius_feature = voxel_size * 5
print(":: Compute FPFH feature with search radius %.3f." % radius_feature)
pcd_fpfh = o3d.pipelines.registration.compute_fpfh_feature(
pcd_down,
o3d.geometry.KDTreeSearchParamHybrid(radius=radius_feature, max_nn=100))
return pcd_down, pcd_fpfh

def prepare_dataset(voxel_size):
print(":: Load two point clouds and disturb initial pose.")

source = o3d.io.read_point_cloud(
"/Users/sumeer/Documents/MSc LMGS/Advanced GIS 2/vehicle/Applied_Geoinformatics_2_2023_Initial_Datasets/manual_registration/submap_1_point_cloud/submap_1_world.xyz",
"xyz")
target = o3d.io.read_point_cloud(
"/Users/sumeer/Documents/MSc LMGS/Advanced GIS 2/vehicle/lod2_pc_without_veg_1.xyz", "xyz")

trans_init = np.asarray([[0.0, 1.0, 0.0, 0.0],
[1.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[0.0, 0.0, 0.0, 1.0]])

draw_registration_result(source, target, trans_init)

source_down, source_fpfh = preprocess_point_cloud(source, voxel_size)
target_down, target_fpfh = preprocess_point_cloud(target, voxel_size)

return source, target, source_down, target_down, source_fpfh, target_fpfh

def execute_global_registration(source_down, target_down, source_fpfh,
target_fpfh, voxel_size):
distance_threshold = voxel_size * 1.5
print(":: RANSAC registration on downsampled point clouds.")
print(" Since the downsampling voxel size is %.3f," % voxel_size)
print(" we use a liberal distance threshold %.3f." % distance_threshold)
result = o3d.pipelines.registration.registration_ransac_based_on_feature_matching(
source_down, target_down, source_fpfh, target_fpfh, True,
distance_threshold,
o3d.pipelines.registration.TransformationEstimationPointToPoint(False),
3, [
o3d.pipelines.registration.CorrespondenceCheckerBasedOnEdgeLength(
0.9),
o3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(
distance_threshold)
], o3d.pipelines.registration.RANSACConvergenceCriteria(100000, 0.999))
return result

# Example usage
voxel_size = 0.0125 # Adjust voxel size as needed

source, target, source_down, target_down, source_fpfh, target_fpfh = prepare_dataset(
voxel_size)

result_ransac = execute_global_registration(source_down, target_down,
source_fpfh, target_fpfh,
voxel_size)

print(result_ransac)
draw_registration_result(source_down, target_down, result_ransac.transformation)

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.