1️⃣ 为什么 keystone 一定要用 findHomography
Keystone 的本质
-
投影面 不与成像面平行
-
产生 透视变换(projective transform)
数学上:
x′y′w′\]=\[h11h12h13h21h22h23h31h321\]\[xy1\]\\begin{bmatrix} x' \\\\ y' \\\\ w' \\end{bmatrix} = \\begin{bmatrix} h_{11}\&h_{12}\&h_{13}\\\\ h_{21}\&h_{22}\&h_{23}\\\\ h_{31}\&h_{32}\&1 \\end{bmatrix} \\begin{bmatrix} x\\\\y\\\\1 \\end{bmatrix}x′y′w′=h11h21h31h12h22h32h13h231xy1
✔ **8 自由度**
❌ 仿射(6 DOF)/ 相似(4 DOF)都不够
👉 所以:
* `estimateAffinePartial2D` ❌
* `estimateAffine2D` ❌
* **`findHomography` ✔**
### 6️⃣ 如何判断"是否真的需要 Homography"⚠️
#### 👉 判定技巧(非常实用)
1️⃣ 用 `estimateAffine2D` 拟合
2️⃣ 看残差分布:
* **边缘残差呈方向性梯度** → 透视存在
* **整体随机小误差** → 仿射够用
或:
```
```
`|h31| + |h32| ≈ 0 → 非透视 |h31| + |h32| > 1e-4 → 透视显著`
### 7️⃣ 从 H 中读出"物理意义"(进阶)
虽然 homography 不直接给角度,但可以:
#### ① 平面姿态恢复(需内参 K)
```
```
`cv::Mat K; // 相机内参 std::vector