[영상 Geometry #7] Epipolar Geometry

영상처리 2013.07.24 09:26

(3D 비전 geometry 마지막 6번째 파트 epipolar geometry입니다)


6장 epipolar geometry를 마지막으로 '영상 geometry' 글을 마무리하고자 합니다.


6. Epipolar Geometry


Epipolar geometry는 스테레오 비전(stereo vision) 즉, 2-view 비전에서의 기하라고 생각하면 됩니다.


즉, Epipolar geometry는 동일한 사물 또는 장면에 대한 영상을 서로 다른 두 지점에서 획득했을 때, 영상 A와 영상 B의 매칭쌍들 사이의 기하학적 관계를 다루는 것입니다.


<그림 1>



6.1 용어 및 기본 개념


<그림 1>과 같이 3차원 공간상의 한 점 P가 영상 A에서는 p에 투영되고, 영상 B에서는 p'에 투영됐다고 하겠습니다. 이 때, 두 카메라 원점을 잇는 선과 이미지 평면이 만나는 점 e, e'을 epipole이라 부르고 투영점과 epipole을 잇는 직선 l, l'을 epiline (또는 epipolar line)이라 부릅니다. Epiline은 3차원의 점 P와 두 카메라 원점을 잇는 평면(epipolar plane)과 이미지 평면과의 교선으로도 볼 수 있습니다.


두 카메라 위치 사이의 기하학적 관계 [R|t]를 알고 있고 영상 A에서의 영상좌표 p를 알고 있을 때, 영상 B에서 대응되는 점 p'의 좌표를 구하는 문제를 생각해 보겠습니다. 이 때, 점 P까지의 거리(depth) 정보를 모른다면 영상좌표 p로부터 투영되기 전의 3차원 좌표 P를 복원할 수는 없습니다. 따라서 점 P가 영상 B에 투영된 좌표 p' 또한 유일하게 결정할 수 없습니다. 하지만 점 P는 A 카메라의 원점과 p를 잇는 직선(ray) 상에 존재하기 때문에 이 직선을 영상 B에 투영시키면 점 p'이 이 투영된 직선 위에 있음은 알 수 있습니다. 이 투영된 직선이 바로 epiline l' 입니다.


정리하면, 'A의 영상좌표 p로부터 대응되는 B의 영상좌표 p'을 유일하게 결정할 수는 없지만 p'이 지나는 직선인 epiline l'은 유일하게 결정할수 있다' 입니다. 그리고 한 영상좌표로부터 다른 영상에서의 대응되는 epiline을 계산해주는 변환행렬이 Fundamental Matrix, Essential Matrix 입니다. 즉, 서로 다른 두 시점에서 찍은 영상좌표들 사이에는 Fundamental Matrix, Essential Matrix를 매개로 하는 어떤 변환 관계가 성립하는데, Epipolar Geometry에서는 이 변환관계를 바탕으로 여러 기하학적 문제를 풀게 됩니다.



6.2 Essential Matrix


위 <그림 1>과 같이 3D 공간상의 한 점 P가 영상 A에서는 p에 투영되고, 영상 B에서는 p'에 투영됐다고 하면 두 영상 좌표 p와 p' 사이에는 다음 관계를 만족하는 행렬이 항상 존재한다는 것이 epipolar geometry의 핵심입니다 (단, p, p'은 normalized 이미지 평면에서의 homogeneous 좌표임).


--- (1)


--- (2)


즉, 임의의 두 지점에서 찍은 영상의 매칭점들은 항상 식 (1)을 통해 관계지을 수 있으며, 이 때 식 (1)을 epipolar constraint (또는 essential constraint), 이 3×3 행렬 E를 Essential Matrix라 부릅니다.


Essential Matrix E가 항상 존재하는 이유는 다음과 같습니다. 임의의 두 카메라 좌표축 사이의 관계는 회전, 평행이동에 의해 관계지을 수 있기 때문에 두 카메라 좌표축 사이의 3 × 3 회전행렬을 R, 3 × 1 평행이동 벡터를 t라 했을 때, 외부 공간상의 한 점을 두 카메라 좌표계에서 봤을 때의 관계를


--- (3)


와 같이 잡을 수 있습니다 (단, P는 외부 공간 상의 점을 A 카메라 좌표계에서 봤을 때의 3차원 좌표, P'은 B 카메라 좌표계에서 봤을 때의 3차원 좌표).


이 때, essential matrix E를 다음과 같이 잡으면


--- (4)


아래의 식 (5)가 만족됨을 알 수 있습니다. 단, 식 (4)에서 [t]x는 벡터 t와의 벡터 외적(outer product)을 의미합니다. 또한, [t]xR은 t와 R과의 외적을 의미하는게 아니라 먼저 R로 회전을 시킨 후 다음에 t와 외적을 시키는 일련의 변환을 의미합니다. 즉, Ep = [t]xRp = t × (Rp) 입니다.


--- (5)


--- (6)


식 (5)의 좌변에 E = [t]xR을 대입해 보면 다음과 같이 항상 0이 나옴을 알 수 있습니다.


--- (7)


이제 식 (5)의 카메라 좌표를 정규 이미지 좌표로 바꾸면 식 (1)이 성립함을 알 수 있습니다.


--- (8)



6.3 Fundamental Matrix


앞서 설명한 Essential Matrix는 정규화된 이미지 평면에서의 매칭 쌍들 사이의 기하학적 관계를 설명하는 행렬입니다. 즉, 카메라 내부 파라미터 행렬인 K가 제거된 좌표계에서의 변환관계입니다.


반면 fundamental matrix는 카메라 파라미터까지 포함한 두 이미지의 실제 픽셀(pixel) 좌표 사이의 기하학적 관계를 표현하는 행렬입니다.


임의의 두 이미지 A, B에 대하여, 매칭되는 픽셀 좌표 pimg, pimg' 사이에는 항상 다음과 같은 관계를 만족하는 행렬 F가 존재하고, 이러한 행렬 F를 fundamental matrix라 부릅니다.


--- (9)


--- (10)


이 때, 이미지 A에 대한 카메라 내부 파라미터 행렬을 K, 이미지 B에 대한 카메라 행렬을 K', 이미지 A, B 사이의 essential matrix를 E라 하면 fundamental matrix F는 다음과 같이 주어집니다.


--- (11)


--- (12)


만일 이미지 A, B를 동일한 카메라로 촬영했다면 카메라 행렬(K)이 동일하기 때문에 식 (11), 식 (12)는 다음과 같이 좀더 단순화됩니다.


--- (13)


--- (14)



[부연설명]


앞서 [컴퓨터 비전에서의 Geometry #1] 좌표계에서 설명한 바와 같이 이미지 픽셀좌표 pimg와 normalized 좌표 p 사이에는 camera matrix K에 대해 다음과 같은 변환관계를 가집니다.


--- (15)


--- (16)


따라서 이미지 A의 카메라 파라미터 행렬을 K, 이미지 B의 카메라 파라미터 행렬을 K'라 놓으면 다음 관계가 성립합니다.


--- (17)


이제 식 (17)를 식 (1)에 대입하면 다음과 같이 fundamental matrix가 구해짐을(존재함을) 알 수 있습니다.


 --- (18)



6.4 Epipolar Geometry


epipolar geometry에서 다루는 것은 크게 두가지인데 하나는 epipolar constraint이고 다른 하나는 triangulation입니다.


6.4.1 epipolar constraint


epipolar constraint는 두 이미지 평면 사이의 기하학적 관계에 따른 constrain(제약)인데 바로 식 (1)이 epipolar constraint를 나타냅니다.


두 이미지가 주어지고 대응되는 매칭 쌍들을 알고 있을 때, 만일 카메라 파라미터를 모른다면 fundametal matrix F를 직접 구해야 하는데 F를 구하기 위해서는 최소 7쌍의 매칭점들을 필요로 합니다.


단, 여기서 주의해야 할 점은 F의 스케일(scale)까지는 결정할 수 없다는 점입니다 (E도 마찬가지입니다). 스케일을 결정할수 없다 함은 아래 그림과 같이 물체와 카메라가 존재하는 공간 전체를 확대하거나 축소해도 동일한 이미지를 얻기 때문에 이미지만 가지고는 스케일을 알 수 없다는 것을 의미합니다 (가까이에 있는 작은 물체를 찍거나 멀리 있는 큰 물체를 찍어도 같은 영상을 얻을 수 있음을 상기하기 바랍니다).


<그림 2> 스케일 문제



만일 카메라 파라미터를 알고 있다면 Essential matrix E만 구하면 됩니다. Essential matrix E를 결정하기 위해서는 보통 5쌍의 매칭점을 필요로 합니다만 알고리즘에 따라서는 8 쌍의 매칭점을 필요로 하는 경우도 있고, 어떤 경우에는 3쌍, 2쌍, 심지어는 1쌍의 매칭점만을 필요로 하는 경우도 있습니다.


☞ E는 R, t로 구성되는데 회전변환 R이 3 자유도, 스케일을 무시한 평행이동 t가 2 자유도, 도합 5 자유도이므로 5쌍의 매칭점을 필요로 함.


Essential 행렬을 구할 때 몇 쌍의 매칭점들을 필요로 하느냐에 따라서 알고리즘을 8-point 알고리즘, 5-point 알고리즘, ..., 1-point 알고리즘 등과 같이 부릅니다. 예를 들어, 3-point 알고리즘은 E를 구할 때 3쌍의 매칭점을 이용하는 알고리즘을 지칭합니다.


3-point 알고리즘, 2-point 알고리즘 등과 같이 원래 요구되는 매칭쌍(5쌍)보다 적은 수의 매칭쌍을 이용하여 E를 구할 수 있는 이유는 E에 추가적인 constraint를 가하기 때문입니다. 예를 들어, 달리는 자동차에 장착된 카메라로 촬영한 영상들 사이에는 우리가 손으로 카메라를 들고 맘대로 찍은 영상과는 분명히 다른 어떤 추가적인 constraint가 존재합니다 (지면과의 높이가 고정된 점, 자동차의 pitch와 roll의 변화가 거의 없는 점 등). 여기에 추가적으로 자동차의 모션을 원운동 또는 직선운동으로 모델링하게 되면 훨씬 적은 수의 매칭쌍만으로 E를 결정할 수 있게 됩니다.


Epipolar geometry에서 essential 행렬이 중요한 이유는 E를 알면 이로부터 두 카메라 A, B 사이의 또는 두 시점 사이의 회전, 평행이동 관계를 파악할 수 있기 때문입니다. 실제 계산 과정에 대해서는 위키피디아를 참조하기 바라며 opencv 함수를 이용해도 [R|t] 를 구할 수 있습니다.


6.4.2 triangulation


마지막으로 triangulation (삼각측량법)은 두 이미지 평면 사이의 기하학적 관계가 주어지고 (즉, E 또는 F가 주어지고), 두 이미지 평면상의 매칭쌍 p, p'이 주어지면 이로부터 원래의 3D 공간좌표 P를 결정할 수 있다는 것을 말합니다. 바로 스테레오 비전에서 거리(depth)를 구할 때 하는 일입니다. 계산과정 및 수식 등은 위키피디아를 참조하기 바랍니다.



6.5 OpenCV 관련 함수


아래 목록의 함수중 회색으로 음영처리한 함수들은 opencv 버전 3.0부터 포함될 예정이라 합니다.

  • findFundamentalMat(): 두 이미지 사이의 fundamental matrix를 계산하여 반환. 입력으로는 8쌍 이상의 매칭 이미지 좌표쌍을 입력
  • findEssentialMat(): 두 이미지 사이의 essential matrix를 계산하여 반환. 입력할 내용은 5쌍 이상의 매칭 이미지 좌표쌍과 카메라 파라미터(초점거리, 주점). 내부적으로 5-point 알고리즘을 사용. 이미지 좌표로는 normalized 좌표가 아닌 픽셀 좌표를 입력 (현재 미구현)
  • decomposeEssentialMat(): 입력 essential matrix로부터 회전변환 R, 평행이동 t를 추출해 줌. 가능한 4가지 조합의 [R|t]를 반환 (현재 미구현)
  • recoverPose(): 입력된 essential matrix와 두 이미지에서의 매칭쌍으로부터 두 이미지의 상대적인 [R|t] 관계를 추출해 줌. decomposeEssentialMat()이 [R|t]를 유일하게 결정하지 못하고 해를 여러개 반환하는 반면, recoverPose()는 부가적인 기하학적 조건 검사를 통해 [R|t]를 유일하게 결정하여 반환해 줌 (현재 미구현)



6.6 참고 자료


위키피디아 epipolar geometry

위키피디아 essential matrix

위키피디아 fundamental matrix



☞ 이상으로 컴퓨터 비전에서의 geometry 시리즈를 마무리합니다. 생각보다 글이 길어졌고 시간도 많이 걸렸네요. 스테레오 비전쪽이 아직도 숙제이긴 하지만 이번 글들을 정리하면서 개인적으로 imaging geometry에 대한 개념이 많이 정리가 되었습니다. 이 글을 읽는 분들에게도 도움이 되었으면 좋겠네요.


☞ 최근 영상기하학에 대한 전반적인 내용을 정리한 글을 올렸는데 이것도 같이 참조하면 좋을듯 싶습니다 -> [영상처리] - Extrinsic Camera Calibration - 카메라의 위치 및 자세 파악


(2014.5.7일자로 최종 수정됨)


by 다크 프로그래머


  • 이전 댓글 더보기
  • 질문자 2015.01.31 19:08 신고 ADDR 수정/삭제 답글

    매번 다크프로그래머님 블로거 를통해서 많은것을 배우고있어 항상 감사합니다
    다름이아니라 이미지에서 얻 은좌표들 을그대 로8point알고리즘에적용을한뒤에fundamentlamatrix를구했더 니잘못 된값들이나와 알고보니 이미지에서 얻은좌표를 normalization을 해줘야한다고 알았는데 요(X=Tx) 여기서Translation and scaling 을 가지고있는 T라 는것이matrix형태인가요?그렇다면 T를어디서 구해야하나요?혹시 간략하게나마 설명해주실 수 있으신지요?

    • BlogIcon 다크pgmr 2015.02.01 20:15 신고 수정/삭제

      데이터들의 평균이 0, 평균편차가 sqrt(2)가 되도록 데이터들을 평행이동, 스케일 변환하는 것을 말합니다. 구글에서 dlt normalization 이란 키워드로 검색해 보시기 바랍니다. 또는 multiple view geometry in computer vision 책 내용을 참조하시기 바랍니다.

    • BlogIcon 다크pgmr 2015.02.03 13:58 신고 수정/삭제

      그건 저도 알지 못합니다

  • 영상geo 2015.02.09 15:06 신고 ADDR 수정/삭제 답글

    다크님 안녕하세요. 블로그를 통해 많은 공부를 하고 있습니다.
    정말 간단한 것 같은 질문하나만 드리겠습니다.
    (제가..이해가부족한것 같습니다.)
    식(7)에서 첫번째에서 두번째로 갈때 transpose가 없어지는 이유와 식(8)에서 마지막줄에 z와 z'이 없어지는 이유를 알고 싶습니다...

    • BlogIcon 다크pgmr 2015.02.09 18:10 신고 수정/삭제

      안녕하세요. 식(7) 질문 관련하여, 두 벡터의 내적 a∙b를 행렬의 곱으로 표현하면 aTb가 됩니다 (a, b를 열벡터로 봤을 때). 식 (8)은 z는 0이 아닌 상수이고 p', p 등은 벡터(행렬)임을 고려하시기 바랍니다.

    • 영상geo 2015.02.09 22:08 신고 수정/삭제

      감사합니다 다크님!!

  • BongBong 2015.08.23 10:30 신고 ADDR 수정/삭제 답글

    안녕하세요.
    다크님 블로그보며 많은 정보를 얻고 공부하고 있는 대학원생입니다.
    학부생때부터 꾸준히 다크님의 포스팅을 보며 많은 공부를 하다가 처음으로 질문댓글을 남겨봅니다.

    카메라 2대를 이용하여 임의지역의 좌표를 획득하는 공부를 하고 있습니다.

    교수님께 자문을 구하였는데, 교수님께서는 카메라 2대의 내부, 외부 파라미터와 카메라2대에 찍힌 이미지상의 좌표만 알면 벡터의 교점이 구하고자하는 임의지역의 좌표라고 하셨습니다.
    (또한 내부,외부 파라미터를 구하기 위한 조건으로는 3개이상의 실제좌표를 알아야 합니다.)

    현재까지 진행된 상태는 카메라 2대의 내부, 외부 파라미터를 구하는 것까지 완료하였습니다.

    A : 구하고자하는 3차원 좌표
    a : 카메라1에서 찍힌 A의 이미지상 좌표(2차원)
    a' : 카메라2에서 찍힌 A의 이미지상 좌표(2차원)
    이라고 가정할때 카메라 2대의 내부,외부파라미터와 a, a'를 이용하여 A를 구하려합니다.

    다크님의 포스팅을 참고하여 triangulation을 이용하면 구할수 있다고 생각하여 공부를 해보았는데 생각처럼 되지 않습니다.
    (opencv에 triangulation 함수가 있지만.. 이해가 어렵습니다..)
    또한 Fundamental Matrix와 Essential Matrix를 구하는 방법도 제가 알고 있는 조건중에 무엇을 이용하여 구해야 할지 잘모르겠습니다.
    opencv에 있는 findFundamentalMat 같은경우에도 여러 대칭 이미지들을 이용해야 한다고 나와있고..

    다크님의 포스팅 카메라 캘리브레이션, 카메라 좌표계, Homogeneous Coordinate, SolvePnp사용법,
    카메라의 위치및 자세파악 을 모두 참고하였습니다.

    제가 다시봐야할 포스팅이나 학습할 내용, 참고할수 있는 코드를 알려주실수 있나요?

    • BongBong 2015.08.23 12:00 신고 수정/삭제

      질문 댓글을 달고 계속 공부중입니다.
      현재 triangulation 함수를 이용하여 좌표를 구해봤는데 좌표값이 틀리게 나옵니다.

      3x4 rt행렬을 잘못만든거같아 질문드립니다.
      다크님이 올려주신 solvepnp사용법 포스팅에 있는 소스를 사용하였는데 rt행렬을 제대로 만든지 봐주실수있나요?
      Mat R;
      Rodrigues(rvec, R);
      Mat R_inv = R.inv();
      R_inv의 값 3개 와 tvec값 1개를 순서대로 반복하여 총12개로 만들었습니다.

      아래는 triangulation 소스입니다.
      double cam0_rt[12] = { 0.9918, -0.0231, -0.125, -35.8763, -0.1137, 0.2823, -0.9525, -10.8601, 0.0574, 0.9590, 0.274, 389.8970 };
      Mat cam0 = Mat(3, 4, CV_64FC1,cam0_rt);
      ouble cam1_rt[12] = { 0.9997, -0.0199, 0.0139, -30.9349, 0.0179, 0.2155, -0.9763, 15.8306, 0.0165, 0.9762, 0.2158, 385.0854 };
      Mat cam1 = Mat(3, 4, CV_64FC1,cam1_rt);

      double pnt0[2] = { 1096, 492 };
      Mat cam0pnts = Mat(2, 1, CV_64FC1,pnt0);
      double pnt1[2] = { 1206, 689 };
      Mat cam1pnts = Mat(2, 1, CV_64FC1,pnt1);


      Mat pnts3D=Mat(4, 1, CV_64FC1);

      cv::triangulatePoints(cam0, cam1, cam0pnts, cam1pnts, pnts3D);
      double w = pnts3D.at<double>(3, 0);
      double x = pnts3D.at<double>(0, 0) / w;
      double y = pnts3D.at<double>(1, 0) / w;
      double z = pnts3D.at<double>(2, 0) / w;

      cout << x << ", " << y << ", " << z << endl;

    • BlogIcon 다크pgmr 2015.08.23 17:39 신고 수정/삭제

      R_inv가 아니라 R을 이용해야 하는 것 아닌지요.. 그리고 triangulation 등 자세한 과정에 대해서는 multiple view geometry in computer vision 책 내용을 참조하시면 좋을 것 같습니다.

    • BongBong 2015.08.24 14:02 신고 수정/삭제

      감사합니다. 참고하여보겠습니다.

  • Bradly 2015.11.13 15:48 신고 ADDR 수정/삭제 답글

    안녕하세요 ㅎㅎ 언젠가부터 계속 들르게되는 다크님의 사이트입니다. epipolar 지오메트리를 좀 더 깊게 공부해보고싶은데, 어떤책을 보는게 좋을까요? 어떤책을 추천하시나요. Multiple view?

    • BlogIcon 다크pgmr 2015.11.16 10:19 신고 수정/삭제

      네, 여력만 된다면 괜찮다고 생각합니다.

  • 공돌이 2015.12.08 03:16 신고 ADDR 수정/삭제 답글

    정말 알기쉽게 설명 잘 하셔서,
    님이 작성하신 여러 글들 재밌게 살펴보고 일인입니다.

    geometry 관련 내용들 쭉~ 보다가 이번 내용에서 궁금한게 있어서,
    질문 좀 드려 볼려구요.

    6.4.1에서 "fundametal matrix F를 구하기 위해서는 최소 7쌍의 매칭점들을 필요하다"고 되어 있는데, 왜 최소 7쌍인지가 궁금하네요. F에서 구해야 되는 변수가 7개 인건가요??

    • BlogIcon 다크pgmr 2015.12.08 17:51 신고 수정/삭제

      자세한 내용은 F를 구하는 알고리즘을 살펴보시는게 좋을 것 같습니다. Hartely의 Multiple View Geometry in Computer Vision과 같은 책을 보면 해당 내용이 자세히 설명되어 있습니다.

  • tigger 2016.01.20 21:20 신고 ADDR 수정/삭제 답글

    항상 느끼는 것이지만, 다크님의 글에서도 많은 것들을 배우지만 보다 더 배울 수 있는 공간이 "댓글" 인 것 같습니다^^ 제가 미쳐 생각지 못했던 부분을 다른 분들이 질문해주시고 그에 대해 답변도 달아주시고 많은 분들의 생각을 공유할 수 있는 것 같습니다.

    저 역시 몇 가지 궁금한게 있습니다.

    1. 식(4)의 회전 후 외적을 취하는 것의 기하학적 의미를 알고 싶습니다. 식(4)를 이해하는데에 식(3)의 개념이 녹아드는지도... 혹시 이와 관련된 자세한 reference는 muliple view geo에서 얻을 수 있겠죠?? 책이 좀 두껍다 보니 어느 부분을 봐야 될지도 엄두가 안나네요;;

    2. dlt normalization에 관한 댓글 부분인데요."곰돌이만세 2014/08/08 13:07"의 댓글에는 데이터들의 분산이 sqrt(2)가 되도록이라 되어있는데, "질문자 2015/01/31 19:08"의 댓글에는 평균편차가 sqrt(2)가 되도록 하라고 되어있습니다. 평균편차랑 표준편차를 구하는 방법이 다른데요. 직관적으로 보면 표준편차를 sqrt(2)로 맞추는 게 더 쉬워보이는데... 둘 중의 뭘 써도 상관이 없는건가요?

    • BlogIcon 다크pgmr 2016.01.21 10:21 신고 수정/삭제

      안녕하세요. 식(7)과 같이 수식적으로만 이해할뿐 기하학적인 의미는 저도 잘 알지 못합니다. DLT 정규화는 multiple view geometry 책에 잘 나와 있습니다. 데이터의 평균이 원점이 되도록 한후, 데이터에서 원점까지의 거리의 평균이 sqrt(2)가 되도록 하면 됩니다. 즉, 편차들의 절대값의 평균이 sqrt(2)가 되도록 하면 됩니다.

  • tigger 2016.01.30 02:26 신고 ADDR 수정/삭제 답글

    요즘 multiple view geometry에 푹빠져(?) 재미나게 공부하며 지내는데요.

    지난번 질문때(바로 위 질문) 식(4)의 기하학적 의미에 대해 물었는데요.

    다크님께 글 안에서 "이 때, essential matrix E를 다음과 같이 잡으면" 이라고 되어 있고 왜 그렇게 잡는지에 대한 설명이 없어서 제가 이해가 부족했는데요. 그래서 질문한건데 근데 직접 epipolar constraint를 유도하니깐 그제서야 이해가 되었네요^^

    E 행렬 자체만으로 어떤 기하학적 의미를 갖는다고 하기보다는 대응점(p, p')간의 3차원 위치 관계(회전, 평행이동)를 표현하는 행렬로 이해하였습니다. epipolar constraint의 유도는 epipolar plane을 평면의 방정식으로 표현하는 것에서부터 시작하면 되는데요.

    글에서 한 가지 잘못표현된 것이 있는것같습니다. 식(4)가 t와 R의 위치가 바뀌어야 될것같습니다.
    행렬이 교환법칙이 성립되는 것도 아니라서 위키피디아(https://en.wikipedia.org/wiki/Essential_matrix)에도 "E = R[t]x" 라 되어있네요. R이 왜 먼저 인지는 에피폴라 평면을 유도해보면 아실것같습니다.

    다크님께서 식(4)와 같이 쓰신 이유를 곰곰이 생각해보면 식(3)에서 P'과 P의 변환 관계를 나타낼 때 먼저 Rotation 한뒤 translation을 한다고 표현되어있어서 그래서 식(4)에 대한 설명에서도 "[t]xR은 t와 R과의 외적을 의미하는게 아니라 먼저 R로 회전을 시킨 후 다음에 t와 외적을 시키는 일련의 변환을 의미합니다."라고 쓰신 게 아닌가합니다;;(?)

    제 생각이 맞나요?

    • BlogIcon 다크pgmr 2016.01.31 16:37 신고 수정/삭제

      t가 어떤 t인가에 따라 다른 것 같습니다. p' = Rp + t로 잡으면 E = [t]xR가 맞고 p' = R(p - t)로 잡으면 E = R[t]x가 맞습니다. 위키에서는 t가 p' = R(p - t)에서의 t이기 때문에 E = R[t]x가 된 것으로 보시면 됩니다. 일반적으로 3D에서의 변환을 [R|t]로 표현하는데, 여기서 t는 보통 p' = Rp + t인 t를 의미합니다. 따라서 일반적으로는 식 (4)처럼 E = [t]xR로 잡을 수 있습니다. 하지만 실제 translation 값은 p' = R(p - t)인 t이기 때문에 이 경우에는 E를 E = R[t]x로 잡는게 맞겠습니다. multiple view geometry 책에서는 t를 어떤 의미로 사용했는지 모르겠네요.

  • 곤니찌왕 2016.03.14 14:55 신고 ADDR 수정/삭제 답글

    안녕하세요! 질문드려요~ 제가 맞게 이해를 하고 있는 것인지요?

    - Essential matrix E 를 계산했을 때, 이는 normalized image plane상에서 homogeneous좌표라고 하셨는데, 즉 월드좌표게 (X,Y,Z)가 임의의 카메라 extrinsic matrix E'(구분을 위해 ' 적었어요) 을 곱해 나온 (xc,yc,zc)를 (위에선 u, v, 1 표기된것) --> (xc/zc, yc/zc, 1)로 나타냈을때 해당하는 값을 말씀하시는 것인가요?

    거기에 위쪽 댓글에 적어주신
    'An invitation to 3d vision'이란 책의 ch.5에서 r, t를 계산하고
    제가 한쪽에서 구한 (xc, yc, zc)에 r 과 t를 transform하도록 해주면 다른 쪽에 있는 (xc, yc, zc)를 회득할 수 있게 되는것 같은데 맞게 생각하고 있나요?

    • BlogIcon 다크pgmr 2016.03.15 09:00 신고 수정/삭제

      네, 모두 맞습니다. ^^

    • 곤니찌왕 2016.03.17 10:30 신고 수정/삭제

      그렇다면 비슷하게 생각해서
      1번카메라의 Extrinsic matrix 를 E1,
      2번카메라의 Extrinsic matrix를 E2,
      동일한 카메라로 자세만 다르게 해서 촬영했기 때문에 같은 intrinsic matrix K를 갖는다고 했을 때 대응점을 설정해서 (cv상에서 계산한 것)
      Fundamental matrix F를 회득할 수 있습니다. (cv상에서 8점대응으로 계산하였는데 각 점에 대해 F가 p'^T F p = 0을 만족하는지 확인하였는데 8개의 p대응점 중 7개는 거의0이고 1개만 0.1정도의 수치가 나왔습니다)
      E = K^T F K 로 계산할 수 있구요.

      여기서 E가 맞는지 확인하려고 하는데, 제가 구현한 코드상에서는 수치가 정확하지가 않아 보입니다. 어느 곳이 문제일까요?

      (Xc1, Yc1, Zc1) = E1 (X, Y, Z, 1)^T : 1번카메라좌표계 기준 좌표
      (Xc2, Yc2, Zc2) = E2 (X, Y, Z, 1)^T : 2번카메라좌표계 기준 좌표

      (Xc2/Zc2, Yc2/Zc2, 1) E (Xc1/Zc1, Yc1/Zc1)^T = 0 : 이 나와야 하는데 수치가 가끔 10의 자리가 나올 정도로 커집니다.

      E1, E2의 경우 P1 = KE1, P2 = KE2로 놓고 특정 포인트가 이미지위에 제대로 증강되는지 확인하였을 때 제대로 증강되었기에 정확하다고 판단하였습니다.

    • BlogIcon 다크pgmr 2016.03.17 14:51 신고 수정/삭제

      특별히 잘못된 점은 저도 찾지 못하겠습니다. E, E1, E2중 어딘가에 오차가 있을 것으로 생각됩니다. E1, E2로부터 계산된(가상의) 좌표가 아닌 실제 대응점들의 normalized 영상좌표를 가지고 E를 테스트해보시면 어떨까 싶습니다. 그리고 혹시 렌즈 왜곡(radial distortion) 때문에 발생한 문제가 아닌지도 같이 검토해 보시면 좋을 것 같습니다. 만일 렌즈 왜곡이 있는 편이라면 F로부터 E를 계산하지 말고 왜곡보정된 normalized 좌표들로부터 직접 E를 계산하면 좋을 것 같습니다. 그리고, 참고로 E1, E2가 이미 구해진 상태라면 이들로부터 직접 E를 구할수도 있습니다. C1 = R1W+t1, C2 = R2W+t2라면 C2 = R2R1^T(C1-t1)이므로 카메라 1, 카메라 2사이의 R, t가 R = R2R1^T, t = -R2R1^Tt1으로 주어집니다. 그러면 본문의 식 (4)를 이용해서 E를 직접 계산할 수 있습니다. E1, E2가 정확하다고 생각되시면 이 방법을 써도 좋을 것 같습니다.

    • 곤니찌왕 2016.03.18 18:26 신고 수정/삭제

      E1, E2는 제가 Essential matrix의 constraints를 만족시키도록 잘 계산을 하였는지 확인하려고 reference로부터 찾은 것이랍니다. 실제로 제가 프로그램 상에서 테스트하려고 하는 것은 E1, E가 주어졌을 때 월드좌표 점 P를 2번째 카메라 자세로 증강시킬 수 있는가? 였거든요.

      F, E 를 각각 constraints를 모두 만족시키도록 조금 바꿔봤는데, 우선적으로는 opencv 예제들에서 많이 나오는 fundamental matrix계산방법에서 ransac을 썼을 때보다 8포인트나 다른 파라미터를 넣으면 일단 constraints 를 만족하는 것 같습니다. (그래도 큰건 0.X정도 나오지만요)

      그래서 Essential matrix가 잘 계산되었는지 실제로 테스트하려고 위에 말씀드린 것과 같이 하려고 합니다.
      - 우선 F, E계산
      - E1, K는 주어짐
      - 임의의 점 P(X,Y,Z) 를 E1 * P 으로 카메라좌표계 (Xc1, Yc1, Zc1)에 놓는다 .
      - normalized : (Xc1/Zc1, Yc1/Zc1, 1)을 E로부터 구한 R, T로 transform 한다) = (Xc2/Zc2, Yc2/Zc2, 1)이 나오고, 아직은 reconstruction까지는 수행되지 않아서 Zc2는 모르는 상태라 임의로 Zc2를 설정하여 카메라 2에서의 카메라좌표 (Xc2, Yc2, Zc2)를 회득한다.
      - K * (Xc2, Yc2, Zc2) = (u2, v2, w2)의 이미지좌표가 나오게 되고 (u2/w2, v2/w2)로 카메라2에서 촬영한 이미지에 제대로 증강되는지 확인한다.

      이러한 과정을 거쳐 E, F를 검증하고자 하는데 맞으려나요!?

    • BlogIcon 다크pgmr 2016.03.20 06:40 신고 수정/삭제

      normalized image 좌표 1이 아니라 카메라좌표계 좌표1에서 바로 R, t를 적용해서 카메라좌표계 좌표2를 얻으면 되지 않을까요..

  • 지나가리라 2016.03.24 17:31 신고 ADDR 수정/삭제 답글

    안녕하세요. 이제 막 stereo vision에 관심을 갖고 공부를 시작한 초보엔지니어 입니다. 이해하기 쉽도록 자세하고 친절한 설명을 해주셔서 진입장벽이 많이 낮아진 느낌입니다.
    제가 다크프로그래머님의 게시 글과 댓글들을 참고하면서 공부해본 결과 p와 p'의 대응관계를 표현하는 R,T를 구하려면 E matrix를 SVD해서 구해야 한다고 되어있습니다. 그리고 E matrix는 카메라 내부 파라미터 행렬 K를 제거한 matrix라고 알고 있습니다. 그런데 E를 통해서 구해진 R,T는 intrinsic parameter를 고려하지 못하게 되는데 왜 E를 SVD해줘야 되는지 의문이 생겼습니다. 만약 가능하다면 F matrix를 이용해서 R,T를 구하면 intrinsic parameter를 고려한 R,T를 구할 수 있지 않을까? 하는 생각이 들었습니다.
    E를 SVD해서만 R,T를 구할 수 있다면 intrinsic parameter를 고려해주는 추가 보정작업이 필요하게 되는 것인지? 그렇다면 그 방법은 무엇인지도 궁금합니다.
    opencv 3.0에서 stereoCalibrate 함수를 사용하면 R,T,E,F가 다 구해지게 되는데, 여기서 말하는 R,T가 E matrix를 SVD해서 나온 결과인지 궁금합니다.
    답변 주시면 정말 큰 도움이 될 것 같습니다.

    • BlogIcon 다크pgmr 2016.03.28 10:44 신고 수정/삭제

      안녕하세요. 일단 opencv에서의 구현 방식은 직접 소스코드를 확인해 보시면 좋을 것 같습니다. 그리고 영상을 기하학적으로 해석하기 위해서는 기본적으로 카메라의 내부 파라미터는 제거해 주는게 당연합니다. 내부 파라미터를 고려한 R, T가 어떤 경우에 필요한 것인지 잘 모르겠습니다...

  • 어두미 2016.04.22 00:23 신고 ADDR 수정/삭제 답글

    다크님, 연재글 잘 보고 있습니다. 한가지 궁금한점은, 혹시 epipolar기하를 통해 절대 3D 좌표를 구할 수 있나요? 제말은, 축척보정을 위해 기준점이 있어야 하지 않나합니다. 아무리 intrinsic 파라미터를 안다고 해도, 축척은 결정하지 어려다고 생각되거든요. 이래저래 궁금한게 많습니다.

    • BlogIcon 다크pgmr 2016.04.22 06:45 신고 수정/삭제

      네, 말씀하신 것처럼 에피폴라 만으로는 축척(scale)을 결정할 수 없기 때문에 절대적인 3D 좌표는 구할 수 없습니다. 따라서 스케일을 결정하기 위해서는 축적보정을 위한 기준 또는 부가적인 정보가 필요합니다. 스테레오 카메라의 경우에는 캘리브레이션 과정에서 측정된 두 카메라 사이의 절대적 거리 즉, baseline을 이용하고 PTAM에서는 처음에 사용자에게 10cm 정도 카메라를 이동하도록 요구하며, 자동차에서 모노카메라로 visual odometry를 계산할 때에는 스케일 결정을 위해 지면에서의 카메라 높이 정보를 요구합니다.

  • 김창현 2016.06.29 15:32 신고 ADDR 수정/삭제 답글

    안녕하세요, 비전 공부하는 학생입니다. 항상 다크프로그래머님 글 잘 읽고 있습니다.

    한가지 궁금한 점이 있는데, 다크프로그래머님은 어떤 책을 참고하셔서 공부 하시는 건가요 ?

    • BlogIcon 다크pgmr 2016.06.30 09:16 신고 수정/삭제

      따로 보는 책은 없고 주로 인터넷 검색과 논문 등을 주로 보고 있습니다..

    • 김창현 2016.07.09 14:03 신고 수정/삭제

      그렇군요~ 원래 연구란게.. 논문에 등장하는 학부 때는 본 적도 없는 linear algebraic theorem들 그리고 논문의 불친절한(?) 설명에 이리저리 치이면서 공부를 해야하는건가 싶습니다 ㅠㅠㅎㅎ

    • BlogIcon 다크pgmr 2016.07.11 14:14 신고 수정/삭제

      공부가 목적이라면 논문보다는 책이 낫겠지요.. 논문은 비슷한 분야에 있는 다른 이들에게 압축된 문장으로 자신의 연구결과를 알리는 것이 목적이기 때문에 불친절(?)할 수 밖에 없고 또 공부 목적으로는 적합하지 않습니다. 당연히 공부를 위해서는 코스웍을 밟아서 차근히 공부를 하는게 맞습니다. 제가 책보다는 주로 인터넷을 참조한다는 것은 제가 그렇다는 것이지 그렇게 해야 한다는 것은 아니니 오해 없으시기 바랍니다. 저도 가끔 차분히 앉아서 책을 보고 싶은 유혹도 느끼지만 현실적으로 그런 여유를 갖기는 힘들기 때문에 책은 필요한 부분에 한해서 그때 그때 찾아보는 편입니다. 예전에 학생이었을 때 봤던 책들도 있긴 하지만 워낙 예전의 책이고 그 책들로 인해서 현재의 나의 앎이 형성되었다고 보기는 힘들기 때문에 다른 이에게 추천을 하기는 힘듭니다. 그래도 제가 봤던 책들을 굳이 적어보면, 곤잘레스의 "digital image processing", 제인의 "machine vision", Vladimir Cherkassky의 "learning from data" 정도입니다. 그리고 제가 처음 프로그래밍에 입문하면서 봤던 책은 임채성씨의 "안녕하세요. 터보 C", 그리고 MFC는 Jeff Prosise(문성규역)의 "MFC 윈도 95 프로그래밍" 정도입니다. OpenCV는 따로 책은 보지 않았고 온라인 help 등을 보면서 그때 그때 구현하고 있습니다. 요즘 제가 따로 시간을 내서 공부해보고 싶은 책은 "Multiple View Geometry in Computer Vision"이란 책인데, 도무지 엄두가 않나서 보지는 못하고 있습니다.

  • 동동 2016.12.12 21:04 신고 ADDR 수정/삭제 답글

    E matrix랑 t 구했다하면 이제 R을 구해야 하는데 구하면 (t,R)이 4가지 경우가 나오는데 이 중 Z>0인게 진짜 camera pose인데
    이걸 알기 위해 3D좌표를 먼저 복원하고 4개중 정답인 옳은 포즈를 찾는 것 인지 아니면
    4개 중 옳은 카메라포즈를 구했다 치고 이를 가지고 3D좌표를 복원하는건지 궁금합니다..

    즉 궁금한게 옳은 포즈를 알려면 3D복원부터 해서 포즈를 찾는 건지
    포즈를 구했다 치고 3D좌표 찾는건지... 궁금합니다ㅠㅠㅠ

    • BlogIcon 다크pgmr 2016.12.13 09:56 신고 수정/삭제

      Essential 행렬을 구하려면 두 영상에서 5 point 이상의 대응점을 이용해서 구합니다. E를 분해하면 여러 개의 R, t가 나오는데 이들 각각에 대해 앞서 대응점들에 대한 depth를 삼각법(triangulation)을 이용해서 구한 후 depth>0인 대응쌍들이 최대인 R, t를 선택하면 됩니다. 즉, 몇몇 샘플에 대한 테스트를 통해 유효한 3D 복원이 가능한지 여부를 확인한 후 가장 적합한 R, t를 선택하는 방식입니다.

  • 패트와메트 2017.04.06 12:38 신고 ADDR 수정/삭제 답글

    fundamental matrix를 구하면 카메라의 내부파라미터를 구할 수 있는것 같은데, 카메라가 2대이면 2개의 내부 파라미터가 나와야 하지 않나요?? 이 부분이 이해가 안되네요

    • BlogIcon 다크pgmr 2017.04.06 22:27 신고 수정/삭제

      한 카메라로 여러 지점에서 얻은 영상을 매칭한 경우라면 내부 파라미터가 1개일 것이고 카메라가 2대라면 각각 따로 내부 파라미터를 구해야 할 것 같습니다.

    • 패트와메트 2017.04.07 11:38 신고 수정/삭제

      아직 이해가 잘안되는 부분이 있는데 fundamental matrix에 있는 Rt는 extrinsic parameter의 Rt와 관련없는게 맞나요??

    • BlogIcon 다크pgmr 2017.04.08 22:44 신고 수정/삭제

      패트와메트님, 관계가 있을수도 있고 관계가 없을수도 있습니다. 그림 1에서도 표기되어 있듯이 이 글에서 사용된 [R|t]는 단지 두 카메라 시점 사이의 상대적인 R, t입니다. 그리고 카메라의 extrinsic parameter는 월드좌표축을 기준으로 했을 때의 현재 카메라 시점의 [R|t]를 의미하는 용어입니다. 이 글에서 사용된 [R|t]는 단지 두 카메라 시점 사이의 상대적인 위치 관계를 나타낼 뿐이지만 상황에 따라서는 두 카메라 시점 중 하나가 월드 좌표축인 경우에는 이 [R|t]를 카메라의 extrinsic parameter라고 볼 수도 있습니다.

    • 패트와메트 2017.04.12 19:17 신고 수정/삭제

      감사합니다 제가 좀 더 자세히 읽었다면 이해할 수 있었을 텐데요 ㅠ.ㅠ 그렇다면 fundamental matrix에 R,t가 외부파라미터라면 R,t에 대한 정보를 알고 있고 fundamental matrix에 대해 알고 있다면 intrinsic parameter에 대해서도 알 수 있다고 생각할 수 있나요??

    • BlogIcon 다크pgmr 2017.04.12 21:09 신고 수정/삭제

      글쎄요.. 얼핏봐선 풀릴 것 같기도 한데.. 해 보지 않은 것이라 잘 모르겠습니다.

  • 염소 2017.07.04 00:26 신고 ADDR 수정/삭제 답글

    안녕하세요! 8번식이 안보이는데 ㅜㅜㅜ 업데이트 가능하신가요?

    • BlogIcon 다크pgmr 2017.07.04 09:33 신고 수정/삭제

      제 pc에서는 잘 보이는데.. 스마트폰에서도 잘 보이구요.. 어쨌든 8번식을 댓글로 적어드립니다.
      P = zp = z[x/z, y/z, 1]T
      P' = z'p' = z'[x'/z', y'/z', 1]T
      P'TEP = 0 <=> (z'p')TEzp=0 <=> p'TEp=0

  • vision은처음 2017.09.13 15:26 신고 ADDR 수정/삭제 답글

    안녕하세요. 자유도와 파라미터를 유일하게 결정하기 위한 매칭쌍의 개수에 대해 질문드립니다.
    본문에, "E는 R, t로 구성되는데 회전변환 R이 3 자유도, 스케일을 무시한 평행이동 t가 2 자유도, 도합 5 자유도이므로 5쌍의 매칭점을 필요로 함."라고 하셨는데요.
    이전에 다른 글에서는 다음과 같이 적어주셨습니다. "Similarity 변환의 자유도는 4이며2 similarity 변환을 유일하게 결정하기 위해서는 2개의 매칭쌍이 필요합니다. 출처: http://darkpgmr.tistory.com/79#footnote_79_2 [다크 프로그래머]"
    선형 방정식에서 자유도는 변수의 개수, 매칭점은 곧 수식의 개수와 관련이 될 텐데요.
    매칭점이 2차원의 (x, y) 순서쌍으로 나타나므로, 곧 수식의 개수는 매칭점의 개수의 2배가 되어,
    자유도가 5라면, ceiling(5/2) = 3 개의 매칭점만 있으면 되는 것이 아닌지요? 혹시 제가 잘못 이해한 부분이 있으면 말씀해 주시면 감사하겠습니다.

    • BlogIcon 다크pgmr 2017.09.15 14:43 신고 수정/삭제

      안녕하세요. 보통의 경우에는 말씀하신 내용이 맞는데요, 예를 들어 Ap = p'와 같이 x좌표와 y좌표가 독립적으로 constraint를 형성하는 경우에는 말씀하신 것처럼 매칭쌍(p - p') 1개가 2개를 제약식을 제공합니다. 하지만, fundamental matrix나 essential matrix의 경우에는 제약식이 pEp' = 0 형태로서 매칭쌍 1개가 1개의 제약식을 제공합니다. x좌표와 y좌표가 epipolar constraint에 의해 correlation되기 때문이라고 생각되는데요, pEp' = 0 식을 전개해 보면 매칭쌍 한개에 1개의 식만 나옴을 확인하실 수 있습니다. 위키에서 DLT(direct linear transform) 방법에 대해서도 한번 찾아 보시면 좋을 것 같습니다.

  • 고길동 2017.10.26 14:11 신고 ADDR 수정/삭제 답글

    "P'·(txP'-txt) =0" 이 식이 왜 0이 되는지 잘모르겠는데, 이유를 알려주실수 있을까요 ^^;;?

    • BlogIcon 다크pgmr 2017.10.26 14:28 신고 수정/삭제

      먼저 외적에 대한 이해가 필요한데요, 두 벡터의 외적은 두 벡터에 의해 생성되는 평면에 수직인 벡터가 나옵니다 (크기는 두 벡터가 형성하는 평행사변형의 넓이와 동일). 따라서 서로 동일한 두 벡터의 외적은 영벡터가 되고 수식에서 txt = 0이 됩니다. p' . (t x p')에서 t x p'은 외적 정의에 의해서 t와 p'에 동시에 수직인 벡터가 됩니다. 따라서 이 벡터와 p'의 내적을 구하면 0이 됩니다.

  • Jinger 2018.03.09 15:05 신고 ADDR 수정/삭제 답글

    카메라 파라미터를 각각 구해놓은 상태에서 Essential matrix만 구해서 적용해보려 하는데 두 카메라 간의 정확한 Pose 관계를 이미 알고 있다면 그것을 Essential matrix에 대입하여 대응점없이 F를 구해도 되는 것인지요?
    또, opencv findEssentialMat 함수 input으로 카메라 파라미터를 넣어주도록 되어있는데, 이유가 무엇입니까? 서로 다른 카메라를 사용하는 경우엔 이함수를 사용할 수 없는건가요?

    • BlogIcon 다크pgmr 2018.03.09 15:24 신고 수정/삭제

      네. essential matrix를 구하는 목적이 두 카메라 시점간의 pose 관계(R|t)를 알기 위함인데, 이미 pose 관계를 알고 있다면 당연히 E나 F를 따로 구할 필요는 없습니다. E, F가 필요하다면 E = [t]xR, F = (K^t)^-1EK^-1로 구해서 사용하면 됩니다. [t]x를 행렬로 변환하는 방법은 위키피디아 https://en.wikipedia.org/wiki/Cross_product 를 참조하시면 됩니다.

  • 지나가는학생 2018.04.03 15:34 신고 ADDR 수정/삭제 답글

    'A의 영상좌표 p로부터 대응되는 B의 영상좌표 p'을 유일하게 결정할 수는 없지만 p'이 지나는 직선인 epiline l'은 유일하게 결정할수 있다' 입니다.
    본문에 이렇게 쓰셨는데 essential matrix 구할때는 p'= RP + t 로 p'를 구할 수 있다고 나와있어서
    여기서 p' 는 epiline 인가요?

    • BlogIcon 다크pgmr 2018.04.03 19:02 신고 수정/삭제

      영상좌표(2D)는 유일하게 결정할 수 없고, 3차원 좌표는 P' = RP + t로 상호 변환이 가능합니다.

  • 대학원생초짜 2018.05.17 11:49 신고 ADDR 수정/삭제 답글

    정말정말 많이 보고 배웁니다. 다크님 덕에 우리나라의 영상신호처리분야는 5년은 빨리 발전하는 거일 겁니다. 학생 입장에서는 원문의 책만 보고선 머리싸매다가 결국 쓰러지기 일쑤인데, 이 블로그 덕에 정말 빠르게 공부가 되네요. 정말 무언가 보답해드리고 싶지만 제가 해드릴 수 있는 건 이런 감사인사뿐이네요. 이 분야의 초심자들에게 다크님은 큰 스승 중 한 분입니다. 스승의 날은 좀 지났지만... 감사합니다.

  • 전자돌이 2018.07.31 11:18 신고 ADDR 수정/삭제 답글

    다크님이라면 Trifocal tensor에 대해 알고계실 것 같아 게시물에 없는 내용이지만 질문합니다.(물을 곳이 여기밖에 없어요 ㅠㅠ)
    카메라 방향은 바꾸지 않고 위치만 옆으로 이동시킨 경우 (P1 = [I|0], P2 = [I|-1;0;0], P3 = [I|-2;0;0] 과 같은 경우)
    이때 어떤 점이 세 프레임 동안 노멀 영상 좌표계에서 같은 위치(a, b, 1)에 투영 될 때 왜 constraint 결과값이 0이 되는 걸까요 ㅠㅠ
    분명히 옆으로 움직이고 있는데 같은 위치에 투영된다면 움직이고 있는 물체일텐데 ㅠㅠ
    제가 식을 잘못 이해한 건가요 ㅠㅠ
    위키피디아 링크 첨부합니다 ㅠㅠ https://en.wikipedia.org/wiki/Trifocal_tensor

    • BlogIcon 다크pgmr 2018.08.01 13:34 신고 수정/삭제

      질문이 언뜻 잘 이해가 안가는데요, "분명히 옆으로 움직이고 있는데 같은 위치에 투영된다면 움직이고 있는 물체일텐데"에서 물체가 움직이고 있다면 다른 위치에 투영되어야 하는 것 아닌지요. 같은 위치에 투영된다면 움직이지 않는다고 생각하는게 더 자연스러울 것 같습니다만..

    • 전자돌이 2018.08.01 17:04 신고 수정/삭제

      제 설명이 좋지 않았던 것 같습니다.
      카메라도 움직이고 있고 물체도 같은 방향으로 동일한 속도로 움직여서 물체와 카메라 사이의 상대적인 관계가 변하지 않아 영상의 같은 부분에 투영되는 경우에 대한 이야기였습니다. ㅠㅠ
      시간적으로 연속한 3개의 영상 프레임들 중에서 첫 영상 프레임을 취득할 때의 카메라 투영 행렬(K는 제외)을 [I|0]로 두고 그 다음은 [I|-1;0;0], [I|-2;0;0]이며 물체의 위치는 (0, 0, 1, 1), (1, 0, 1, 1), (2, 0, 1, 1) 처럼 변하여 모두 노멀 영상 좌표계의 (0, 0, 1)에 투영되는 상황입니다. ㅠㅠ

    • 전자돌이 2018.08.01 17:10 신고 수정/삭제

      이 때 각 카메라 투영 행열을 시간 순으로 P, P', P''로 정하고 T1, T2, T3를 계산한 후
      노멀 영상 좌표계에 투영된 (0, 0, 1)를 모두 x, x', x''로 하여 trilinear constraints 들 중 3개의 points들 간의 관계에 대한 식에 넣었을 때
      물체는 움직이고 있으므로 03x3이 나와서는 안될 것 같은데 제 계산에서는 03x3이 나와서 잘 이해가 되지 않아 질문드립니다. ㅠㅠ

    • 전자돌이 2018.08.01 17:12 신고 수정/삭제

      작은 답변과 관심이라도 주시면 감사하겠습니다. ㅠㅠ 이 이야기를 나눌 상대가 주변에 없어 혼자 고민중입니다.

    • BlogIcon 다크pgmr 2018.08.02 09:10 신고 수정/삭제

      네.. 그런데, 수식을 떠나서, 카메라와 물페와의 상대적인 관계가 변하지 않는다면 카메라 입장에서는 물체가 움직이지 않는다고 판단하는 것이 정상이 아닌지요.

    • 전자돌이 2018.08.02 09:31 신고 수정/삭제

      카메라가 월드좌표계에서 어떻게 움직이고 있는지 아는 상태라면 배경의 모션과 움직이는 물체의 모션을 구분할 수 있지 않나요?
      예를 들어 카메라가 정면으로 움직이면 영상 중간쯤의 한 지점(FOE 등)으로 부터 방사되는 형태의 모션이 나오는 것처럼.
      그리고 이때 추정된 모션들 중 그 점으로 향하지 않는 것들은 움직인다고 판단할 수 있듯이 영상 왼편이나 오른편에 움직임이 없다고 나타나는 모션들 또한 움직이는 중이라고 판단할 수 있는게 아닌지요 ㅠㅠ

    • BlogIcon 다크pgmr 2018.08.02 14:15 신고 수정/삭제

      네, 카메라의 움직임을 안다면 그로부터 물체의 움직임을 알 수 있다고 생각합니다. 그런데, trifocal tensor의 trilinear constraint는 카메라들 사이의 상대적 관계에 기반한 것이기 때문에 카메라의 절대적인 움직임과는 무관한 것으로 생각됩니다. 즉, 어찌됐든 카메라 입장에서 봤을 때는 물체가 움직이지 않고 있고 현재 풀고있는 식들이 모두 카메라 입장에서의 식들이기 때문에 (카메라와 물체가 동일하게 움직일 경우에는) 물체의 움직임을 구분하지 못하는 것은 당연하다고 생각됩니다. 물론, 물체가 아닌 배경의 점들을 가지고 식을 적용한다면 움직임이 감지되겠지요..