RSS

Category Archives: Augmented Reality

Intrinsic camera parameters for resized images set of a chessboard

I realized that it is more convenient to resize (downsize) the input camera image to the small standard size (in my case 320 x 240) instead of change parameters accordingly to each camera image size every time.  That is, the original large image and its intrinsic parameters are just used  for displaying the rendered scene of augmented reality and all the processing behind is done with the resized image and the corresponding intrinsic parameters.

Basically, intrinsic camera parameters are needed for calculating the projection of 3D point on to the image plane.  Such projection appears to be important part in visual SLAM as predicting observation of 3D landmarks for current frame based on the camera pose and 3D map estimation of the previous frame.

So for getting the resized image, all that I have to do is to use cv::resize() function of OpenCV.  For the corresponding intrinsic parameters, I have to do something.  I have to create the intrinsic parameters of virtual camera from a physically existing and calibrated camera.

Intuitively, among intrinsic parameters, the focal length and principal point of the resized image can be calculated by just scaling as resizing ratio.  For example, if the original camera image is 1280 x 960 and resized image is 320 x 240, the ratio is 1/4 and the focal length and principal point is scaled so.

What about distortion factors? Should I scale them as the focal length and principal point?  I posted the following question on the visual slam community board in Google plus and  José Jerónimo Moreira Rodrigues gave me an answer saying “distortion factors remain the same due to their definitions”.  Thanks Rodrigues.

My question :

Let’s say I have chessboard images of size w(width) and h(height). (Notice that w and h are not the actual size of the chessboard but that of the images of chessboard.)
After (Zhang’s) camera calibration, the resulted intrinsic camera parameters are fx(focal length x), fy(focal length y), cx(principal point x), cy(principal point y), k1(1st distortion factor), k2(2nd distortion factor), k3(3rd distortion factor), k4(4th distortion factor), k5(5th distortion factor).
If I resize the chessboard images by half so that the width and height of the resized images are w/2 and h/2 respectively and conduct camera calibration again, I would expect to theoretically get fx/2 ,fy/2, cx/2 and cy/2 as focal length x, focal length y, principal point x and principal point y respectively.
How about distortion factors ? What would I expect to get theoretically the 1st, 2nd, 3rd, 4th and 5th distortion factors of the resized chessboard images in terms of k1, k2, k3, k4 and k5 ?

Rodrigues :

They dont change. They are function of X/Z and Y/Z. Checkhttp://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html. Only the intrinsic matrix changes, not the distortion coefficients.

 

The experiment using Camera calibration toolbox for Matlab with chessboard images in the OpenCV example folder also shows the distortion factors do NOT change.
I did the experiment by making two (1280 x 960 and 320 x 240) sets of images from the original chessboard images (640×480) in OpenCV example folder.    The result is

1280 x 960 (double)
Focal Length:          fc = [ 1074.34831   1073.83567 ]
Principal point:       cc = [ 653.70628   499.16838 ]
Distortion:            kc = [ -0.28805   0.10555   -0.00083   0.00033  0.00000 ] 640 x 480 (original)
Focal Length:          fc = [ 536.93593   536.52653 ]
Principal point:       cc = [ 326.87081   249.24606 ]
Distortion:            kc = [ -0.28990   0.10780   -0.00079   0.00017  0.00000 ]
320 x 240 (half)
Focal Length:          fc = [ 268.65196   268.42076 ]
Principal point:       cc = [ 162.95051   124.58663 ]
Distortion:            kc = [ -0.29024   0.10502   -0.00072   -0.00004  0.00000 ]

chessboards

Advertisements
 
 
Video

Google I/O 2014 – A 3D tablet, an OSCAR, and a little cash. Tango, Spotlight, Ara. ATAP. – YouTube

 

 
 

[review] Real-Time SLAM Relocalisation

발표 : ICCV 2007

제목 : Real-Time SLAM Relocalisation

저자 : Brian Williams, Georg Klein and Ian Reid

소속 : University of Oxford, UK

페이퍼 : http://www.robots.ox.ac.uk/~lav/Papers/williams_etal_iccv2007/williams_etal_iccv2007.pdf

동영상 : http://www.youtube.com/watch?v=uXqDA4do_s0

Metaio SDK가 가진 feature들 중에 instant 3D tracking 이라는게 있는데, 이 거는 스마트폰으로 어떤 장소나 환경을 동영상 촬영(?)하면서 3D point cloud를 학습하고, 이 학습된 3D map을 가지고 있으면 나중에 다른 기기(pc or other smart phone)로 해당 장소를 비췄을 때, 인식을 하여 증강시키는 것이다.  Metaio는 이 기술에 대해 공식적으로 밝힌 바(그냥 “slam”이라고만 했음)는 없지만 내가 예상하기에 지금 이 논문을 기반으로 만들지 않았을까 한다.  Relocalization은 slam을 하는 도중에 추적에 실패 했을 때, 다시 복귀 (failure recovery)하는 기능이다.  Instant 3D tracking과 비교해 보면, 3D map을 학습하는 단계는 slam을 성공적으로 수행하는 단계이고, 나중에 다른 기기로 해당 장소를 비춰서 인식하는 단계는 복귀하는 단계로 볼 수 있는 것이다.  다른 점은 Relocalization은 실제로 추적에 실패하는 경우이고, Instant 3D tracking은 추적에 실패했다고 가정하는 것이다.

이 논문에서는 relocalization을 하는 방법으로 ([1]에 기반한) randomized list classifier를 쓰고 있다.  중요한 건 randomized list classifier가 2D feature descriptor임에도 불구하고, 3D relocalization에 쓰였는데 이에 대한 defense가 없다는 것이다.  random fern 학습 시에 여러 affine transform들을 시켜서 학습하므로 이것으로 3D view point 변화를 커버할 수 있다고 생각했나 보다.  그러면 3D point에 대해 처음 random fern 학습시킬 때의 point of view랑 비슷한 view로 가져가야지만 그 point에 대해 relocalization이 될 텐데, 이는 relocalization 할 때도 임의의 view point가 아니라 더 선호되는 view point가 있다는 말이 된다.  따라서 실제적으로는 잘 될지 모르겠지만, 이론적으로는 좀 한계가 있어 보인다.

Fua와 Lepetit이 만든 random fern을 본 논문의 목적인 real-time slam에 맞게, 즉 online learning에 맞게 어떻게 modify시켰는지에 대해 역점을 둬서 기술하고 있다.  ICCV 논문으로서는 좀 부족한 듯 싶다.  변형된 부분(modification)은 다음과 같다.

  • 원래 random fern은 tree의 각 노드마다에서 이루어지는 두 점의 intensity 대소 비교시, 그 두 점의 위치가 각 노드마다 다 다르다.  즉 depth 3개 짜리면 7개(2^3 -1)의 노드(test)가 생성되는데 그 test들에 사용되는 두 점의 위치가 다 다르며, 어떻게 하는 지는 모르겠지만 information gain을 최대화 하기 위해 어떤 최적화 과정을 거쳐서 정해진다고 한다.  하지만 online 학습인 slam의 경우에는(즉 어떤 환경을 맞닥드릴지 모르는 경우에는) 이런 특정 경우에 맞는 최적화가 의미가 없어지며, 그냥 random하게 정하는게 올바른 판단이라고 한다.  Random하게 한다면 굳이 같은 level의 node들의 test가 달라야 할 필요가 있냐 하는 의문을 던지고 있다.  즉 첫번째 level에서 intensity 비교를 통해 왼쪽과 오른쪽으로 나뉠 텐데, 여기서 다시 왼쪽과 오른쪽의 node에서의 test가 서로 다른 두 점에서 이루어 질 필요가 있냐 하는 것이다.  Random이면 굳이 random을 두 번 튕길 필요가 없다는 것이다.  그냥 random을 한 번 튕기면 되고, 그 random도 프로그램 돌기 점에 미리 튕겨 놓으면 된다는 것이다.  일단 준비해야 하는 test의 수는 L레벨에 대해 2^L – 1에서 L로 줄어든다.
  • 무슨 말인지 잘은 모르겠는데, classifier간에 independence를 가정한다고 한다.  [1]의 경우 학습 단계에서 random fern이 normalizaton을 통해 확률이 되어서 유사한 feature의 classifier들끼리 서로 간의 확률을 낮추는데, 여기서는 independent하게 해줘서 서로 간에 영향을 안미친다고 한다 (뭔소린지 모르겠다).
  • Random fern이 확률 분포를 가지고 있는게 아니라, 그냥 binary 값을 가지고 있다고 한다.  그러니까 0은 0, non-zero는 1.  이로서 메모리 사이즈 줄이고…. 확률로 안간다고 하는 건, 앞서 언급한 꼭지와 관련이 있어 보인다.
  • texture less한 영역에 대해 두 점의 대소비교를 할 때, 약간의 노이즈가 껴도 (원래는 두 점이 같은 값이 나와야 되는데) 대소 비교에 영향을 미친다.  따라서 단순한 대소비교가 아니라 어느 정도 차이가 나는지를 따진다.
  • 앞 꼭지와 일맥상통한 얘긴데, [1]에서는 학습시 여러 patch를 만들 때, noise에 강건하라고 일부로 noise를 심어 주는데, 여기서는 굳이 noise까지 심어 주진 않고, 대신 어떤 노드에서 대소비교시 별로 차이가 안나면 양 쪽 자식을 다 타주는 것이다.  이로서 프로그램 적으로 noise를 가상으로 심어주는 역할을 한다. (아이디어 괜찮다.)

실제 rolocalization 할 때는, 트랙킹 실패 후 카메라 feed image에 대해 RANSAC으로 여러 feature correspondence hypotheses에서 가장 좋은 hypotheses의 model을 선택한다고 한다.  그리고 random walk를 적용해 시간이 지남에 따라 search 영역을 점점 증가시키고, 해당 시간에 절대 도달할 수 없는 위치의 feature는 random fern에서 좋은 결과가 나왔다고 해도 무시한다고 한다.  근데 문제는 hypothesis를 3개의 점을 가지고 한다고 한다.  3점가지고 되나?  어떻게?  5점은 있어야 되지 않나?

이 논문의 전신인 [2]를 보면 3-point 알고리듬을 쓰고 있고 이 이유에 대해 다시 [3]을 reference로 들고 있는데 이유를 잘 모르겠다.  3 correspondence로는 unique한 하나의 hypothesis가 아니라 4개의 hypothesis가 나오는데, 논문에 보면 그 4개의 가정에 대해 다 RANSAC test를 해 준다고 한다. 그런데 이 게 5개의 점을 가지고 unique한 1개의 가정을 만드는 거 보다 RANSAC에 있어서 만들어 줘야 하는 hypotheses 수가 오히려 더 많다.

위 식은 하나의 hypothesis model을 만들기 위해 n개의 점이 필요하고, inlier rate가 \omega일 때, 확률 p의 confidence로 inlier들로만 이루어진 hypothesis를 한 번 도출하기 위해 필요한 hypotheses 발생 수k를 구하는 식이다. p = 0.95, \omega = 0.6 이라고 가정할 때, 3-point와 5-point의 경우를 비교해 보면 각각,

  • 3-point, 4 hypotheses
    k = 4\frac{\log (1 - 0.95)}{\log (1 - 0.6^3)} = 49
  • 5-point, 1 hypothesis
    k = \frac{\log (1 - 0.95)}{\log (1 - 0.6^5)} = 37

이런 식으로 5-point 알고리듬이 RANSAC iteration 수가 더 적게 나온다 (이렇게 계산하는게 옳지 않은가?).  암튼, 그럼에도 불구하고 3-point, 4 hypotheses를 쓰는 이유를 guess해 보면 5-point 알고리듬은 matrix 연산등의 계산량이 많은 반면, 3-point 알고리듬은 4차 다항식 문제이고, 적절한 근의 공식같은게 존재해서 바로 사칙연산으로 모델 파라미터가 나올 수 있어서이지 않을까한다(에이! 모르겠다).

[1] M. Ozuysal, P. Fua, and V. Lepetit. “Fast keypoint recognition in ten lines of code”. CVPR 2007

[2] Brian Williams, Paul Smith and Ian Reid. “Automatic Relocalisation for a Single-Camera Simultaneous Localisation and Mapping System”, ICRA 2007.

