Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to import a point cloud into the HLOC workflow to be used as a reference for localization? #358

Open
messileonardo opened this issue Jan 22, 2024 · 2 comments

Comments

@messileonardo
Copy link

Hi there, I would like to scale the sfm point cloud (generated by COLMAP) externally and import it into the HLOC workflow to use it as a reference for localization. To do that, I guess that the variable that you call "model", that is:

"model = reconstruction.main(sfm_dir, images_mapping, sfm_pairs, features, matches, image_list=references)",

must be re-generated from the re-imported point cloud.
So my question is: how can I import a point cloud into the HLOC workflow and use it as a reference for localization?

Looking at the documentation, I found that a function called "import_PLY" exist.

"import_PLY(...)
import_PLY(self: pycolmap.Reconstruction, arg0: str) -> None
Import from PLY format. Note that these import functions are only intended for visualization of data and usable for reconstruction.
"

Can it be used to import a point cloud into the HLOC workflow in order to use that point cloud as a reference for localization?

Many thanks in advance!

@messileonardo
Copy link
Author

Hi there, I managed the importing phase with the following line of code:
pycolmap.Reconstruction.import_PLY(model, str(import_ply_path))
I get no errors in this step, but I am not sure it is correct.
Assuming it is correct, what I am trying to do now (with no success) is using the externally-scaled point cloud in the Hloc workflow. In particular, I would like to carry out localization with reference to the externally-scaled point cloud. I guess that the "model" variable must be recomputed in some way.
The error I get in the localization step is the following:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[20], line 24
     19 conf = {
     20     'estimation': {'ransac': {'max_error': 12}}, # reprojection error in pixel https://github.com/colmap/pycolmap/blob/ea42af8726de2cb49ff9b189000d7ef0408e8ea2/README.md?plain=1#L160
     21     'refinement': {'refine_focal_length': True, 'refine_extra_params': True},
     22 }
     23 localizer = QueryLocalizer(model, conf)
---> 24 ret, log = hloc_pose_from_cluster(localizer, query, camera, ref_ids, features, matches)
     25 print(f'found {ret["num_inliers"]}/{len(ret["inliers"])} inlier correspondences.')
     26 # visualization.visualize_loc_from_log(images, query, log, model, top_k_db=3)

File ~/services/jupyterlab/Hierarchical-Localization-v2/Hierarchical-Localization/hloc/localize_sfm.py:124, in hloc_pose_from_cluster(localizer, qname, query_camera, db_ids, features_path, matches_path, **kwargs)
    122 mkp_idxs = [i for i in idxs for _ in kp_idx_to_3D[i]]
    123 mp3d_ids = [j for i in idxs for j in kp_idx_to_3D[i]]
--> 124 ret = localizer.localize(kpq, mkp_idxs, mp3d_ids, query_camera, **kwargs)
    125 ret['camera'] = {
    126     'model': query_camera.model_name,
    127     'width': query_camera.width,
    128     'height': query_camera.height,
    129     'params': query_camera.params,
    130 }
    133 # mostly for logging and post-processing

File ~/services/jupyterlab/Hierarchical-Localization-v2/Hierarchical-Localization/hloc/localize_sfm.py:58, in QueryLocalizer.localize(self, points2D_all, points2D_idxs, points3D_id, query_camera)
     56 def localize(self, points2D_all, points2D_idxs, points3D_id, query_camera):
     57     points2D = points2D_all[points2D_idxs]
---> 58     points3D = [self.reconstruction.points3D[j].xyz for j in points3D_id]
     59     ret = pycolmap.absolute_pose_estimation(
     60         points2D, points3D, query_camera,
     61         estimation_options=self.config.get('estimation', {}),
     62         refinement_options=self.config.get('refinement', {}),
     63     )
     64     return ret

File ~/services/jupyterlab/Hierarchical-Localization-v2/Hierarchical-Localization/hloc/localize_sfm.py:58, in <listcomp>(.0)
     56 def localize(self, points2D_all, points2D_idxs, points3D_id, query_camera):
     57     points2D = points2D_all[points2D_idxs]
---> 58     points3D = [self.reconstruction.points3D[j].xyz for j in points3D_id]
     59     ret = pycolmap.absolute_pose_estimation(
     60         points2D, points3D, query_camera,
     61         estimation_options=self.config.get('estimation', {}),
     62         refinement_options=self.config.get('refinement', {}),
     63     )
     64     return ret

KeyError: ''

Any suggestions?
Many thanks!

@messileonardo
Copy link
Author

Some more details:

  • I scaled the ply point cloud in cloud compare
  • I reimported the point cloud in the same ply format

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant