已知一个像素点在畸变图上的坐标,以及内参矩阵和畸变系数,求解该像素点在去畸变图上的坐标
时间: 2023-06-25 18:02:10 浏览: 126
畸变图像素坐标到去畸变图像素坐标的转换过程需要进行以下步骤:
1. 将畸变图像素坐标转换为归一化相机坐标系下的坐标。
2. 根据内参矩阵将归一化相机坐标系下的坐标转换为相机坐标系下的坐标。
3. 利用畸变系数对相机坐标系下的坐标进行畸变矫正。
4. 根据内参矩阵将矫正后的相机坐标系下的坐标转换为去畸变图像素坐标。
下面是具体的代码实现:
```python
import numpy as np
# 畸变图像素坐标
u = 100
v = 200
# 内参矩阵
K = np.array([[fx, 0, cx],
[0, fy, cy],
[0, 0, 1]])
# 畸变系数
D = np.array([k1, k2, p1, p2, k3])
# 将畸变图像素坐标转换为归一化相机坐标系下的坐标
x_norm = np.linalg.inv(K) @ np.array([u, v, 1]).T
r2 = x_norm[0] ** 2 + x_norm[1] ** 2
# 根据内参矩阵将归一化相机坐标系下的坐标转换为相机坐标系下的坐标
x_cam = x_norm / np.sqrt(r2)
# 利用畸变系数对相机坐标系下的坐标进行畸变矫正
x_distort = x_cam * (1 + D[0]*r2 + D[1]*r2**2 + D[4]*r2**3) \
+ np.array([2*D[2]*x_cam[0]*x_cam[1] + D[3]*(r2 + 2*x_cam[0]**2),
D[2]*(r2 + 2*x_cam[1]**2) + 2*D[3]*x_cam[0]*x_cam[1]])
# 根据内参矩阵将矫正后的相机坐标系下的坐标转换为去畸变图像素坐标
x_undistort = K @ np.array([x_distort[0], x_distort[1], 1])
# 去畸变图像素坐标
u_undistort = int(x_undistort[0] / x_undistort[2])
v_undistort = int(x_undistort[1] / x_undistort[2])
print("去畸变图像素坐标:({}, {})".format(u_undistort, v_undistort))
```
阅读全文