Trouble/Vision

Open3D rendering 시 이미지 중심/principal point 안 맞는 문제

침닦는수건 2024. 11. 5. 11:21
반응형

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하고 사용하는게 맞다.

반응형