The Fundamental Matrix
앞선 강의에서 봤던 Essential matrix 같은 경우는 카메라가 canonical 한 경우(K=I)K=I)에만 해당되므로 canonical한 카메라가 아닌 general한 경우에 대해서도 생각해볼 필요가 있다.
먼저 projection matrix는 다음과 같았다.
M=K[I0]M′=K′[RTwc′−RTwc′Twc′]
만약 카메라가 canonical하다면, 각각의 image plane으로의 P의 projection은 pc=K−1p 와 p′c=K′−1p′ 이 될 것이다.(여기서 c첨자는 camera가 아니라 canonical을 의미함에 주의)
앞서서 canonical한 경우 아래의 식이 성립함을 확인했었다.
pTc[T×]Rp′c=0
따라서 아래의 식이 유도된다.
pTK−T[T×]RK′−1p′=0
이 때, F=K−T[T×]RK′−1 를 Fundamental Matrix라고 한다.
Fundamental matrix는 essential matrix와 비슷하지만, 추가적으로 camera matrix K,K′의 정보 또한 포함하고 있다는 것이 특징이다.
따라서, transformation 행렬인 R,T 뿐만 아니라 camera matrix K,K′를 몰라도 p,p′에 대응하는 epipolar line을 계산해낼 수 있다.
Essential matrix와 비슷하게 다음과 같이 ℓ′=FTp 그리고 ℓ=Fp′ 와 같이 epipolar line을 구한다.
(Essential matrix의 자유도는 5, Fundamental matrix의 자유도는 7)
Essential matrix와 마찬가지로 fundamental matrix도 이미지 상의 한 점을 아는 것만으로 해당 점에 대응하는 epipolar line이라는 constraint을 준다.
따라서 3D 상의 P와 카메라의 extrinsic, intrinsic matrix를 알지 못해도 p,p′ 사이의 관계를 세울 수 있다.

