简体   繁体   中英

Camera Calibration with OpenCV - How to adjust chessboard square size?

I am working on a camera calibration program using the OpenCV/Python example (from: OpenCV Tutorials ) as a guidebook.

Question: How do I tailor this example code to account for the size of a square on a particular chessboard pattern? My understanding of the camera calibration process is that this information must somehow be used otherwise the values given by:

cv2.calibrateCamera()

will be incorrect.

Here is the portion of my code that reads in image files and runs through the calibration process to produce the camera matrix and other values.

#import cv2
#import numpy as np
#import glob

"""
Corner Finding
"""
# 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), ....,(6,5,0)
objp = np.zeros((5*5,3), np.float32)
objp[:,:2] = np.mgrid[0:5,0:5].T.reshape(-1,2)

# Arrays to store object points and image points from all images
objpoints = []
imgpoints = []

counting = 0

# Import Images
images = glob.glob('dir/sub dir/Images/*')

for fname in images:

    img = cv2.imread(fname)     # Read images
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # Convert to grayscale



    # Find the chess board corners
    ret, corners = cv2.findChessboardCorners(gray, (5,5), None)

    # if found, add object points, image points (after refining them)
    if ret == True:
        objpoints.append(objp)

        cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
        imgpoints.append(corners)

        #Draw and display corners
        cv2.drawChessboardCorners(img, (5,5), corners, ret)
        counting += 1

        print str(counting) + ' Viable Image(s)'

        cv2.imshow('img', img)
        cv2.waitKey(500)

cv2.destroyAllWindows()        


# Calibrate Camera    
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)    

Here, if you have your square size assume 30 mm then multiply this value with objp[:,:2] . Like this

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)*30   # 30 mm size of square

As objp[:,:2] is a set of points of checkboard corners given as (0,0),(0,1), (0,2) ....(8,5). (0,0) point is the left upper most square corner and (8,5) is the right lowest square corner. In this case, these points have no unit but if we multiply these values with square size (for example 30 mm), then these will become (0,0),(0,30), .....(240,150) which are the real world units. Your translation vector will be in mm units in this case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM