鱼眼校准 OpenCV Python

Posted

技术标签:

【中文标题】鱼眼校准 OpenCV Python【英文标题】:Fisheye calibration OpenCV Python 【发布时间】:2018-04-15 07:58:04 【问题描述】:

我正在使用鱼眼相机,我想使用 OpenCV 或 Python 中的任何其他库对其进行校准并纠正其桶形失真。我通过不同的图像尝试了使用经典棋盘图案的不同方法。

我一直在遵循这种方法:

    # Prepare object points, like (0,0,0), (1,0,0), (2,0,0), ...,(7,5,0)
    object_p = np.zeros((self.__ny*self.__nx,3),np.float32)
    object_p[:,:2] = np.mgrid[0:self.__nx,0:self.__ny].T.reshape(-1,2) # s,y coordinates

for image_filename in calibration_filenames:
        # Read in each image
        image = cv2.imread(image_filename)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # RGB is standard in matlibplot

        # Convert to grayscale
        gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

        # Find the chessboard corners
        ret, corners = cv2.findChessboardCorners(gray, (self.__nx, self.__ny), None)

        # If found, draw corners
        if ret == True:
            # Store the corners found in the current image
            object_points.append(object_p) # how it should look like
            image_points.append(corners) # how it looks like

            # Draw and display the corners
            cv2.drawChessboardCorners(image, (self.__nx, self.__ny), corners, ret)
            plt.figure()
            plt.imshow(image)
            plt.show()

    # Do the calibration
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, shape, None, None)

然后这个来纠正我的形象:

cv2.undistort(image, mtx, dist, None, mtx)

主要问题是,虽然某些图像的校正效果很好,但很容易受到相机位置的影响。相机中厘米的变化将导致非常不同的校正(见下文)。

知道如何控制这种缩放效果以显示始终在校正后的图像中保持网格区域吗?

我知道这个问题可能与here 中的问题相似。

【问题讨论】:

【参考方案1】:
    您的校准估计不佳:如您所见,场景网格中的直线未转换为(据称)未失真图像中的直线。 一旦您进行了更好的校准,您就可以计算(使用逆映射)原始图像中未失真图像的 4 个边的位置。这些定义了您可用的图像边界,并可以指导相机相对于场景的放置。

【讨论】:

您能稍微解释一下您的第二点吗?我该怎么做? 不失真的桶形失真会导致图像明显放大。这是因为物理畸变镜头投射到传感器光线上,该光线将位于具有相同焦距的针孔相机的图像区域“外部”。这就是为什么在完全不失真的矩形图像中,有效部分具有“蝴蝶”形状的原因,参见例如图片在***.com/questions/18742679/…。另请参阅使用 getOptimalNewCameraMatrix 的建议。

以上是关于鱼眼校准 OpenCV Python的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 鱼眼校准值(重用保存在 JSON 文件中的值)

使用 opencv 3.0 beta 进行鱼眼镜头校准

OpenCV 鱼眼校准 C++ 输出与 Python 不同

使用opencv3鱼眼模型的圆形鱼眼扭曲

如何通过openCV模拟鱼眼镜头效果?

如何使用 OpenCV 使裁剪后的鱼眼图像不失真