- OpenCV: Camera Calibration and 3D Reconstruction
- OpenCV: Fisheye camera model
- 歪みなしカメラ画像の座標変換 - えやみぐさ
カメラ座標
$$ P_c = \left( \begin{array}{c} X_c \ Y_c \ Z_c \end{array} \right) $$
$$ x’ = X_c / Z_c \ y’ = Y_c / Z_c \ r^2 = x’^2 + y’^2 \ \theta = {\rm atan}(r) $$
歪み補正 / Distortion correction
$$ \theta_d = \theta ( 1 + k_1 \theta^2 + k_2 \theta^4 + k_3 \theta^6 + k_4 \theta^8 )\ x’’ = \frac{ \theta_d }{r} x’ \ y’’ = \frac{ \theta_d }{r} y' $$
カメラ座標変換
$$ \left( \begin{array}{c} u \ v \end{array} \right) =
\left( \begin{array}{ccc} f_x & 0 & c_x \ 0 & f_y & c_y \ \end{array} \right)
\left( \begin{array}{c} x’’ \ y’’ \ 1 \end{array} \right) $$
OpenCV
K = np.array([
[ 1, 0, 320 ],
[ 0, 1, 240 ],
[ 0, 0, 1 ],
], dtype=np.float32)
D = np.array([ 1, 0, 0, 0 ], dtype=np.float32)
undistorted_points = np.array([[
[ 0, 0 ],
[ 0, 10 ],
[ 10, 0 ],
[ 10, 10 ],
]], dtype=np.float32)
distorted_points = cv2.fisheye.distortPoints(undistorted_points, K, D)
distorted_points
array([[[320. , 240. ],
[320. , 244.65497],
[324.65497, 240. ],
[323.44827, 243.44826]]], dtype=float32)