[3] R. M. Haralick, C. Lee, K. Ottenberg, and M. Nolle. “Review and analysis of solutions of the three point perspective problem”. IJCV 1994

 
 

[review] Inverse Depth Parametrization for Monocular SLAM

발표 : Transactions on Robotics, 2008

제목 : Inverse Depth Parametrization for Monocular SLAM

저자 : Javier Civera, Andrew J. Davison, and J. M. Mart´ınez Montiel

소속 : Universidad de Zaragoza, Spain. (A. Davison은 imperial college).

페이퍼 : http://webdiis.unizar.es/~jcivera/papers/civera_etal_tro08.pdf

동영상 : http://webdiis.unizar.es/~jcivera/videos/civera_tro08_indoors.avi

http://webdiis.unizar.es/~jcivera/videos/civera_tro08_outdoors.avi

http://webdiis.unizar.es/~jcivera/videos/civera_tro08_loop_closing.avi

http://webdiis.unizar.es/~jcivera/videos/civera_tro08_loop_closing_id2xyz_conversion.avi

소스코드 : http://webdiis.unizar.es/~jcivera/code/EKF_monoSLAM_1pRANSAC_1.01.zip

https://svn.openslam.org/data/svn/ekfmonoslam/

이전에 review 했던 논문 “1-Point RANSAC for EKF Filtering. Application to Real-Time Structure from Motion and Visual Odometry” 에 보면 SLAM에서 map point를 inverse depth로 표현했었다.  그래서 덩달아 이 논문도 보게 됬다.

제목 그대로 이 논문의 핵심은 inverse depth이다.  inverse depth를 쓰는 이유를 두 가지들 들어 설명하고 있다.

하나는 SLAM이 주로 실시간 application인 만큼, 새로운 3D point의 기존 map으로의 투입이 빨리 진행되야 한다는 것이다.  기존의 연구들은 3D point의 X, Y, Z 좌표가 어느 정도 확실해 질 때까지 기존 map에 넣지 않고 따로 처리했다고 한다.  그러니까, 그러한 new 3D point들의 카메라 포즈 estimation에 기여하는데 걸리는 시간이 오래 걸리고, 심지어는 영원히 기존 map으로 편입되지 못했다고 한다.

다른 하나는 (결국 비슷한 얘기인데), point at infinity(PAI)는 homogeneous coordinate 형태로 컴퓨터 비젼, 즉 offline Structure from Motion 에서도 아주 중요한 역할을 하는 단서인데, online SLAM에서는 아무런 역할을 못하고 있다는 것이다.  따라서 PAI를 제대로 표현할 방법이 필요하다는 것이다.

일반적인 3D 좌표 표현법을 XYZ 표현(3-vector)이라고 하면, inverse depth representation은 6-vector로서 XYZ representation과 아래와 같은 호환 관계가 있다.

Clipboard04

여기서 x_i, y_i, z_i, \rho_i는 아래 그림에 나타나 있고, \theta_i, \phi_i 는 단위 방향 vector \bf{m}을 결정하는 azimuth와 elevation이다.

Clipboard05

Inverse depth representation를 써야하는 이유에 대해서는 chapter IV의 시작에서 아래와 같은 문장으로 설명하고 있다.  맞는 말이긴 한데 아직 와닿지는 않는다.

The more linear the measurement equation is, the better a Kalman filter performs. This section is devoted to presenting an analysis of measurement equation linearity for both XYZ and inverse depth codings. These linearity analyses theoretically support the superiority of the inverse depth coding.

이에 대한 설명으로 아래 그림을 기준으로 얘기하고 있다.

Clipboard06

 

