[영상 Geometry #7] Epipolar Geometry

영상처리 2013. 7. 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 다크 프로그래머


  • 이전 댓글 더보기
  • 염소 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는 카메라들 사이의 상대적 관계에 기반한 것이기 때문에 카메라의 절대적인 움직임과는 무관한 것으로 생각됩니다. 즉, 어찌됐든 카메라 입장에서 봤을 때는 물체가 움직이지 않고 있고 현재 풀고있는 식들이 모두 카메라 입장에서의 식들이기 때문에 (카메라와 물체가 동일하게 움직일 경우에는) 물체의 움직임을 구분하지 못하는 것은 당연하다고 생각됩니다. 물론, 물체가 아닌 배경의 점들을 가지고 식을 적용한다면 움직임이 감지되겠지요..

  • 컴공 2019.10.17 16:27 ADDR 수정/삭제 답글

    안녕하세요. Epipolar geometry에 대해 이해할 수 있게 되었습니다.
    감사드립니다.
    A의 영상좌표 p로부터 대응되는 B의 p'이 지나는 직선인 epiline l'은 어떻게 구하게되는지 이해가 되었는데, 그렇다면 epiline l'에서 어느 point가 A의 영상좌표 p와 매칭되는지를 구하는 문제는 어떤 식으로 접근하는게 좋을까요?

    • BlogIcon 다크pgmr 2019.11.12 23:16 신고 수정/삭제

      그건 구할 수 없습니다.
      A의 영상좌표 p에 대응되는 3차원 공간의 점은 무한히 많은 점이 존재합니다 (카메라 원점과 p를 잊는 ray 상의 모든 점들이 p로 투영되기 때문). 이 ray를 B에 투영한 것이 epiline l'입니다. 즉, 한 점에 대응되는 epiline은 구할 수 있지만, 한 점에 대응되는 점은 구할 수 없습니다 (한 점으로 특정할 수 없음).

  • 자연산흑곰 2019.12.27 15:46 ADDR 수정/삭제 답글

    안녕하세요 다크님 오랜만에 질문드립니다!
    보통 스트레오 카메라를 보면 같은 보드에 붙어 두 카메라의 각이 180도가 됩니다. 만약, 서로 다른 보드를 사용하는 카메라가 약 150도 정도 기울어져 있다 하여도 똑같은 메소드를 사용 할 수 있을까요?

  • 나그네 2019.12.29 14:13 ADDR 수정/삭제 답글

    안녕하세요 덕분에 항상 많은것을 배우고 갑니다.
    항상 이론으로만 E,F함수 구하는 법을 익히고 있었는데
    이번에 OpenCV를 통해 직접 구현을하려니 뭔가 많이 헛갈려서 이렇게 질문드리게 됐습니다.

    OpenCV에 findEssentialMat 함수를 활용하려하는데요.

    글에 적힌것 처럼 findEssentialMat함수의 Input데이터로 왜 카메라 내부 파라미터를 요구하는지 의문입니다. (principle point, focal)

    위 E matrix구하는 식을 보면 카메라 내부 파라미터 변수는 안 보이는데요...
    제가 E matrix에 대해 이해가 부족하여 실제론 E matrix를 구할 때도 사실 카메라 내부 파라미터가 필요한 것인지... 혼동이 오네요

    • BlogIcon 다크pgmr 2020.02.24 11:59 신고 수정/삭제

      E는 정규화된(normalized) 매칭 좌표들 사이의 변환관계이기 때문에 픽셀좌표를 정규 좌표로 바꾸기 위해 카메라 내부 파라미터가 필요합니다.

  • 도비 2020.08.11 18:09 ADDR 수정/삭제 답글

    안녕하세요 공부하는데 많은 도움이 되서 늘 감사하고 있습니다.
    여쭤볼게
    중간에 Rotation의 자유도가 3 Translation의 자유도가 2라고 총 5의 자유도를 가진다고 하셨는데,
    rotation의 자유도는 theta 하나만 존재하지 않나요?

    • BlogIcon 다크pgmr 2020.08.19 10:11 신고 수정/삭제

      물체가 로봇 청소기처럼 바닥에서만 움직인다면 rotation은 1자유도가 맞습니다. 하지만 드론이나 비행기처럼 공중에서 움직인다면 3자유도가 됩니다.

  • 지나가는 사람 2020.12.31 08:28 ADDR 수정/삭제 답글

    안녕하세요~!
    영상처리를 업으로 삼고 있진 않지만, 너무나도 좋아하는 학문이라 취미삼아 구현하고 공부하고 있는 사람입니다. 항상 너무너무 잘 보고 있어 우선 감사하다는 말씀을 드립니다.
    하나 궁금한게 이번에 single카메라를 기반으로 들고 다니면서 제가 지나온 경로를 계산하는 SLAM기술 비스무리한 것을 만들고 있는데요.
    그 과정중에 1초 Frame 단위로 끊어서 2개의 이미지를 만든다음 optical flow를 활용해 8개의 매칭 점을 얻어 E Matrix와 F Matrix를 계산했습니다. 그런데 Baseline계산이 난감하더군요.
    이 경우의 Baseline은 제가 카메라를 1초 동안 이동시킨 거리가 될탠데, 추가적인 가속도 센서라도 달아서 계산해야 하나요??
    E matrix가 두 영상간의(또는 카메라) 상대적 이동 거리 & 회전 값을 상징하는 matrix니 여기서 계산이 가능한 부분 아닌가요?? (코딩을 잘못한건지 뭔지, 너무 안 되서 제가 잘못이해하고 있는지 궁금합니다 ㅠㅠ)

    • BlogIcon 다크pgmr 2021.01.04 13:25 신고 수정/삭제

      문제를 잘 파악하고 계시는 것 같습니다. E나 F로 구하는 t(이동벡터)는 스케일을 알수 없습니다(항상 길이가 1). 처음 시작점에서는 E를 분해해서 얻은 R, t와 베이스라인 스케일을 이용해서 초기 3D를 결정하고, 이후에는 PnP를 이용해서 R, t를 구해나가는 것이 일반적이라고 합니다.

    • BlogIcon 지나가는 사람 2021.01.06 16:37 수정/삭제

      답변 너무 감사합니다!
      참 알아서 혼자 공부한다는게 배우는것도 많고 보람찬 경우도 많지만, 안 되는 것을 계속 붙잡으면서 시간 낭비하고 답답한 경우도 많은데 덕분에 방향을 찾았네요 ㅎㅎ
      새해 복 많이 받으시고 건강하시기 항상 바랍니다.

  • Heart_AcE 2021.01.21 10:48 ADDR 수정/삭제 답글

    다크 프로그래머님, 안녕하세요. 올려주신 글들 잘 읽었습니다. 저는 실험 영상을 분석해서 연구를 진행 중인데 실험 장비의 한계로 인해 여러 각도에서 영상을 찍을 수가 없어서 혹시 수학적으로 특정 각도의 영상을 구현해볼 수 있지 않을까 하던 차에 좋은 글을 읽게 되었습니다. 감사합니다.

    그런데 이번 epipolar geometry를 제가 생각하는 방식으로 적용이 가능한지 궁금해서 여쭤봅니다.

    글에서는 두 이미지로부터 essential matrix를 계산해서 각 이미지를 촬영한 카메라 간의 기하학적 관계를 알수 있다고 하셨는데요. 또 두 카메라 간의 기하학적인 관계(회전, 평행이동)를 알고 있다면 바로 essential matrix를 계산할 수 있다고 하셨습니다.

    그럼 만약에 제가 카메라의 위치를 잘 알고 있고 그 카메라로부터 촬영한 한개의 이미지를 가진 상태에서 그 카메라를 회전 또는 평행이동 시킬 위치를 알고 있다면 실제로 이동시켜 촬영하지 않더라도 이동된 위치에서 얻은 이미지를 얻을 수 있을까요?
    예를 들어 <그림 1>에서 A위치와 B 위치 사이의 가상의 C위치가 있고 카메라를 C위치로 이동시키는 변환행렬(A->C or B->C)을 알고 있다면 실제로 C 위치에서 촬영을 안해도 C 위치에서 찍은 것 같은 이미지를 A, B에서 찍은 이미지만 가지고도 얻을 수 있을 수 있을까요?

    • BlogIcon 다크pgmr 2021.01.22 00:04 신고 수정/삭제

      안녕하세요. 다른 시점의 영상을 구하기 위해서는 영상에 있는 물체들과 카메라와의 실제 거리를 알면 가능합니다. 그런데, 영상 하나에서는 거리가 나오지 않기 때문에 스테레오 카메라를 사용하거나 아니면 real sense 등과 같은 RGBD 센서를 사용해야 할 것 같습니다.
      그리고, <그림2>에 설명했듯이 두 이미지로부터 기하학적 관계(R,t)는 구할 수 있지만 공간의 스케일(scale)은 구할 수 없습니다. Essential Matrix를 분해해서 나오는 t 벡터는 항상 크기가 1입니다. epipolar geometry을 실제 문제에 적용할 때에 가장 문제가 되는 것이 스케일을 구하는 것입니다. 스케일(실제 거리)을 구하기 위해서는 어떤 절대적인 reference가 있거나, 다른 부가적인 정보가 필요합니다.

    • BlogIcon Heart_AcE 2021.01.22 15:45 수정/삭제

      실험을 직접하고 있는터라 카메라와 물체간 거리는 실제로 측정해서 사용하면 되겠네요.

      컴퓨터 영상 처리는 처음 해보는 일이라 정말 막막 했는데 큰 도움이 되었습니다. 감사합니다.

  • helix 2021.03.03 14:26 ADDR 수정/삭제 답글

    안녕하세요. 항상 유익한 정보 감사드립니다.
    혹시 카메라 3개 이상에 대한 기하학도 공부를 하셨나요???
    개인적으로 공부를 해보고 싶은데, 자료가 마땅히 안 나오네요.ㅠ(논문이고 책이고...)
    혹시 아시는 검색 키워드라도 있으시다면, 알려주실수 있을까요??

    • BlogIcon 다크pgmr 2021.03.08 10:55 신고 수정/삭제

      영상기하학은 single-view, two-view, multiple-view geometry 순서로 단계가 높아집니다. multiple-view geometry로 검색해 보시기 바랍니다. 이 분야에서 대표적인 교과서로는 Richard Hartley의 "multiple view geometry in computer vision"이라는 책이 있습니다.

    • BlogIcon hellix 2021.03.23 08:36 수정/삭제

      정말 감사합니다!!

  • mcp 2021.04.20 16:09 ADDR 수정/삭제 답글

    안녕하세요 자주 드나드며 좋은 정보를 얻어가고 있습니다. 너무 감사합니다.
    궁금한 점이 있는데요, 3x3 essential matrix를 보면 형태는 homography와 같은데요 homography는 평면에 대해서만 성립하는데, 5쌍의 매칭쌍의 3d 좌표가 모두 평면에 존재하지 않으므로 성립하지 않는것 같아서 헷갈리네요. 수식으로 말고 직관적으로 이해하고싶은데, 어떻게 단일 essential matrix가 존재할 수 있는지 쉽게 이해가질 않네요. 잘못 이해하고 있는 부분이 어디일까요?

    • BlogIcon 다크pgmr 2021.04.20 19:06 신고 수정/삭제

      모두 3x3 행렬이긴 하지만, 호모그래피는 p' = Hp, essential은 p'Ep = 0으로 관계되는 방식에 차이가 있습니다. 그리고, 3 x 3 행렬이라고 해서 모두 호모그래피 행렬인 것은 아닙니다. 3 x 3 행렬 중에서 평면에서 평면으로의 projection mapping을 나타내는 행렬인데, https://docs.opencv.org/master/d9/dab/tutorial_homography.html 내용을 참조 바랍니다.

    • BlogIcon mcp 2021.04.21 10:24 수정/삭제

      답변 감사합니다 많은 생각이 필요한 부분 같습니다. 큰 도움이 되었네요

  • lsw716 2021.06.03 09:20 ADDR 수정/삭제 답글

    안녕하세요 혹시 스테레오 카메라에서 Scale Factor는 Disparity로 구해야 할까요? Triangulation을 한 후 Scale Factor을 구해야 하는데 스테레오 카메라에서 어떻게 구할 수 있을까요

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

      제가 stereo camera를 직접 써본 것은 아니지만 stereo camera에서는 두 카메라 사이의 baseline을 알고 있다는 가정 하에 문제를 푸는 것 아닌지요? baseline 값이 scale factor 역할을 하는 것으로 생각됩니다. 그리고 stereo camera에서는 baseline과 disparity로부터 바로 거리가 나오는 별도의 식이 있는 것으로 아는데.., 조금 관련 자료를 찾아보시기 바랍니다.

    • BlogIcon lsw716 2021.06.04 11:31 수정/삭제

      답변 감사드립니다! 혼자 계속하니 답답했는데 방향을 찾은것 같습니다. 큰 도움이 되었습니다.

  • 지나가는 사람 2021.07.09 16:13 ADDR 수정/삭제 답글

    연구를 하다 보니 한가지 더 궁금한게 생겨 찾아뵙게 됐습니다.
    이래저래 다양한 환경에서 E Matrix계산을 테스트하다 보니, Feature의 매칭쌍을 찾는 부분부터가 불가능한 Case가 은근히 많더라구요.
    그런데 생각해보니 E Matrix는 카메라 설계단에서부터 해결할 수 있는 부분인 것 같다는 생각이 들어서요.

    두개의 카메라가 항상 고정된 T,R 관계를 갖도록 설계한다면, 딱히 매칭쌍을 찾고 이를 통해 E Matrix를 추정하는 과정 없이도, E Matrix를 정의할 수 있겠다라는 생각이 드는데 맞나요?

    예를들어 요즘 나오는 핸드폰이나, Intel realsense 같은 기기들은 항상 카메라들이 바라보는 방향과 위치가 고정이고, baseline도 카메라 간의 사이 거리로 설정하면 되니,
    매칭쌍을 찾고 이를통해 E Matrix를 계산는 과정이 없어도 바로 E matrix를 정의할 수 있는 게 맞나요?

    덕분에 많이 배우고 있습니다.
    코로나 조심하시고 항상 건강하세요.

    • BlogIcon 다크pgmr 2021.07.10 23:37 신고 수정/삭제

      네, E는 두 카메라의 R, t가 주어지면 식 (4)와 같이 E = [t]xR로 바로 계산이 됩니다. 그러니 스테레오 카메라 같은 경우는 기구 정보로부터 E 계산이 가능하겠네요. 그런데, 공정오차가 있을수도 있고 R, t를 모를 경우가 있으니 캘리브레이션 과정은 필요해 보입니다.

  • lsw716 2021.09.09 10:54 ADDR 수정/삭제 답글

    안녕하세요 저번에 말씀해 주신 stereo camera에서 두 카메라 사이의 baseline을 알고 있다는 가정 하에 Depth를 구하는 문제를 풀려고 시도해보았습니다. Disparity(두 카메라의 시차)를 가지고 Baseline이 있으니 Depth를 구할 수 있다고 생각하고 구했더니 실제 Depth와 Disparity의 Depth가 차이가 납니다. 일단 두 카메라의 Correspondence는 확실하게 잡아주었고, Focal length * baseline / Disparity로 해서 관련자료를 찾아서 구해보았습니다. 혹시 ORB SLAM이나 Openvslam에는 Scale factor vector라는 변수를 Disparity전에 오른쪽 카메라 픽셀에 곱해주는데, 혹시 Scale factor vector라는게 Baseline이 있어도 필요한건지 혹시 여쭤 볼 수 있을까요? 제 상식상에는 이미 Baseline(두 카메라의 거리)이 있으니 Depth를 구할 수 있다고 보는데 이 것도 상대적으로 구하는건지 그래서 Scale Factor를 곱하는 것인지 계속 궁금증만 커져 가네요 ㅜ ...

    • BlogIcon 다크pgmr 2021.09.09 23:07 신고 수정/삭제

      글쎄요, ORB SLAM을 제가 직접 살펴본 적은 없어서 scale factor vector라는게 뭔지는 잘 모르겠네요. 어쨌든, 스테레오 카메라에서 두 카메라가 캘리브레이션 되었고 (각각의 intrinsic 파라미터와 두 카메라 사이의 R|t가 구해진 상태) baseline을 안다면 매칭 쌍으로부터 다른 부가정보 없이 depth를 구할 수 있음은 당연한 얘기로 보입니다.

    • BlogIcon lsw716 2021.09.10 10:37 수정/삭제

      답변 감사드립니다. 저도 수학적으로 baseline이 있다면 depth를 다른것없이 구할 수 있다고 생각하는데, 두 이미지의 Correspondence를 정확하게 구해서 Disparity를 구해보면 이미지에 센터로 갈 수록 그 오차가 커지는데 혹시 그 시차를 구할 때 이미지 해상도가 관련이 있을까요? 여기 Stanford 자료 (페이지 25)에 보면 http://web.stanford.edu/class/cs231a/lectures/lecture6_stereo_systems.pdf
      depth = focal length * baseline / disparity이며, disparity = uR - uL이라 위와 같이 구성했지만 이미지에 센터로 갈 수록 그 오차가 커지는 현상이 발생합니다. 혹시 이미지 해상도가 1000일때와 500일때 disparity는 같지 않다고 보는데 이 부분(이미지 해상도)에 영향을 주는 부분이 위 식에는 들어있지 않은것 같아서요 ... 혹시 이 부분과 관련이 있을까요? (흠 댓글이 너무 길었네요 ㅠㅠ)

    • BlogIcon 다크pgmr 2021.09.10 10:52 신고 수정/삭제

      해상도가 바뀌면 focal length도 같이 바뀌기 때문에 문제가 되지는 않습니다. 제가 스테레오를 직접 다뤄본 것은 아니지만 몇가지 예상되는 문제들은 있습니다. 일단 두 카메라의 초정거리가 서로 다를텐데 하나의 focal length로 식을 세우는 것은 조금 이상해 보입니다. 그런 문제를 해결하기 위해서는 픽셀좌표계가 아니라 정규좌표계로 변환해서 계산해야 할 것으로 생각됩니다. 그리고 두 카메라의 축이 완전히 일치하는 것은 아니기 때문에 rectification이란 과정을 먼저 해주어야 하는 것으로 알고 있습니다.

    • BlogIcon lsw716 2021.09.10 16:48 수정/삭제

      답변 감사드립니다! 말씀해주신대로 진행해보도록 하겠습니다.

  • mathmatichell 2021.09.14 17:56 ADDR 수정/삭제 답글

    안녕하세요 수학이 잘 익숙하지 않은 대학생입니다. 궁금한점이 있을때마다 항상 다크님 글을 보면서 문제를 해결하지만 이번에는 잘 해결이 되지 않네요.. Epipolar Geometry 관련 실험을 하려고 하는데 1. Essential Matrix에서 추출된 R은 두 카메라 사이의 좌표계 변환이랑 동일한게 맞나요..? 2. 두 카메라에 특징점을 충분히 잡았을 때 Essential Matrix를 구하는 과정을 보니 카메라의 정보 (fx,fy,cx,cy)를 안써도 되는것 같은데 (카메라 왜곡이나 이런걸 고려 안하고) 카메라 정보가 없어도 두 카메라 좌표계의 상대값을 구할 수 있나요? (한 카메라는 고정되어 있어서 상대적 값만 필요합니다..)
    처음 질문하는거라 너무 많은 내용을 질문드렸네요 .. 죄송합니다

    • BlogIcon 다크pgmr 2021.09.14 21:56 신고 수정/삭제

      1. 네 맞습니다.
      2. 특징점으로 구할 수 있는 것은 아마 fundamental matrix일텐요. 내부 파라미터 없이 essential matrix 구하는 것은 제가 아는 한에는 없는 것 같습니다.

    • BlogIcon mathmatichell 2021.09.15 13:41 수정/삭제

      감사합니다. 어제 질문 드릴 내용에서 제가 생략한 부분이 있습니다. 이게 rotation matrix의 경우 cos sin으로 이뤄진 회전 변환이 단위가 없어도 가능하지만 translation matrix 경우 단위가 나오지 않는데요 이 부분은 단순히 두 카메라의 절대좌표계에서의 x,y,z 차이의 비율로 생각하면 되는건가요?? (translation이 [2;1;1] 이렇게 나오면 값은 몰라도 x차이가 y z 차이의 2배라는건가요..?)

    • BlogIcon 다크pgmr 2021.09.15 23:15 신고 수정/삭제

      translation은 비율관계 보다는 방향벡터로 이해하시면 좋습니다. 해당 translation 벡터 방향에 다른 쪽 카메라가 있다고 해석하시면 됩니다. (이미 아시겠지만) 반환되는 translation 벡터의 크기는 항상 1인데, 그 이유는 그림 2에서 설명한 스케일 문제 때문입니다.

  • 3333 2021.09.24 08:18 ADDR 수정/삭제 답글

    두 대의 카메라가 있는 스테레오 환경에서 캘리브레이션 진행 시, 카메라 영상의 전체를 사용하지 않고 중앙부분만 크랍해서 캘리브레이션에 사용하면 single카메라 캘리브레이션과 stereo 카메라 캘리브레이션에 각각 어떤 영향이 있을까요? 아무 영향 없이 사용가능할까요?

    전체영역을 사용하면 600 x 600 인 카메라에서, 중앙부분의 200 x 200 을 크랍하면
    600 x 600 해상도 사용시의 (200, 200) 지점이 크랍이후에는 (0, 0)으로 변경되는 상황입니다.

    • BlogIcon 다크pgmr 2021.09.24 09:32 신고 수정/삭제

      질문하신 의도를 잘 이해하지 못해서(왜 중앙부분만 사용하는지) 잘은 모르겠습니다. 어쨌든 기본적으로는 중앙부분만 사용한다고 해도 캘리브레이션 자체는 가능할 것 같지만 정확도는 떨어질 것으로 생각됩니다. single 카메라에서는 왜곡(radial distortion)이 없다면 정확도 외에 큰 문제는 없을 것 같고, stereo에서는 중앙에 두 카메라의 시야가 겹치는 부분만 충분하다면 역시 큰 문제될 것은 없어 보입니다. 하지만 중앙만 맞추어서 캘리브레이션한 결과를 영상 전체에 적용하려면 역시 (정확도 측면에서) 문제가 생길 가능성이 크다고 생각됩니다. 예를 들어, 포물선을 일부 구간만 보고 직선으로 근사했는데, 그 구간 내에서는 큰 문제가 없겠지만 근사직선을 포물선 전체에 적용하려면 문제가 발생하겠지요.