Open3D의 visualizer를 활용해서 렌더링을 하고자 할 때 겪는 대표적 문제가 intrinsic parameter가 맘대로 설정이 안된다는 점이다. 이전 글의 말미에서 적어두긴 했지만 또 다른 원인이 있기도 하고 더 정확히 하기 위해 기록을 해둔다.
1. Open3D는 Visualizer 윈도우 크기의 영향을 받는다.
- 정확한 원인까지는 모르겠다.
- Open3D visualizer를 이용해서 capture_screen_float_buffer 혹은 capture_depth_float_buffer로 렌더링을 한다고 했을 때, visualizer를 띄워두는 윈도우가 생각보다 중요하다.
- 윈도우의 사이즈가 기본값이 1920x1080으로 설정되어 있는데, 이보다 높이고자 할 때 제대로 렌더링이 되지 않는 경우가 있다.
- 최대 윈도우 사이즈가 몇인지는 모르겠으나 1920 이상으로 높였을 때 잘 안된다. 이거보다 작아야 한다.
2. allow_arbitrary=True로 설정한다고 해서 principal point가 정확히 반영이 안된다.
- allow_arbitrary=False 상태이면, 현재 visualizer 크기의 절반 값이 principal point 위치가 아닐 경우 에러가 난다. 이를 해결하기 위해 allow_arbitrary=True로 두는게 일반적이다.
- 하지만 allow_arbitrary=True로 둔다고 해서 임의의 cx,cy가 정확히 반영되지 않는다.
- 렌더링 결과물의 해상도만 임의의 해상도로 바뀔 뿐, cx,cy는 여전히 visualizer 크기의 절반값이 들어가있다.
- 따라서 warp affine tranform으로 보정해주고 사용하는게 맞다.
M = np.float64([[1, 0, 0], [0, 1, 0]])
M[0, 2] = K[0,2] - (self.w - 1) / 2
M[1, 2] = K[1,2] - (self.h - 1) / 2
depth_rn = cv2.warpAffine(depth_rn, M, (img_w, img_h), flags=cv2.INTER_NEAREST)
rgb_rn = cv2.warpAffine(rgb_rn, M, (img_w, img_h), flags=cv2.INTER_NEAREST)
**이건 버전 이슈가 있는 내용인 것 같기도 한데, 결과물로 double check하고 사용하는게 맞다.
'Trouble > Vision' 카테고리의 다른 글
pymeshlab decimation 안되는 버그 (0) | 2024.09.11 |
---|---|
Trimesh load_mesh, export 시 texture 제대로 안 읽히고 저장 안될 때 (0) | 2024.09.02 |
Open3d mesh wrong vertex count, face order (Open3d mesh 제멋대로 읽혀질 때) (0) | 2024.08.07 |
Open3D OBJ texture 안 보일 때, enable_post_processing=True로 해결 안 될 때, texture가 검정색으로 뜰 때 확인 사항 (0) | 2024.07.09 |
Opencv cornerSubPix empty array 문제 (0) | 2024.02.27 |