Essential Matrix와 Epiline 구하기
Essential Matrix $ \mathbf{E} $는
두 카메라의 normalized image plane에서의 대응점들(correspondance) 사이의 기하학적 관계를 나타냄.
Essential Matrix를 통해
- camera calibration이 수행된 normalized image plane의 점 $ \mathbf{p}_1 $에 대해
두 번째 카메라의 epiline $ \mathbf{l}' $을 구할 수 있음.
2024.06.28 - [Programming/DIP] - [CV] Epipolar Geometry [작성중]
2024.07.16 - [Programming/DIP] - [CV] Example: Fundamental Matrix and Epipolar Line (등극선)
기본 개념
- Essential Matrix $ \mathbf{E} $:
- 두 카메라 간의 Rotation (회전) $ \mathbf{R} $과
- Translation (평행 이동) $ \mathbf{t} $를 포함함.
- Epiline:
- stereo camera에서 한 카메라의 이미지 점에 대응하는 다른 카메라의 이미지 상의 직선.
수식
주어진 첫 번째 카메라의 normalized image plane 상의 점 $ \mathbf{p}_1 $에 대해 두 번째 카메라의 epiline $ \mathbf{l}' $은 다음과 같이 계산됨:
$$
\mathbf{l}' = \mathbf{E} \mathbf{p}_1
$$
여기서:
- $ \mathbf{E} $는 Essential Matrix.
- $ \mathbf{p}_1 $은 첫 번째 카메라의 normalized image plane 상의 점.
예제
주어진 값
- Essential Matrix $ \mathbf{E} $:
$$
\mathbf{E} = \begin{bmatrix}
0 & -1 & 0 \\
1 & 0 & -0.5 \\
0 & 0.5 & 1
\end{bmatrix}
$$
- 첫 번째 카메라의 점 $ \mathbf{p}_1 $:
$$
\mathbf{p}_1 = \begin{bmatrix}
0.2 \\
0.3 \\
1
\end{bmatrix}
$$
계산
두 번째 카메라의 normalized image plane상의 epiline $ \mathbf{l}' $을 계산하기 위해, 주어진 값을 위의 수식에 대입함:
$$
\mathbf{l}' = \mathbf{E} \mathbf{p}_1 = \begin{bmatrix}
0 & -1 & 0 \\
1 & 0 & -0.5 \\
0 & 0.5 & 1
\end{bmatrix} \begin{bmatrix}
0.2 \\
0.3 \\
1
\end{bmatrix}
$$
행렬 곱셈을 수행하면:
$$
\mathbf{l}' = \begin{bmatrix}
-0.3 \\
0.2 - 0.5 \\
0.5 \cdot 0.3 + 1
\end{bmatrix} = \begin{bmatrix}
-0.3 \\
-0.3 \\
1.15
\end{bmatrix}
$$
따라서 두 번째 카메라의 normalized image plane 상에서의 epiline $ \mathbf{l}' $은 다음과 같음:
$$
-0.3x - 0.3y + 1.15 = 0
$$
Python 코드
다음은 Python을 사용하여 동일한 계산을 수행하고 epiline을 시각화하는 코드임:
import numpy as np
import matplotlib.pyplot as plt
# Essential Matrix
E = np.array([[0, -1, 0],
[1, 0, -0.5],
[0, 0.5, 1]])
# Point in the first normalized image plane
p1 = np.array([0.2, 0.3, 1])
# Calculate the epiline in the second image plane
l_prime = np.dot(E, p1)
# Define the range of x values for plotting
x = np.linspace(-1, 1, 100)
# Calculate the corresponding y values
y = -(l_prime[0] * x + l_prime[2]) / l_prime[1]
# Plot the epiline
plt.plot(x, y, '-r', label='Epiline')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Epiline in the Second Image')
plt.legend()
plt.grid()
plt.show()
'Programming > DIP' 카테고리의 다른 글
[CV] 8-point algorithm: Fundamental Matrix (0) | 2024.07.17 |
---|---|
[CV] Stereo Calibration or Stereo Camera Calibration (0) | 2024.07.16 |
[CV] Example: Fundamental Matrix and Epipolar Line (등극선) (1) | 2024.07.16 |
[CV] Pose: Position + Orientation (0) | 2024.07.09 |
[CV] Intrinsic Rotation and Extrinsic Rotation (0) | 2024.07.07 |