2
votes

cv2.cornerSubPix() fuction is returning None value.

I m following official opencv tutorial. Now i m at Camera calibration topic .

following is my code :-

import numpy as np
import cv2
import glob

# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].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.

images = glob.glob('*.jpg')

for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    # Find the chess board corners
    ret, corners = cv2.findChessboardCorners(gray, (7,6),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)

        # Draw and display the corners
        img = cv2.drawChessboardCorners(img, (7,6), corners2,ret)
        cv2.imshow('img',img)
        cv2.waitKey(500)

cv2.destroyAllWindows() 

corners2 has value None in the following line:

corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)

Because of this line cv2.imshow() is also showing error.

gray, corners and criteria have some value in it.

1
Hit the same problem, any ideas?Alex Black

1 Answers

2
votes

I had the same issue and it turned out to be an version issue between the example tutorial code and the version I am running which was installed by PythonXY.

If your problem is that the corners2 and img values are both filled with None then this is because the version of OpenCV you are using is meant to use these commands to update the input rather than re-define the input.

The fix is simple, change these two lines from:

corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
img = cv2.drawChessboardCorners(img, (7,6), corners2,ret)`

to:

cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
cv2.drawChessboardCorners(img, (7,6), corners ,ret)