0
votes

I 'am trying to calibrate my phone camera using the tutorial provided in OpenCV and the chessboard pictures but the code doesn't show the final result and I keep stumbling upon this error:

NameError                                 Traceback (most recent call last)
<ipython-input-16-9dc3cfc36f25> in <module>
     33 
     34 cv2.destroyAllWindows()
---> 35 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)

NameError: name 'gray' is not defined

This is the code that I ran

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*9,3), np.float64)
objp[:,:2] = np.mgrid[0:9,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('*/Users/ASUS/Desktop/Homework/Homework_1/im.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, (9,6),None)
    print(ret)

    # 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, (9,6), corners2,ret)
        cv2.imshow('img',img)
        cv2.waitKey(500)

cv2.destroyAllWindows()
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
1
Well it says "'gray' is not defined". check gray image right before calibrateCamera to see if it's a valid image. - MH304

1 Answers

0
votes

You load the images inside the for loop and gray is defined only there. You then reference it outside of the loop in the last line to get the image dimensions but gray is out of scope.

Creating a variable holding the dimensions of the image before the for loop and filling it inside the loop should do the trick.

dims = None

for fname in images:
    img = cv2.imread(fname)
    dims = img.shape[::-1]

(...)

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, dims, None, None)