Knowhow/Vision 30

Epipolar line visualization

여러 카메라 간 상대 자세가 정확한지 판별하는 방법 중 하나로 Epipolar line을 확인하는 방법이 있다. 카메라 자세들이 정확하다면 한 카메라 이미지에서 특징점 하나를 찍었을 때 다른 카메라 이미지에서 그려지는 epipolar line은 같은 특징점을 지나가야 한다. 예를 들어 카메라 0번과 1번를 고려할 때, 카메라 0번 이미지에서 서랍 모서리를 찍었다면 카메라 1번 이미지에 그려지는 epipolar line은 같은 서랍 모서리 위를 지나가야 한다. 이 방법은 카메라 자세 정확성을 평가할 GT가 없을 때 정성적으로 평가할 수 있는 방법 중 가장 직관적이고 정확하다. 이 글에서는 위와 같은 목적으로 epipolar line을 그려보고 싶을 때 활용할 수 있는 Visualizer 코드를 기록해두고자..

Knowhow/Vision 2023.03.24

Open3d manual registration (손으로 point cloud 정합하기)

Point cloud 여러개를 ICP를 이용해 registration(정합)하는 일은 생각보다 빈번하게 발생하는데, 이 때 초기 transformation을 제대로 정해주지 않으면 정합이 이상하게 된다. 특히 정합 대상인 두 point cloud가 noise point를 많이 갖고 있을수록 초기화가 어렵고 정합 성능도 떨어진다. 이럴 때 정합 성능을 높일 방법으로 RANSAC 같이 trial-and-error 접근을 할수도 있지만 경험적으로 보았을 때는 수가 많지 않다면 그냥 손으로 기준점을 잡아주는 것이 최고였다. 다른 말로, 사람이 직접 손으로 correspondence 몇 개를 잡아주고 이를 바탕으로 초기 transformation을 계산하여 사용하는 것이다. http://www.open3d.org..

Knowhow/Vision 2023.03.20

Open3d RGB/Depth image rendering 2

2022.07.01 - [Knowhow] - Open3d RGB/Depth image rendering 에서 기록한 코드와 크게 다른 것은 없으나 intrinsic, camera pose를 미리 알고 있을 때가 아니라, 그저 Open3d visualizer 상에서 손(drag)으로 돌려가며 구도를 잡은 뒤 해당 구도로 이미지를 rendering하고 싶을 때가 많길래 추가 정리한다. 다시 말하면, 구체적인 카메라 파라미터는 필요없고 대충 open3d GUI에서 손으로 구도 잡은 뒤, 그 구도의 RGB/Depth를 얻을 때 자주 썼다. 먼저 이 코드는 준비물이 필요한데, 일단 o3d.visualization.draw_geometries()를 이용해 먼저 visualizer를 켠다. 그리고 원하는 구도로 마우..

Knowhow/Vision 2023.03.20

Stereo image rectification

Stereo camera setting을 다룰 때 기본이 되는 것은 이미지의 rectification이다. 같은 기종의 카메라를 쓰더라도 intrinsic parameter가 조금씩 다르고, 정확히 조립해도 extrinsic parameter (특히 rotation)가 다르기 때문에 필수적으로 해야한다. 단순해보이지만 homography와 3d translation을 고려해야 하고 이미지 warping이 포함되기 때문에 직접 구현하는데는 번거로움이 많아 OpenCV의 함수를 활용하는 것이 일반적이다. OpenCV document를 보면 그만이라고 할 수 있지만 따로 적어 기록해두는 이유는 rectification된 이미지를 얻기까지 3개의 함수를 조합해야 하는데 매번 3개의 document를 보는 것이 ..

Knowhow/Vision 2023.03.16

Axis angle(Rodrigues notation) to Rotation matrix

Rotation을 표기하는 기법 중 axis-angle, quaternion, matrix 등 여러 형태가 존재하는데 여기서 axis-angle 표현법에서 Rotation matrix로 변환하는 코드다. scipy.spatial.transform 내 Rotation를 이용해 Rotation.from_rotvec(axis_angle_xyz).as_matrix()를 써도 되지만 간혹 축 2개만 쓰거나 하는 경우도 있어 내부 계산 순서를 기억해둘 겸 함수로 만들어 두었다. axis-angle은 x, y, z 순서로 적혀있지만 이를 rotation matrix로 조합할 때는 z y x 순서로 조합해야 한다. 행렬 연산 순서를 생각하면 같은 순서라고 할 수도 있다. (Rodrigues formula 참고) def..

