title: How to use opencv.omnidir module for dewarping fisheye images
body: <p>I am trying to use <a href="http://docs.opencv.org/trunk/db/dd2/namespacecv_1_1omnidir.html" rel="nofollow noreferrer">omnidirectional module</a> for dewarping fisheye images in <strong>Python</strong>. I am trying to adapt this <a href="http://docs.opencv.org/3.2.0/dd/d12/tutorial_omnidir_calib_main.html" rel="nofollow noreferrer">C++ tutorial</a> in Python but running into issues. Here is my code:</p>
  
  <pre><code>import numpy as np
  import cv2
  import glob
  
  nx = 9
  ny = 6
  
  # termination criteria
  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
  
  chessboard_model = np.zeros((1, nx*ny, 3), np.float32)
  chessboard_model[0, :, :2] = np.mgrid[0:nx, 0:ny].T.reshape(-1, 2)
  
  # 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.
  
  filenames = glob.glob('/home/work/Downloads/fisheye_calibration/*.jpg')
  images = []
  i = 0
  for fname in filenames:
      i += 1
      print("Processing image: {}".format(i))
      img = cv2.imread(fname)
      gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
      images.append(img)
  
      # Find the chess board corners
      ret, corners = cv2.findChessboardCorners(gray, (nx,ny),None)
      # If found, add object points, image points (after refining them)
      if ret == True:
          objpoints.append(objp)
          corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
          #imgpoints.append(corners2)
          imgpoints.append(corners2.reshape(1, -1, 2))
  
          # Draw and display the corners
          img = cv2.drawChessboardCorners(img, (nx,ny), corners2,ret)
          cv2.imshow('img',img)
          cv2.waitKey(500)
  
  num_points = len(imgpoints)
  K = np.zeros((3, 3))
  xi = np.array([])
  idx = np.array([])
  D = np.zeros((4, 1))
  h, w = images[0].shape[:2]
  calibration_flags = cv2.omnidir.CALIB_USE_GUESS | cv2.omnidir.CALIB_FIX_SKEW
  obj_points_arr = np.array([chessboard_model]*num_points)
  img_points_arr = np.array(imgpoints).squeeze(axis=1)
  rms = cv2.omnidir.calibrate(obj_points_arr, img_points_arr, (w,h), K, xi, D, calibration_flags, criteria)
  </code></pre>
  
  <p>I am getting the following error:</p>
  
  <pre><code>cv2.error:/home/work/opencv_contrib/modules/ccalib/src/omnidir.cpp:1065: error: (-215) !patternPoints.empty() &amp;&amp; !imagePoints.empty() &amp;&amp; patternPoints.total() == imagePoints.total() in function calibrate
  </code></pre>
  
  <p>Here <code>obj_points_arr</code> and <code>img_points_arr</code> were <code>num_points x 1 x (nx * ny) x 3</code> and <code>num_points x 1 x (nx * ny) x 2</code> respectively. If I reshape the <code>obj_points_arr</code> and <code>img_points_arr</code> to <code>num_points x (nx * ny) x 3</code> and <code>num_points x (nx * ny) x 2</code> using </p>
  
  <pre><code>obj_points_arr = np.array([chessboard_model]*num_points).squeeze(axis=1)
  img_points_arr = np.array(imgpoints).squeeze(axis=1)
  </code></pre>
  
  <p>then I get the following error</p>
  
  <pre><code>cv2.error: /home/work/opencv/modules/core/src/matrix.cpp:469: error: (-215) 0 &lt;= _rowRange.start &amp;&amp; _rowRange.start &lt;= _rowRange.end &amp;&amp; _rowRange.end &lt;= m.rows in function Mat
  </code></pre>
  
  <p>What should be the shapes of these arrays ? Can someone share their python code for dewarping fisheye images ?</p>