The Eight-Point Algorithm
여태껏 우리가 fundamental matrix를 알고 있다고 가정했는데, 사실 F를 몰라도 추정해낼 수 있다.
같은 scene에 대한 두 이미지에서 상응하는 8개의 점만 있다면 F를 찾을 수 있는데, 이 방법을 Eight-Point Algorithm이라고 한다.
각 상응하는 점 pi=(ui,vi,1)과 p′i=(u′i,v′i,1) 으로 pTiFp′i=0 의 관계가 성립한다.
이를 다음과 같이 쓸 수 있다.
[uiu′iuiv′iuiu′iviviv′iviu′iv′i1][F11F12F13F21F22F23F31F32F33]=0
Fundamental matrix의 up to scale 이 아니라 하나로 결정하기 위해서는 8개의 constraint이 필요하다.
(F의 자유도가 7이라는 게 모르는 값이 7개라는 것은 아님. F11부터 F33까지 다 모르는데, 이게 homogeneous coordinate이므로 F33=1로 고정해줄 수 있음. 따라서 우리가 실제로 모르는 값은 8개임)
[u1u′1u1v′1u1u′1v1v1v′1v1u′1v′11u2u′2u2v′2u2u′2v2v2v′2v2u′2v′21u3u′3u3v′3u3u′3v3v3v′3v3u′3v′31u4u′4u4v′4u4u′4v4v4v′4v4u′4v′41u5u′5u5v′5u5u′5v5v5v′5v5u′5v′51u6u′6u6v′6u6u′6v6v6v′6v6u′6v′61u7u′7u7v′7u7u′7v7v7v′7v7u′7v′71u8u′8u8v′8u8u′8v8v8v′8v8u′8v′81][F11F12F13F21F22F23F31F32F33]=0
W를 N≥8의 상응점들로부터 유도된 위의 왼쪽 N×9 matrix라고 하면, 이를
Wf=0
라고 표현할 수 있다. (f는 fundamental matrix를 펴서 벡터화한 것)
실제로는 noise로 인한 영향을 줄여주기 때문에 8개보다 많은 correspondences를 이용해서 행렬 W를 만드는 게 좋다.
이 때, W를 SVD를 이용하면 추정되는 fundamental matrix ˆF 를 구할 수 있다.
주의할 점은, 이렇게 구한 ˆF는 full rank인데, 실제 F는 rank가 2이다.
따라서, rank-2 approximation으로 SVD를 풀어야 한다.
위와 같은 조건을 만족하기 위해서는 다음과 같은 optimization problem을 풀면 된다.
minimizeF‖F−ˆF‖Fsubject todetF=0
이걸 SVD로 풀면, ˆF=UΣVT 이고, best rank-2 approximation은 다음과 같다.
F=U[Σ1000Σ20000]VT
The Normalized Eight-Point Algorithm
실제로, 위와같은 standard한 Eight-Point Algorithm은 정확하지 않다.
그리고 점 pi와 대응하는 epipolar line ℓi=Fp′ 과의 거리가 종종 매우 크다.
이러한 문제를 해결하기 위해 Normalized Eight-Point Algorithm을 사용한다.
기존의 eight point 알고리즘의 문제는 W가 SVD를 적용하기에 적절하지 않다는 것이다.
SVD가 잘 적용되려면, W가 0 혹은 0에 가까운 singular value를 하나 가지고 있어야 하고,
다른 singular value들은 0이 아니어야 한다.
하지만 (1832,1023,1) 과 같이 현대 카메라는 픽셀 값이 매우 큰 경우가 많다.
W를 만들기 위해 주어진 점들이 상대적을 좁은 지역에 모여 있다면,
pi와 p′i가 매우 유사할 것이고, 결과적으로 W가 매우 큰 singular value 하나와 상대적으로 작은 singular value들을 가지게 된다.
따라서 이러한 문제를 해결하기 위해 W에 다음의 두 가지를 만족하도록 전처리를 해주게 된다.
- 원점을 image의 center에 오도록 translation
- transformed된 점들과 원점과의 mean square distance는 2픽셀 (2mean distane를 곱해줌)
Normalize를 해주게 되면 좌표는
qi=Tpiq′i=T′p′i
가 되고 이 좌표를 이용해서 fundamental matrix Fq를 구해주면 된다.
하지만 Fq는 normalize된 좌표의 fundamental matrix이므로 de-normalize를 해줘야한다.
따라서
F=TTFqT′
을 통해 F를 구하면 훨씬 real world에서도 적용이 잘 된다.
Image Rectification
Epipolar geometry에서 흥미로운 case가 나타날 때가 바로 두 이미지가 평행할 때이다.
두 이미지가 평행할 때, 먼저 essential matrix E를 계산해보자.
두 카메라가 같은 intrinsic matrix K를 갖고, 평행하므로 rotation도 없다고 생각할 수 있다.(R=I)
이 경우, 특별히 x축을 따라서만 translation이 있다고 가정하면, T=(Tx,0,0)가 되고,
E=[T×]R=[00000−Tx0Tx0]
로 유도할 수 있다.
E를 알았으므로, 이미지의 한 점에 대응하는 epipolar line의 방향도 찾을 수 있다.
점 p′에 대응하는 epipolar line ℓ의 direction은 다음과 같다.
ℓ=Ep′=[00000−Tx0Tx0][u′v′1]=[0−TxTxv′]
이 경우, ℓ이 수평(horizontal)한 직선임을 확인할 수 있다.
ℓ′도 같은 방식으로 계산해낼 수 있다.
Epipolar constraint pTEp′=0 을 이용하면, v=v′ 을 유도할 수 있는데,
이는 p와 p′이 같은 v−좌표를 가짐을 의미한다.
따라서, rectification(주어진 두 image를 평행하게 만드는 작업)은 이미지의 대응점 간의 관계를 파악할 때 유용하다.
두 이미지를 rectifying할 때, 두 카메라 행렬 K,K′ 또는 transformation 행렬 R,T를 몰라도 된다.
대신, 위에서 정리한 normalized eight point 알고리즘을 통해 구한 fundamental matrix를 이용하면 된다.
Fundamental matrix를 이용하면 대응점 pi,p′i의 epipolar line인 ℓ′i,ℓi를 계산할 수 있다.
Epipole은 epipolar line들의 교점에 존재하기 때문에, epipolar lines set로부터 epipole e,e′을 추정할 수 있다.
하지만 real world에서는 noise가 존재하므로, 모든 epipolar line들이 한 점에서 만나진 않는다.
따라서, epipole을 찾는 건 모든 epipolar line들에 제일 딱 맞는(least squared error을 minimizing하는) 점을 계산하는 것과 같다.
각 epipolar line은 {x|ℓTx=0}을 만족하는 vector ℓ로 표현되므로, linear system of equation을 세워보면
[ℓT1⋮ℓTn]e=0
이 되고, 이를 SVD를 이용해서 epipole e를 찾으면 된다.
하지만 이렇게 epipole e,e′을 찾고 나면, 이 epipole들이 수평선축의 무한대에 있지 않다는 것을 알 수 있다 (정의에 의하면 두 이미지가 평행하므로 무한대에 있어야 함, 그런데 noise때문에 실제로는 그렇게 안됨)
따라서, 이미지들을 parallel 하게 만들어주기 위해서 epipole e를 homography 변환을 통해서 수평선축의 무한대로 mapping해주어야 한다.