Knowhow/Vision 2023.03.15

Disparity generation

자주 쓰진 않겠지만 depth로부터 disparity 데이터를 만들어두는 방법을 정리해두면 좋을 것 같아 이 글을 적게 되었다. 매번 수식 까먹고 검색하는게 귀찮다. 시뮬레이션 데이터든, realsense로 직접 취득한 데이터든 stereo setting에서 이미지와 depth를 얻는 것은 쉽지만 disparity를 얻는 것은 까다롭다. 단순히 focal length와 baseline 길이를 이용해 변환하는 것으로 끝맺을 수 있지만 left disparity와 right disparity를 맞추는 작업을 안하면 left-to-right, right-to-left warping 시 안 맞을 수 있다. 따라서 cross check를 꼭 해줘야 한다. def convert(depth, f, b): disp =..

Knowhow/Vision 2023.03.08

Tensorboard를 이용한 pb 파일 시각화

종종 사전 학습된 딥러닝 모델을 불러와서 사용할 때 ckpt, pb, pth, pbtxt 등 다양한 확장자명을 볼 수 있는데 이중 .pb 확장자를 갖는 모델에 대한 글이다. .pb 파일이란? pb는 protocol buffer를 줄인 말로 protobuf라고도 부른다. 깊게 알 필요없이 pb는 데이터를 serialize하는 방식 중 하나인데 간단히 binary로 바꿔서 통신에 유리하도록 하는 방법이라고 보면 되겠다. 하나 기억해야 될 것은 serialize한 데이터의 구조도 같이 저장한다는 것이다. 위키피디아의 말을 빌리면 다음과 같이 설명하고 있다. Protocol Buffers (Protobuf) is a method of serializing structured data. It is useful i..

Knowhow/Vision 2023.02.03

Basalt 사용, tag 규격 정하기, 이미지로부터 rosbag 파일 만들기

2022.12.07 - [Knowhow] - Fisheye camera model(KB, UCM, DS 모델) Fisheye camera model(KB, UCM, DS 모델) Introduction fisheye 카메라는 일반적으로 광각을 넘어서 180도 이상을 촬영하는 경우까지 포함하기 때문에 직관적으로 이해하기가 어렵다. 이미지 sensor는 앞을 보고 있는 평면이기 때문에 물리적으 jseobyun.tistory.com 위 글에서 소개한 3가지 모델을 적용하여 직접 광각 카메라의 캘리브레이션을 수행하고자 할 때 Basalt-mirror 라는 소프트웨어를 사용하면 손 쉽게 할 수 있다. 이전 글의 말미에서 DS 모델을 적용하고자 할 때만 추천을 했지만 코드를 뜯어보니 camera_type을 "kb4"..

Knowhow/Vision 2023.01.19

Theseus tutorial : simple pose estimation

NeuraIPS2022, facebookresearch에서 Theseus 라는 이름으로 differentiable non-linear optimization library를 공개했다. 프로젝트 페이지의 링크는 다음과 같다. https://sites.google.com/view/theseus-ai/ Theseus Theseus is an efficient application-agnostic library for building custom nonlinear optimization layers in PyTorch to support constructing various problems in robotics and vision as end-to-end differentiable architectures. S..

Knowhow/Vision 2022.11.24

COLMAP[CLI] SfM/MVS with known camera parameters and poses

2022.07.07 - [Knowhow] - COLMAP[GUI] multi-camera setting 글에서 간접적으로 알 수 있듯이, COLMAP을 사용할 때 미리 알고 있는 카메라 파라미터가 있을 때, SfM 및 MVS의 최적화 과정에서 해당 파라미터를 제외할 수 있다. 앞선 글이 카메라 intrinsic parameter를 알고 있을 때 어떻게 반영하는지 포함했다면, 이 글에서는 카메라 intrinsic parameter와 더불어 카메라 자세까지 주어졌을 때 이를 어떻게 반영하는지 정리하고자 한다. 하나 참고할 점은, GUI를 사용하지 않고 CLI로 사용하는 방법을 정리한다. 왜냐하면, 카메라 파라미터 중 intrinsic parameters를 알고 있는 경우, 카메라는 보통 수 대에 그치기 때문..

Knowhow/Vision 2022.07.14