V. Gai
V. Gai

Reputation: 500

opencv findChessboardCorners fails

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:

First test image Second test image

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. Another test 1 Another test 2

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

Answers (2)

Jeru Luke
Jeru Luke

Reputation: 21203

UPDATE:

As mentioned by Hiroki, I replaced a = 9 and it worked perfectly.

Image 1:

enter image description here

Image 2:

enter image description here

Image 3:

enter image description here

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:

enter image description here

Upvotes: 1

hiroki
hiroki

Reputation: 401

This is a 9x6 board, not 7x6 board. Change a=9. Border lines are not important.

Upvotes: 12

Related Questions