-
-
Notifications
You must be signed in to change notification settings - Fork 56.4k
Description
System Information
OpenCV python version: 4.7.0
Operating System / Platform: Debian GNU/Linux 11 (bullseye)
Python version: 3.9.2
Detailed description
It's my first time using charuco and I did not expect to encounter so many problems with this method.
According to the OpenCV docs, the idea of introducing Charuco was to make the classic chessboard pattern robust to partial view.
But when I ran the charuco corners detection, I realized that the detected chessboard corners did not match the real ones

According to the documentation and source code of cv::CharucoDetector::detectBoard(), this function doesn't detect chessboard corners. Instead, it detects inner ArUco markers and uses them to estimate the camera pose and project back the chessboard corners. It has two options: when you have camera intrinsic parameters and when you don't (it's our option). For the second option, it uses a homography matrix to estimate the chessboard corners, which means that this method does not account for distortion. Therefore, the reprojected positions of corners may be incorrect. After that, the method calls the cv::cornerSubPix() method to refine the corners' positions, and if the initial reprojection position is not far away from the real one, this call could produce accurate detection. That's why not all corners are found incorrectly.
Although this method is mentioned in many tutorials, it is not suitable for calibration.
Steps to reproduce
I got this problem running my own code, but for baseline I ran the official example
./example_aruco_calibrate_camera_charuco -v=<...>/frame-%03d.png -d 0 -h=6 -w=4 --sl=0.3175 --ml=0.2540 --sc --rs
Issue submission checklist
- I report the issue, it's not a question
- I checked the problem with documentation, FAQ, open issues, forum.opencv.org, Stack Overflow, etc and have not found any solution
- I updated to the latest OpenCV version and the issue is still there
- There is reproducer code and related data files (videos, images, onnx, etc)