#!/usr/bin/env python ''' camera calibration for distorted images with chess board samples reads distorted images, calculates the calibration and write undistorted images ''' # Python 2/3 compatibility from __future__ import print_function import numpy as np import cv2 from tests_common import NewOpenCVTests class calibration_test(NewOpenCVTests): def test_calibration(self): from glob import glob img_names = [] for i in range(1, 15): if i < 10: img_names.append('samples/data/left0{}.jpg'.format(str(i))) elif i != 10: img_names.append('samples/data/left{}.jpg'.format(str(i))) square_size = 1.0 pattern_size = (9, 6) pattern_points = np.zeros((np.prod(pattern_size), 3), np.float32) pattern_points[:, :2] = np.indices(pattern_size).T.reshape(-1, 2) pattern_points *= square_size obj_points = [] img_points = [] h, w = 0, 0 img_names_undistort = [] for fn in img_names: img = self.get_sample(fn, 0) if img is None: continue h, w = img.shape[:2] found, corners = cv2.findChessboardCorners(img, pattern_size) if found: term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1) cv2.cornerSubPix(img, corners, (5, 5), (-1, -1), term) if not found: continue img_points.append(corners.reshape(-1, 2)) obj_points.append(pattern_points) # calculate camera distortion rms, camera_matrix, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, (w, h), None, None, flags = 0) eps = 0.01 normCamEps = 10.0 normDistEps = 0.05 cameraMatrixTest = [[ 532.80992189, 0., 342.4952186 ], [ 0., 532.93346422, 233.8879292 ], [ 0., 0., 1. ]] distCoeffsTest = [ -2.81325576e-01, 2.91130406e-02, 1.21234330e-03, -1.40825372e-04, 1.54865844e-01] self.assertLess(abs(rms - 0.196334638034), eps) self.assertLess(cv2.norm(camera_matrix - cameraMatrixTest, cv2.NORM_L1), normCamEps) self.assertLess(cv2.norm(dist_coefs - distCoeffsTest, cv2.NORM_L1), normDistEps)