In [1]:
import pickle
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import seaborn as sns
from scipy.misc import imread, imresize
import glob

In [2]:
%matplotlib inline
sns.set_context("poster")
#bash command to take pictures every second while sleep 1; do raspistill -o checkerboard$(date +"%Y-%M-%d_%H:%M:%S").jpg -t 1; done

In [3]:
# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
path = "camera_calibration"
from os import listdir
from os.path import isfile, join
onlyfiles = sorted([int(f.split(".")[0]) for f in listdir(path) if isfile(join(path, f))])[200:]
images = ["camera_calibration/{}.jpg".format(x) for x in onlyfiles if x % 30 == 0]

In [4]:
len(images)


Out[4]:
85

In [5]:
nx = 9 # the number of inside corners in x
ny = 6 # the number of inside corners in y

In [6]:
img = imread("camera_calibration/{}.jpg".format(onlyfiles[0]))
plt.imshow(img)


Out[6]:
<matplotlib.image.AxesImage at 0x7fa60a156b00>
/root/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

In [7]:
# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((nx*ny,3), np.float32)
objp[:,:2] = np.mgrid[0:nx,0:ny].T.reshape(-1,2)

# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.

for i, fname in enumerate(images):
    print('processing', i, fname)
    img = imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (nx, ny), None)
    img = cv2.drawChessboardCorners(img, (nx, ny), corners, True)

    if ret:
        print('FOUND corners!')
        objpoints.append(objp)
        
        corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        imgpoints.append(corners2)


