전체 글 496

Eigen 형변환 :Quaterniond, Vector3d to Matrix4d

Eigen을 활용해서 구현을 자주 하는데 그 때마다 quaternion과 translation을 표현하는 변수 타입이 섞이는 일이 많다. Vector4d가 편할 때, Quaterniond가 편할 때, Matrix4d가 편할 때가 각각 달라서 하나로 통일하긴 뭐하고 매번 서로 변환해가면서 쓴다. 같은 함순데 매번 새로 구현하는 것이 귀찮아서 이곳에 기록해둔다. 그냥 값을 일일이 복붙하는 식으로 구현해도 되지만 뒤에 ceres solver라도 붙이려고 한다면 메모리 주소가 공유돼서 연결되어 있어야 하므로 다음과 같이 구현하는 것이 좋더라. void qt2mat(Eigen::Quaterniond q, Eigen::Vector3d t, Eigen::Matrix4d& mat){ mat.block(0,0) = q...

Eigen Vector4d와 Quanterniond, 그리고 Ceres EigenQuaterniondParameterization()

Ceres를 이용하여 최적화 코드를 구현할 때 Eigen을 많이 활용한다. 특히 최적화 대상에 보통 rotation이 포함되는 경우가 많아서 Quaternion을 표기하는 과정에서 Eigen::Vector4d, Eigen::Quaterniond를 많이들 사용한다. 하지만 주의할 점이 있어 기록해두고자 한다. 그 내용은 각각 어떤 convention을 따르느냐는 것이다. 다시 말해 (w,x,y,z) 순서인지, (x,y,z,w) 순서인지 말이다. Eigen::Vector4dEigen::Vector4d는 (x,y,z,w) 순서를 사용한다. Hamilton convention으로 알려진 (w,x,y,z)이 아니다. argument 순서와 내부 데이터 저장 순서 동일하게 전부 (x,y,z,w) 순서를 사용한다. ..

Double sphere 모델 projection-failed region

광각 카메라 모델 중 double sphere 모델을 보면 수식 상 다음과 같이 projection이 실패하는 조건이 있다. 여기서 저 수식 (43)이 의미하는 범위가 대충 지금 광각 카메라가 표현할 수 있는 화각 범위 밖이라는 느낌은 오는데 정확히 어떤 형태인지가 궁금했다. 내가 캘리브레이션했었던 double sphere 모델 주변에 point를 채우고 수식(43) 조건에 필터링되는 point만 남기면 다음 그림과 같다.예상했던 것과 같이 카메라 뒤로 원뿔 형태로 퍼지는 영역이 잡힌다. 광각 이미지가 동심원을 그리듯 표현되어 있고 렌즈도 원이기 때문에 projection-failed 영역은 원뿔 모양이었다. invalid projection 을 그냥 무시하고 구현을 해왔었는데 영역을 보니... 무조건 ..

Knowhow/Vision 2024.02.28

Fisheye 카메라 모델도 solvePnP 이용해서 자세 초기화/추정하는 방법

카메라 자세를 초기화할 때 가장 많이 쓰이는 방법이 PnP를 사용하는 것이다. 이미 알고 있는 3D point set과 이미지에서 검출한 2D point set이 있을 경우, 수학적으로 자세를 아주 간단하게 구할 수 있고 심지어 opencv 함수로 구현되어 있기 때문에 단 한 줄이면 카메라 자세 값을 계산할 수 있다. 하지만 카메라가 광각 카메라여서 pinhole model로 표현이 안될 경우에는 이러한 접근이 어렵다. PnP 알고리즘은 3D point와 2D point 간의 관계가 서로 linear projection일 경우를 가정하기 때문이다. 다른 말로 표현하면 빛이 직진해서 바로 이미지로 맺혔을 경우에만 적용이 가능하다. 반면 광각 카메라 (특히 180도가 넘어가는) 의 경우, 2D point와 ..

Knowhow/Vision 2024.02.28

Opencv cornerSubPix empty array 문제

cv2.error: OpenCV(4.7.0) /io/opencv/modules/imgproc/src/cornersubpix.cpp:58: error: (-215:Assertion failed) count >= 0 in function 'cornerSubPix' 2D feature point 위치를 보정하기 위해서 주로 쓰는 cv2.cornerSubPix() 함수 사용 중 위 오류를 자주 볼 수 있다. 오류명만 보면 입력으로 들어가는 2d point가 empty array라는 뜻으로 보이는데, 그 경우가 아니어도 위 오류가 날 수 있다. # points : np.float64 cv2.cornerSubPix(gray, points, (5, 5), (-1, -1), subpix_criteria) # fail ..

Trouble/Vision 2024.02.27

Python OpenCV solvePnP 이유 모를 type error

OpenCV solvePnP 함수는 자세 초기화할 때 자주 쓰는 함수로 매우 익숙하다. 주요 주의사항으로는 입력값 3d point (object point), 2d point (image point), mtx(intrinsic matrix), distortion coefficient 들이 float이나 double 형을 유지해야 한다는 점이다. (float, double 섞여도 되지만 권장하진 않음.) python이라면 np.float32이나 np.float64로 통일해서 사용해야 한다. 그렇지 않으면 다음 에러를 만날 수 있다. cv2.error: OpenCV(4.7.0) /io/opencv/modules/calib3d/src/solvepnp.cpp:838: error: (-215:Assertion f..

Trouble/Vision 2024.02.22

시작의 기술

읽게 된 계기 밀리의 서재에서 새 책을 뒤지던 중, 눈에 익은 제목이 보여서 골랐다. 자기계발서 냄새가 짙은 제목이어서 어느 정도 예상이 되는 내용이려니 싶었고 그렇게 기대는 하지 않았던 것 같다. 짧은 평 오랜만에 자기계발서를 읽으면서 감명을 받았다고 해야 하나 위로를 받았다고 해야 하나. 사실 특별한 내용을 알게 돼서 감명을 받은 것은 아니니 위로나 응원을 받았다고 하는 것이 맞겠다. 저자의 말투가 우쭈쭈, 괜찮아요 하는 말투가 아니고 단언 하듯이 강하고 명료하게 말하는 말투다 보니 불편할 수도 있다고 서두에 적혀있는데 오히려 그런 말투가 더 응원받는 느낌을 주어서 개인적으로 좋았다. 자기 파멸적 독백을 해본 자들에게 추천하는 책이라고 하는데, 요즘 내가 스트레스와 불안을 많이 겪고 무기력과 우울감도..

Book/Motivation 2024.02.18

Drivable 3D Gaussian Avatars

내 맘대로 Introduction 이 논문은 3d scan 내지 mesh가 주어졌을 때 3d gaussian과 엮어서 avatar로 만드는 방법을 적는다. 그냥 scan to animatable avatar로 가도 되지만 novelty가 떨어져 realistic rendering을 같이 가져간다는 컨셉으로 3d gaussian을 추가한 것 같다. 핵심 아이디어는 scan 내지 mesh를 tetrahedron으로 쪼개고, 그 안에 3d gaussian을 가두는 것이다. tetrahedron을 변형할 경우, barycentric coordinate로 표현된 내부 3d gs들이 따라움직일 것이므로, deformed avatar rendering이 자동으로 따라온다는 내용이다. 자잘하게 skeleton, fac..

Paper/Human 2024.02.18

Mesh-based Gaussian Splatting for Real-time Large-scale Deformation

내 맘대로 Introduction 요즘 부쩍 mesh랑 3d gaussian을 엮으려는 시도가 많은 것 같다. 3d gaussian splatting이 기존 graphics tool에 그냥 갖다붙이기가 가능한 형태인 만큼 mesh랑 엮어서 세트로 가져갈 수 있게 하려는 것 같다. 이 논문은 3d gaussian들을 mesh face에 구속한 형태로 splatting해서 mesh deformation이 gaussian deformation을 직접 결정하게 하는 논문이다. mesh deformation은 control point를 이용하는 방법이든 손으로 하든 명확히 정의가 되어있으므로, 여기에 얹기만 하면 3d gaussian도 자연스럽게 deformation이 가능해진다는 논리다. 핵심 아이디어는 3d ..