Kalman filter 특성 상, 모든 관계가 linear하다고 보는데, 첫 번째 view에서 3차원 점의 depth가 Gaussian 분포를 띄면, XYZ representation의 경우 그 분포가 두 번째 view에서 image에 맺힐 때 Gaussian 분포가 되지 않는다.  즉, Gaussian의 mean을 기준으로 perspective에 의해 카메라로 부터 멀리 있는 분포가 두 번째 카메라 view에서 좁은 영역에 맺히고, 가까이 있는 분포가 넓은 영역에 맺힌다.  따라서 (a)처럼 비대칭의 covariance가 나오게 되며, 이는 실제 Kalman filter에서 covariance matrix로 나타낼 수 있는 Gaussian distribution의 표현 역량을 넘어선다.  극단적으로 두 카메라가 서로 수직으로 바라보고 있다면(즉, wide baseline) 이러한 비 대칭성은 사라질 것이다.  하지만 inverse depth representation을 쓰면 Gaussian 분포를 띄는 것은 inverse depth인 \rho이고, depth에 대해서는 그림 (b)와 같이 비대칭 분포를 띈다.  이것이 두 번째 카메라 view의 measurement uncertainty로 전파될 때는 어느정도 대칭인 분포로 전파 된다는 것이다.  암튼 linearity는 있으면 좋은 것이여.

그 measurement uncertainty의 linearity를 수치화 보면, 아래와 같다.

Clipboard07

Clipboard08

 

L_d는 XYZ representation일 때, L_\rho는 inverse depth representation 일 때의 linearity이다.  L은 0 이상의 값이며, 0 일 때 완전히 linear, 값이 커지면 그 만큼 non-linear 해 짐을 나타낸다.  다른 변수들은 일단 제쳐 두고, 두 view 사이의 각도 \alpha만 보더라도 L_d의 경우 \alpha가 작아지면 값이 커지지만, L_\rho의 경우 \alpha가 작아짐에 따라 값이 작아진다.  즉, 아주 smooth하고 천천히 움직이는 camera motion의 경우 inverse depth representation을 쓰는게 해당 3D point의 measurement equation linearity 측면에서 이득을 본다.

하지만 inverse depth representation은 6차원 vector, XYZ representation은 3차원의 vector, 즉 2배 차이가 나고 covariance나 Jacobian matrix에서도 그 만큼 덩치가 커질 테니, 해당 점에 대해서, 어느 정도 wide baseline을 확보하게 되면 XYZ representation으로 바꾸는게 났다고 한다.  이것은 논문 나머지 부분에 나오나, 귀찮아서 오늘은 여기까지…

 
Link

http://www.doc.ic.ac.uk/~ahanda/VaFRIC/iclnuim.html

 
 
Link

head pose estimation

 

[term] signature

2014.05.21

Point matching을 위해서 local feature descriptor 쓸 때 자주 나오는 말인데, 그냥 그래 저래 넘어 갔었는데 좀 확실히 짚고 넘어가는게 좋겠다.

[1]에 의하면, signature는 histogram과 약간 대조되는 개념으로 얘기하고 있다.

In broad terms, signatures are potentially highly descriptive thanks to the use of spatially well localized information, whereas histograms trade-off descriptive power for robustness by compressing geometric structure into bins.

즉, histogram은 개별 (2D 또는 3D 위치)정보를 잃어버리는 대신 statistics를 생성함으로서 robustness와 invariance를 얻는 개념으로, signature는 histogram처럼 vector 형태를 띄지만 그것이 ordered된 vector로서 위치에 대한 topology를 어느 정도 보유하는 정보로 보고 있다.  근데 저자들이 ltaly 애들이라서 좀 신빙성이 안간다.  걔네나 나나 mother tongue이 영어가 아닌건 마찬가지 아닌가?  그냥 독자들 신경안쓰고, 지 꼴리는 데로 정의해버리고 들어 갈 수 있으므로, 영어를 모국어로 하는 애들이 쓴 논문을 보고 결정하겠다.  위 정의의 의하면, 그럼 SIFT나 SURF는 signature of histogram인가?  SIFT는 한 point를 기준으로 neighborhood에다가 (예를 들어) 3 by 3의 세부 지역으로 나누고, 각 지역마다 histogram(HOG)을 뽑아서 쭉(1행1열 – 1행2열 —– 3행3열) 늘어 놓는것이 아닌가?

[2]에 의하면, signature는 우리가 흔히 말하는 싸인, 즉 서명이다.  서명은 서명자의 신원을 알 수 있는 고유의 표식인 것이다.  즉 signature는 그것으로 부터 바로 무언가를 identify할 수 있다는 것이고, 동일한 signature는 존재하지 않는다는 것을 알 수 있다.

