text: #!/usr/bin/env python
  
  import cv2
  import numpy as np
  import os
  import glob
  
  # Defining the dimensions of checkerboard
  CHECKERBOARD = (4,5)
  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
  
  # Creating vector to store vectors of 3D points for each checkerboard image
  objpoints = []
  # Creating vector to store vectors of 2D points for each checkerboard image
  imgpoints = [] 
  
  
  # Defining the world coordinates for 3D points
  objp = np.zeros((1, CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)
  objp[0,:,:2] = 4*np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
  prev_img_shape = None
  
  # Extracting path of individual image stored in a given directory
  images = glob.glob('snap*.jpg')
  for fname in images:
      img = cv2.imread(fname)
      gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
      # Find the chess board corners
      # If desired number of corners are found in the image then ret = true
      ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH+
      	cv2.CALIB_CB_FAST_CHECK+cv2.CALIB_CB_NORMALIZE_IMAGE)
      
      """
      If desired number of corner are detected,
      we refine the pixel coordinates and display 
      them on the images of checker board
      """
      if ret == True:
          objpoints.append(objp)
          # refining pixel coordinates for given 2d points.
          corners2 = cv2.cornerSubPix(gray,corners,(3,3),(-1,-1),criteria)
          
          imgpoints.append(corners2)
  
          # Draw and display the corners
          img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2,ret)
      
      cv2.imshow('img',img)
      cv2.waitKey(0)
  
  cv2.destroyAllWindows()
  
  h,w = img.shape[:2]
  
  """
  Performing camera calibration by 
  passing the value of known 3D points (objpoints)
  and corresponding pixel coordinates of the 
  detected corners (imgpoints)
  """
  ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
  
  print("Camera matrix : \n")
  print(mtx)
  print("dist : \n")
  print(dist)
  print("rvecs : \n")
  print(rvecs)
  print("tvecs : \n")
  print(tvecs)
  
  # Using the derived camera parameters to undistort the image
  
  img = cv2.imread(images[0])
  # Refining the camera matrix using parameters obtained by calibration
  newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
  
  # Method 1 to undistort the image
  dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
  
  # Method 2 to undistort the image
  mapx,mapy=cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5)
  
  dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)
  
  # Displaying the undistorted image
  cv2.imshow("undistorted image",dst)
  cv2.waitKey(0)