Reputation: 500
My python code can't find chess board on images. I use this code to solve this task:
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)
a = 7
b = 6
objp = np.zeros((b*a,3), np.float32)
objp[:,:2] = np.mgrid[0:a,0:b].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, (a,b), None)
print(fname, ret)
# 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 the corners
cv2.drawChessboardCorners(img, (a,b), corners, ret)
cv2.imshow('img',img)
cv2.waitKey(-1)
cv2.destroyAllWindows()
I use this test images:
And I sucsesfully use findCirclesGrid. What I am doing wrong? I try to sharpen my images like at this post
UPDATE 1
I use such images and findChessboardCorners fails again.
When I use Harris Corner Detector it returns many errors and it is difficult to use results of Harris to camera calibration.
Upvotes: 6
Views: 11479
Reputation: 21203
UPDATE:
As mentioned by Hiroki, I replaced a = 9
and it worked perfectly.
Image 1:
Image 2:
Image 3:
While using cv2.findChessboardCorners
the image containing the chessboard must have a border. In the image provided by you there is no border present, hence the function fails. Consider drawing a black border around the chessboard and then perform the same.
In the meantime there is an easier way....
You could have tried using Harris corner detection as given in THIS PAGE
This is what I obtained as a result:
Upvotes: 1
Reputation: 401
This is a 9x6 board, not 7x6 board. Change a=9. Border lines are not important.
Upvotes: 12