为什么在opencv-python中进行相机校准需要超过30分钟?

时间:2018-06-28 00:59:45

标签: python opencv computer-vision camera-calibration

我正在尝试复制this camera calibration code

运行脚本时,校准过程不会在大约30分钟后停止(我希望输出使用固有的相机矩阵)。我的代码有什么问题?为什么校准过程需要这么长时间?

这是我的代码

import os
import cv2
import numpy as np 

# DUMMY TEST
FilepathCalib = './data'

# Declaring global variable
img_calib_set = []

points_3d_sample = np.zeros((6*7,3), np.float32)
points_3d_sample[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

points_2d = []
points_3d = []

# Loading calibration image dataset
for img_calib in os.listdir(FilepathCalib):
    img_calib = cv2.imread(FilepathCalib + '/' + img_calib, 0)
    img_calib_set.append(img_calib)

# Finding checkerboard corners pattern in image dataset
for img in img_calib_set:
    ret_val, corner = cv2.findChessboardCorners(img, (7,9), None)

    if ret_val == True:
        points_3d.append(points_3d_sample)
        points_2d.append(corner)

# Extracting camera parameters 
ret_val, intrinsic_mat, dist_coef, rot_vector, tran_vector =         
cv2.calibrateCamera(points_3d, points_2d, img_calib_set[0].shape[::-1], None, None)
print(intrinsic_mat)

这是我的样品校准图像 enter image description here

1 个答案:

答案 0 :(得分:3)

cv2.findChessboardCorners()函数的处理时间在很大程度上取决于输入图像。

在1K-4K图像上30分钟并非异常。 您是否尝试过将处理时间写入控制台输出或调试日志?

这样,您可以确定某些图像花费的时间是否比其他图像长。我遇到的情况是,大多数图像需要10到20秒,而少数图像需要3-5分钟。花费大量时间处理的图片通常具有模糊的棋盘图案(运动模糊),或具有其他矩形背景图案(壁橱,百叶窗,窗框等)。

从您的输入图像来看,我可以肯定地看到由于握住它而使纸板稍微弯曲了。我也很难将校准图案粘贴到真正平坦的表面上。最后,我使用了LCD监视器来显示图像,并移动了照相机以获取校准图像(请确保您没有在监视器上缩放图像;图像上的1像素应该是监视器上的1像素,并且它不必全屏显示)。 这给了我最小的重新投影误差。

您的样本图像质量是否比实际素材低?您可以清楚地看到JPEG压缩算法在图像边缘上创建了很多压缩伪像。这是不理想的。如果这是您的实际镜头,建议您将压缩质量设置为最高,或者使用PNG等无损格式。

通过用更好的候选者替换一些校准图像,我能够将校准时间缩短一半。