- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算投影和逆矫正变换映射。本质上,这是 initUndistortRectifyMap 的逆操作,以适应投影仪(‘逆相机’)在投影仪-相机对中的立体校正。
该函数计算联合投影和逆校正变换,并以 remap 所需的地图形式表示结果。投影后的图像看起来像是原始图像的一个扭曲版本,但一旦通过投影仪投射,应该视觉上与原始图像匹配。对于单目相机,newCameraMatrix 通常等于 cameraMatrix,或者可以通过 getOptimalNewCameraMatrix 计算以更好地控制缩放。对于投影仪-相机对,newCameraMatrix 通常设置为由 stereoRectify 计算得到的 P1 或 P2。
投影仪在坐标空间中根据 R 不同地定向。对于投影仪-相机对,这有助于像 initUndistortRectifyMap 对相机所做的那样对齐投影仪,以创建一个立体校正对。这允许两幅图像上的极线变得水平并且具有相同的 y 坐标(对于水平对齐的投影仪-相机对而言)。
该函数构建了用于 remap 的逆映射算法的地图。也就是说,对于目标图像(即投影和逆校正后的图像)中的每个像素 (u, v),函数计算源图像(即原始数字图像)中对应的坐标。应用以下过程:
newCameraMatrix x ← ( u − c ′ x ) / f ′ x y ← ( v − c ′ y ) / f ′ y Undistortion though equation shown is for radial undistortion, function implements cv::undistortPoints() r 2 ← x 2 + y 2 θ ← 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 1 + k 4 r 2 + k 5 r 4 + k 6 r 6 x ′ ← x θ y ′ ← y θ Rectification [ X Y W ] T ← R ∗ [ x ′ y ′ 1 ] T x ′ ′ ← X / W y ′ ′ ← Y / W cameraMatrix m a p x ( u , v ) ← x ′ ′ f x + c x m a p y ( u , v ) ← y ′ ′ f y + c y \begin{array}{l} \text{newCameraMatrix}\\ x \leftarrow (u - {c'}_x)/{f'}_x \\ y \leftarrow (v - {c'}_y)/{f'}_y \\ \\\text{Undistortion} \\\scriptsize{\textit{though equation shown is for radial undistortion, function implements cv::undistortPoints()}}\\ r^2 \leftarrow x^2 + y^2 \\ \theta \leftarrow \frac{1 + k_1 r^2 + k_2 r^4 + k_3 r^6}{1 + k_4 r^2 + k_5 r^4 + k_6 r^6}\\ x' \leftarrow \frac{x}{\theta} \\ y' \leftarrow \frac{y}{\theta} \\ \\\text{Rectification}\\ {[X\,Y\,W]} ^T \leftarrow R*[x' \, y' \, 1]^T \\ x'' \leftarrow X/W \\ y'' \leftarrow Y/W \\ \\\text{cameraMatrix}\\ map_x(u,v) \leftarrow x'' f_x + c_x \\ map_y(u,v) \leftarrow y'' f_y + c_y \end{array} newCameraMatrixx←(u−c′x)/f′xy←(v−c′y)/f′