[3]에 의하면, signature를 “(누군지 알 수 있는) 특징”이라고 하고 있다.  그러니까 [2]와 종합해 보건데, signature는 우리가 흔히 얘기하는 feature(vector)인데, feature는 좋은 feature도 있을 수 있고, (변별력이 약해서 classification이나 recognition에 있어서 별로 기여를 못하는) 나쁜 feature도 있을 수 있는데, signature라고 얘기한다는 것은 이미 그것이 좋은 feature라고 가정하고 들어가는 느낌이다.  그리고 지금까지의 정의에 입각해서 얘기하자면, (예를들어) 서로 다른 물체 또는 대상에서 같은 feature가 나올 수는 있어도, 같은 signature는 나올 수 없어야 할 것이다.  그래야 “(누군지 알 수 있는) 특징”이 될 테니까.

Computer vision에서 signature가 꼭 지역적인 정보를 보존해야 하는지, 아니면 어떤 descriptor이건 간에 “(누군지 알 수 있는) 고유한 특징”만 되기만 하면 signature로 불러 줄 수 있는 것인지는 아직 확실치 않다.  지역적인 정보를 보존하지 않는데도 signature라고 불러 주는 반례를 발견하면 확실해 질 테지.

Signature가 geometric property를 보존하고 있어야 한다는 것을 말해주는 (아래의) 또 하나의 증거를 [4]에서 찾았음.  (얘네는 미국 애들이네. ㅋㅋ)

A surface signature at a given point on the surface of an object is a descriptor that encodes the geometric properties measured in a neighborhood of the point.

[5]는 2D local feature descriptor를 얘기하고 있는데, 여기서는 전혀 geometric property를 얘기하고 있지 않다.  여기서 signature는 그냥 기본 이미지 패치(vocabulary 에 해당)들로 학습된 random forest들에 임의의 이미지 패치를 넣었을 때 나오는 일종의 discrete probability distribution (각 vocabulary에 속할 확률)로 나타내고 있다.  음… signature가 geometric property를 보존해야 한다는 것은 3D 일 때만 한정된 것인가, 아니면 내가 무언가를 catch하지 못하고 있는 것인가… 그것도 아니면 Pascal Fua 애들이 꼴리는 데로 단어를 오용하고 있는 것인가 (얘네들도 mother tongue이 영어는 아니지 않은가)?

[6]에서는 signature를 완전히 다른 개념으로 얘기하고 있다.  그냥 sparse histogram을 간단하게 나타내기 위한 lossless representation으로(돗수가 0인 bin들은 그냥 언급 안하는) 나타내고 있다. 그렇다면 결국 histogram이 signature란 말이 아닌가?  얘네들도 스페인 애들이네.  지 꼴리는데로 정의하고 들어가는 느낌.

[6]과 [5]를 동시에 보면서 드는 지금 생각은 [5]에서 Fua 애들이 signature라고 말하고 있는 근원은, 이게 어느 정도의 discrete 확률분포를 나타내고 있고, discrete 확률분포라는 게 사실 normalized histogram 아니던가…  아 더 헤깔려졌다.  나도 그냥 막 내 꼴리는데로 정의하고 쓸까?  갑자기 signature랑 descriptor랑도 헤깔리네.

[1] Federico Tombari, Samuele Salti, and Luigi Di Stefano, “Unique Signatures of Histograms for Local Surface Description”, ECCV 2010

[2] http://en.wikipedia.org/wiki/Signature

[3] http://www.wordreference.com/enko/signature

[4] Salvador Ruiz-Correay, Linda G. Shapiroy and Marina Meil˘az, “A New Signature-Based Method for Efficient 3-D Object Recognition”, CVPR 2010

[5] Michael Calonder, Vincent Lepetit, Pascal Fua et.al “Compact Signatures for High-speed Interest Point Description and Matching”, ICCV 2009.

[6] Francesc Serratosa and Alberto Sanfeliu, “Signatures versus histograms: Definitions, distances and algorithms”, Pattern Recognition 2006.

 

 
Leave a comment

Posted by on May 21, 2014 in Augmented Reality, Terms