먼저 두 번째 epipole인 e′을 horizontal axis의 무한대의 점 (f,0,0)로 mapping하기 위한 H2를 찾아야 한다.
여러가지 가능한 homography가 있을 수 있지만, 가장 타당한 것을 찾아야 한다.
먼저, homography가 transformation 행렬과 같이 이미지 center근처의 점들에 rotation과 translation을 적용해야 한다.
그러기 위해서는, 먼저 두 번째 이미지를 homogeneous coordinate에서 center가 (0,0,1)이 되도록 translate 시킨다.
T=[10−width201−height2001]
이와 같이 translation을 적용하고 나면, epipole이 horizontal axis위의 점 (f,0,1)이 되도록 회전을 해줘야 한다.
만약 평행이동한 epipole Te′이 homogeneous coordinate (e′1,e′2,1) 이 된다면, rotation matrix는
R=[αe′1√e′21+e′22αe′2√e′21+e′220−αe′2√e′21+e′22αe′1√e′21+e′220001]whereα={1,e′1≥0−1,otherwise
과 같다.
회전까지 해주고 나면, (f,0,1)을 수평선축의 무한대의 점 (f,0,0)으로 가져와야 하므로
G=[100010−1f01]
을 적용해준다.
그러면 마침내 무한대에 있는 epipole을 얻을 수 있다.
하지만 다시 regular image space로 가져와야 하므로 최종적으로 H2는
H2=T−1GRT
가 된다.
합리적인 H2를 찾았으므로 first image의 matching homography H1도 찾아줘야 한다.
H1을 유도하는 과정은 범위를 벗어나므로 그냥 적어보자면,
argminH1∑i‖H1pi−H2p′i‖2
H1=HAH2M
의 꼴을 갖고, (F=[e]×M)
HA는
HA=[a1a2a3010001]
이다. (a1,a2,a3는 뒤에서 추가 설명)
위의 식들이 갑작스럽게 느껴질 수 있다.
먼저 M이 무엇인지부터 알아야 한다.
3×3의 skew-symmetric matrix A의 흥미로운 성질은, A=A3 이 성립한다는 것이다.
어떤 cross product matrix인 [e]×이건 skew-symmetric 이므로
F=[e]×M=[e]×[e]×[e]×M=[e]×[e]×F
를 유도할 수 있다.
따라서
M=[e]×F
이다.
만약 M의 column들이 e의 스칼라배만큼 더해진다해도, F=[e]×M은 여전히 up to scale이다.
따라서, M을 더 general하게 표현하면
M=[e]×F+evT
이다. (실제로는, vT=[111]로 했을 때 제일 잘 됨)
그래서 결론적으로 H1을 풀기 위해선, 위에서의 a=(a1,a2,a3)를 찾아야 한다.
우리가 이제 H2와 M을 알고 있으므로 ^pi=H2Mpi 그리고 ^pi′=H2p′i 이라 하면,
argminHA∑i‖HA^pi−ˆp′i‖2
가 된다.
더 나아가, ^pi=(^xi,^yi,1), ^pi′=(^xi′,^yi′,1) 라고 하면, minimization problem 이 다음과 같이 바뀐다.
argmina∑i(a1ˆxi+a2ˆyi+a3−^xi′)2+(ˆyi−^yi′)2
ˆyi−^yi′가 상수이므로, 더 간략하게 바꿔보면,
argmina∑i(a1ˆxi+a2ˆyi+a3−^xi′)2
가 된다.
W=[ˆx1ˆy11⋮ˆxnˆyn1]b=[^x1′⋮^xn′]
라고 하면, 궁극적으로 Wa=b 꼴이 된다.
이렇게 a를 구하고 나면 HA와 H1도 구할 수 있다.
따라서, homography H1,H2를 위와 같은 과정을 거쳐 구해낸다.
Eight-Point Algorithm과 homography 구현 코드가 궁금하다면,
https://github.com/ianpark318/CS231A/blob/main/ps2/ps2_code/PSET2.ipynb 참고
'3D\Multiview Geometry > CS231A' 카테고리의 다른 글
CH04. Stereo Systems (2) (0) | 2023.03.05 |
---|---|
CH04. Stereo Systems (1) (1) | 2023.03.02 |
CH03. Epipolar Geometry (1) (0) | 2023.02.12 |
CH02. Single View Metrology (2) (0) | 2023.02.09 |
CH02. Single View Metrology (1) (0) | 2023.02.08 |