isl-org / isl-org/Open3D

correspondence_set does not match with a set of known correspondences

Open
#5,721 0 comments 0 reactions 0 assignees View on GitHub
bug
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).

### Describe the issue

I'm having a huge amount of difficulty implementing the Open3D function `registration_fgr_based_on_correspondence(moving,fixed,corres)`

I'm attempting a minimal registration approach by defining 2 point clouds with 3 points each. The correspondences are known between the two point clouds, so a Vector2iVector is defined using the list `[[0,0],[1,1],[2,2]]`, however for some reason, the correspondence between point 0 and point 2 is almost always either mis-associated with point 1, or not detected at all. I'm very confused as to why the registration pipeline doesn't allow for pre-defined "known" correspondences in this schema.

### Steps to reproduce the bug

```python
# units are meters, though this shouldn't matter

import open3d as o3d
import numpy as np

targets = np.array([[0.036,0.02,0.11], [0.036, 0.056, 0.087], [0.07,0.07,0.083]])

# using the points below, I get the expected results
#captured = np.array([[0.055569818552963605, -0.10185767162701978, -0.0846015092487883], [0.030809743024791572, -0.07459815150178217, -0.06553935971569191], [0.048148938620682945, -0.05887278343132876, -0.03678743840983336]])

# the last point is off by 0.003m, which is enough to reproduce the bug
captured = np.array([[0.055569818552963605, -0.10185767162701978, -0.0846015092487883], [0.030809743024791572, -0.07459815150178217, -0.06553935971569191], [0.048148938620682945, -0.05887278343132876, -0.03678743840983336]])

tcloud = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(targets))

ccloud = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(captured))

corres = o3d.utility.Vector2iVector([[0,0],[1,1],[2,2]])

result = o3d.pipelines.registration.registration_fgr_based_on_correspondence(ccloud, tcloud, corres)

print(np.array(result.transformation))
print(np.array(result.correspondence_set))
```

### Error message

_No response_

### Expected behavior

`print(np.array(result.correspondence_set))` should always return of the correspondences that are predefined in the variable `corres`, or at the very least, allow for a predefined set of correspondences to be hard-coded to minimize the error.

### Open3D, Python and System information

```markdown
Python 3.8, Ubuntu 18.04, tested in isolation
```

### Additional information

_No response_

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.