COLMAP은 워낙 유명해서 3D vision한다고 하면 한 번쯤은 들어봤을 것이다.
링크(https://colmap.github.io/index.html) 에서 소개하는 바와 같이 SfM과 MVS를 손쉽게 돌릴 수 있도록 도와주는 tool 혹은 코드라고 생각하면 된다.
설치가 복잡했으나, 최근에는 그냥 sudo apt install colmap 명령어 한 번으로 설치할 수 있고 튜토리얼 또한 잘 정리되어 있어서 사용성도 매우 뛰어난 장점이 있다. (단, 이렇게 깔면 CUDA를 사용하는 기능에서는 제한적임)
이 글에서는 튜토리얼에서 나오지 않지만, 꽤나 자주 벌어지는 상황이어서 매번 찾기 귀찮은 multi-camera setting에서의 colmap 사용법을 정리하고자 한다.
튜토리얼은 single-view camera 하나를 들고 쭉~ 촬영한 경우를 상정하기 때문에 camera parameter를 하나만 다루고 있다.
하지만 3D vision을 주제로 무언가를 할 때, 카메라가 한 대인 상황은 거의 드물고 최소 2대 이상을 사용하기 때문에 카메라가 N대인 상황을 colmap에 반영시켜야 할 때가 자주 있다.
알고 보면 단순하게 설정 몇 번으로 변경할 수 있는 것이지만, 모르는 상황에서는 검색 키워드도 애매하고 잘 나오지도 않아서 직접 정리한다.
Method
1. 데이터 준비
데이터는 multi camera로부터 찍은 각각의 이미지셋이고 intrinsic parameter는 선택적으로 준비하면 된다.
이미지 데이터 구조는 다음과 같다.
+── images
│ +── cam0
│ │ +── 000.jpg
│ │ +── 001.jpg
│ │ +── ...
│ +── cam1
│ │ +── 000.jpg
│ │ +── 001.jpg
│ │ +── ...
│ +── ...
single camera였다면 images 하위에 모든 이미지가 전부 들어있겠지만 multi camera일 경우, 카메라 별로 폴더를 나누어 분리해둔다.
그리고 GUI를 켠 뒤, (일단 GUI를 사용한다는 가정으로 시작한다. 직접 코드로 작성하는 경우는... 직접 하기 바람...ㅎ)
colmap gui
File > New Project 클릭 후, Database 에는 colmap에서 나오는 정보를 저장할 용도로 database.db라는 파일을 만들 경로를 입력하고, Images 에는 위 데이터 구조대로 정리한 images (최상위폴더)를 입력한다.
2. Feature extraction & matching
Processing > Feature extraction 클릭 후, 카메라 모델을 지정한다. (나는 opencv를 많이 써서 opencv 모델이 좋음)
그리고, Shared per sub-folder 꼭 체크한다. 하위 폴더 별로 카메라를 공유하도록 한다는 설정으로 카메라 별로 이미지 폴더를 구분을 해놓았기 때문에 원하는 개수의 카메라를 두는 모양이 된다.
Extract 클릭 후, Processing > Feature matching > run 클릭까지 한다.
3. Reconstruction
intrinsic parameter를 모르는 상황이라면, 그냥 Reconstruction > Start reconstruction 누르면 끝이다.
그러면 최적화 파라미터로 intrinsic parameter N대 분량이 포함되어 3D point와 camera pose, 그리고 intrinsic parameters가 같이 나온다.
하지만 실제 취득한 데이터를 사용할 경우, intrinsic parameter를 미리 알고 있을 상황이 많은데 알고 있는 값을 굳이 최적화 과정에 포함시킬 필요도 없을 뿐더러 오히려 정확성이 떨어질 수 있는 원인이 되기 때문에 intrinsic parameter는 최적화 과정에서 제외시켜야할 때가 많다.
그 때는 Processing > Database management > Cameras 에서 미리 알고 있는 intrinsic paramter를 기록한 뒤, Reconstruction > Reconstruction options > Bundle 에서 refine_focal_length, refine_principal_point, refine_extra_params를 체크 해제하고 사용하면 된다.
그러면 실시간 시각화 결과와 함께 복원이 끝나게 된다. 저장은, File > Export all models 누르면 끝.
Tips
하다보면 위 과정으로 한 방에 끝나면 좋겠지만, 이미지에서 feature가 충분하지 않을 경우, reconstruction 단계에서 초기화를 못하면서 결국 실패하는 경우가 종종 있다. (특히, textureless object나 scene을 다룰 때)
이 때는 Reconstruction > Reconstruction options에서 다음 항목을 수정해보면 좋다.
첫 번째는, Init > init_num_inliers 수를 낮추는 것이다.
matching된 feature 개수가 일정 개수 이하면 최적화 과정에서 제외되는데 그 기준 개수를 낮춰주는 것으로, 더 많은 샘플들이 참여할 수 있도록 해준다.
복원 결과가 조금 noisy해질 순 있으나 어느 정도 도움이 될 수 있다.
두 번째는, Registration > abs_pose_min_num_inliers 수를 낮추는 것이다.
초기화가 끝난 후 다음 이미지를 점점 쌓아갈 때, 기존에 초기화한 3D point 및 카메라들과 일정 개수 이상으로 일치해야 최적화 과정에 포함시키는데 그 기준 개수를 낮춰주는 것이다.
이 역시 복원 결과가 조금 noisy해질 순 있으나 어느 정도 도움이 될 수 있다.
아주 간단하다. 끝!
Note
python에서 COLMAP을 사용하고 싶다면 다음 글 참고.
2023.12.07 - [Knowhow] - COLMAP[python] pycolmap 보다 편하게 colmap 사용하기
'Knowhow > Vision' 카테고리의 다른 글
COLMAP write txt files in python (0) | 2022.07.13 |
---|---|
COLMAP read bin/txt/ db files in python (0) | 2022.07.13 |
Open3d RGB/Depth image rendering (0) | 2022.07.01 |
Obj file의 manifold/non-manifold 구분 (0) | 2022.06.30 |
3D mesh voxelization (0) | 2022.06.17 |