How to use findChessboardCornersSB with partially visible boards?

Hi, I’d like to detect partially visible Checkerboards using findChessboardCornersSB but the way I’m using it seems to be wrong even though I think I’m using it according to the documentation.
The code I’m using for detection is

import cv2
img = cv2.imread('pattern.png')
ret, corners, meta = cv2.findChessboardCornersSBWithMeta(img, (9,4), cv2.CALIB_CB_LARGER + cv2.CALIB_CB_EXHAUSTIVE + cv2.CALIB_CB_NORMALIZE_IMAGE)
cv2.drawChessboardCorners(img, meta.shape[::-1], corners, ret)
cv2.imshow('img', img)
cv2.waitKey(0)

and I used this image as input


When I draw the result it skips every second row thus returning the wrong corners. Sorry I cannot show an image here, since I’m new to the forum and I’m only allowed to upload one image.
I noticed that the result for the given image is wrong only if I pass certain pattern sizes to the function (e.g. (9,4) as in this example) but works for other sizes like (3,3). In case of (3,3) it detects all visible corners in a 9x6 grid as I expected.
Do I use this function the wrong way?

your board covers way too small an area of the image. with such pictures, you will have a very hard time accurately estimating the intrinsics.

OpenCV can’t handle partially occluded/invisible checkerboards. the corner detection isn’t the issue. associating found corners into a grid is the issue.

I have ideas on how to make regular checkerboards “detectable” even if they’re partially occluded/invisible, but not the free time and specific motivation.

if you need to handle partially occluded boards, you’ll need to use “charuco”, which is a different board type.

Thank you crackwitz. The image was just for testing purposes so I could see if it detects the partial board.

OpenCV can’t handle partially occluded/invisible checkerboards. the corner detection isn’t the issue. associating found corners into a grid is the issue.

But isn’t the whole point of findChessboardCornersSB to find partial checkerboards? What else would the flag CALIB_CB_LARGER be used for then? Also the docu says

In the case, the flags CALIB_CB_LARGER or CALIB_CB_MARKER are given, the result can be recovered from the optional meta array. Both flags are helpful to use calibration patterns exceeding the field of view of the camera.

I know about charuco but I’d prefer a traditional checkerboard since it can hold far more corners than a charuco board. That’s why I would prefer to make this approach work.

Oh, I missed that… haven’t done calibrations in a while and never actually dealt with the findChessboardCornersSB call. I’m out of ideas.