processing 0 camera_calibration/210.jpg
FOUND corners!
processing 1 camera_calibration/240.jpg
FOUND corners!
processing 2 camera_calibration/270.jpg
FOUND corners!
processing 3 camera_calibration/300.jpg
processing 4 camera_calibration/330.jpg
processing 5 camera_calibration/360.jpg
processing 6 camera_calibration/390.jpg
processing 7 camera_calibration/420.jpg
processing 8 camera_calibration/450.jpg
processing 9 camera_calibration/480.jpg
FOUND corners!
processing 10 camera_calibration/510.jpg
FOUND corners!
processing 11 camera_calibration/540.jpg
FOUND corners!
processing 12 camera_calibration/570.jpg
processing 13 camera_calibration/600.jpg
processing 14 camera_calibration/630.jpg
processing 15 camera_calibration/660.jpg
processing 16 camera_calibration/690.jpg
processing 17 camera_calibration/720.jpg
processing 18 camera_calibration/750.jpg
FOUND corners!
processing 19 camera_calibration/780.jpg
FOUND corners!
processing 20 camera_calibration/810.jpg
FOUND corners!
processing 21 camera_calibration/840.jpg
FOUND corners!
processing 22 camera_calibration/870.jpg
FOUND corners!
processing 23 camera_calibration/900.jpg
FOUND corners!
processing 24 camera_calibration/930.jpg
FOUND corners!
processing 25 camera_calibration/960.jpg
FOUND corners!
processing 26 camera_calibration/990.jpg
FOUND corners!
processing 27 camera_calibration/1020.jpg
FOUND corners!
processing 28 camera_calibration/1050.jpg
FOUND corners!
processing 29 camera_calibration/1080.jpg
FOUND corners!
processing 30 camera_calibration/1110.jpg
FOUND corners!
processing 31 camera_calibration/1140.jpg
FOUND corners!
processing 32 camera_calibration/1170.jpg
FOUND corners!
processing 33 camera_calibration/1200.jpg
FOUND corners!
processing 34 camera_calibration/1230.jpg
FOUND corners!
processing 35 camera_calibration/1260.jpg
FOUND corners!
processing 36 camera_calibration/1290.jpg
FOUND corners!
processing 37 camera_calibration/1320.jpg
FOUND corners!
processing 38 camera_calibration/1350.jpg
FOUND corners!
processing 39 camera_calibration/1380.jpg
FOUND corners!
processing 40 camera_calibration/1410.jpg
FOUND corners!
processing 41 camera_calibration/1440.jpg
FOUND corners!
processing 42 camera_calibration/1470.jpg
FOUND corners!
processing 43 camera_calibration/1500.jpg
FOUND corners!
processing 44 camera_calibration/1530.jpg
FOUND corners!
processing 45 camera_calibration/1560.jpg
FOUND corners!
processing 46 camera_calibration/1590.jpg
FOUND corners!
processing 47 camera_calibration/1620.jpg
FOUND corners!
processing 48 camera_calibration/1650.jpg
FOUND corners!
processing 49 camera_calibration/1680.jpg
FOUND corners!
processing 50 camera_calibration/1710.jpg
FOUND corners!
processing 51 camera_calibration/1740.jpg
FOUND corners!
processing 52 camera_calibration/1770.jpg
FOUND corners!
processing 53 camera_calibration/1800.jpg
FOUND corners!
processing 54 camera_calibration/1830.jpg
FOUND corners!
processing 55 camera_calibration/1860.jpg
FOUND corners!
processing 56 camera_calibration/1890.jpg
FOUND corners!
processing 57 camera_calibration/1920.jpg
FOUND corners!
processing 58 camera_calibration/1950.jpg
FOUND corners!
processing 59 camera_calibration/1980.jpg
FOUND corners!
processing 60 camera_calibration/2010.jpg
FOUND corners!
processing 61 camera_calibration/2040.jpg
FOUND corners!
processing 62 camera_calibration/2070.jpg
FOUND corners!
processing 63 camera_calibration/2100.jpg
FOUND corners!
processing 64 camera_calibration/2130.jpg
FOUND corners!
processing 65 camera_calibration/2160.jpg
FOUND corners!
processing 66 camera_calibration/2190.jpg
FOUND corners!
processing 67 camera_calibration/2220.jpg
FOUND corners!
processing 68 camera_calibration/2250.jpg
FOUND corners!
processing 69 camera_calibration/2280.jpg
FOUND corners!
processing 70 camera_calibration/2310.jpg
FOUND corners!
processing 71 camera_calibration/2340.jpg
FOUND corners!
processing 72 camera_calibration/2370.jpg
FOUND corners!
processing 73 camera_calibration/2400.jpg
FOUND corners!
processing 74 camera_calibration/2430.jpg
FOUND corners!
processing 75 camera_calibration/2460.jpg
FOUND corners!
processing 76 camera_calibration/2490.jpg
FOUND corners!
processing 77 camera_calibration/2520.jpg
FOUND corners!
processing 78 camera_calibration/2550.jpg
FOUND corners!
processing 79 camera_calibration/2580.jpg
FOUND corners!
processing 80 camera_calibration/2610.jpg
FOUND corners!
processing 81 camera_calibration/2640.jpg
FOUND corners!
processing 82 camera_calibration/2670.jpg
FOUND corners!
processing 83 camera_calibration/2700.jpg
processing 84 camera_calibration/2730.jpg

In [8]:
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[0:2],None,None)

In [9]:
img = imread("{}".format(images[70]))

In [10]:
h,  w = img.shape[:2]
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h))

plt.subplot(121)
plt.imshow(img)

plt.subplot(122)
undistort = cv2.undistort(img, mtx, dist, None, mtx)
plt.imshow(undistort)


Out[10]:
<matplotlib.image.AxesImage at 0x7fa60a041828>
/root/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

In [11]:
calibration_data = {
    "mtx": mtx,
    "camera_mtx": newcameramtx,
    "dist": dist
}

In [12]:
with open("fisheye_f1p8_camera_calibration.pkl", 'wb') as f:
    pickle.dump(calibration_data, f)

In [13]:
img = imread("{}".format(images[i]))
undistort = cv2.undistort(img, mtx, dist, None, mtx)
plt.imshow(undistort)
i += 1


/root/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))

In [ ]:


In [ ]:


In [ ]: