小编Ang*_*elo的帖子

在 Python 中使用 OpenCV 中的鱼眼相机捕获的点不失真的正确方法是什么?

信息:

我已经校准了相机,发现相机的本征矩阵 (K) 及其畸变系数 (d) 如下:

import numpy as np
K = np.asarray([[556.3834638575809,0,955.3259939726225],[0,556.2366649196925,547.3011305411478],[0,0,1]])
d = np.asarray([[-0.05165940570900624],[0.0031093602070252167],[-0.0034036648250202746],[0.0003390345044343793]])
Run Code Online (Sandbox Code Playgroud)

从这里,我可以使用以下三行来消除图像的扭曲:

final_K = cv2.fisheye.estimateNewCameraMatrixForUndistortRectify(K, d, (1920, 1080), np.eye(3), balance=1.0)

map_1, map_2 = cv2.fisheye.initUndistortRectifyMap(K, d, np.eye(3), final_K, (1920, 1080), cv2.CV_32FC1)

undistorted_image = cv2.remap(image, map_1, map_2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
Run Code Online (Sandbox Code Playgroud)

生成的未失真图像似乎是正确的,左图像扭曲,右图像未扭曲,但是当我尝试使用点不映射cv2.remap()到与图像中相应像素相同的位置来不扭曲图像点时。我使用以下方法检测了左图中的校准板点

ret, corners = cv2.findChessboardCorners(gray, (6,8),cv2.CALIB_CB_ADAPTIVE_THRESH+cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)
corners2 = cv2.cornerSubPix(gray, corners, (3,3), (-1,-1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.1))
Run Code Online (Sandbox Code Playgroud)

然后通过以下方式重新映射这些点:

remapped_points = []
for corner in corners2:
    remapped_points.append(
                (map_1[int(corner[0][1]), int(corner[0][0])], map_2[int(corner[0][1]), int(corner[0][0])])
            )
Run Code Online (Sandbox Code Playgroud)

在这些水平连接的图像中,左图像显示在失真图像中检测到的点,而右图像显示右图像中点的重新映射位置。

另外,我无法使用 …

python opencv fisheye calibration camera-calibration

3
推荐指数
1
解决办法
9653
查看次数