Калибровка камеры в Java OpenCv

Я изо всех сил пытался откалибровать свою камеру на Java, параметры, которые я получаю от вызова

Calib3d.calibrateCamera(object_points, corners, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs);

далеко

Если я использую то же изображение в Python (учебник), результаты верны. Я действительно не знаю, как решить эту проблему. Я действительно не вижу никакой разницы.(Возможно, способ, которым я инициализирую object_points?)

Вот код Java

found_chess = Calib3d.findChessboardCorners(gray, patternSize, actual_corners,  Calib3d.CALIB_CB_ADAPTIVE_THRESH + Calib3d.CALIB_CB_NORMALIZE_IMAGE);
if(found_chess)
{

    corners.add(actual_corners);
    //cornersubPix() irrelevant since all the corners are found in findChessBoard
    //Imgproc.cornerSubPix(gray, actual_corners, new Size(SIZE_Y*2+1,SIZE_X*2+1), new Size(-1,-1), new TermCriteria(TermCriteria.EPS+TermCriteria.MAX_ITER,30,0.1));

    MatOfPoint3f points;

    Mat a = new MatOfPoint3f();
        for(int y=0; y<SIZE_Y; ++y) 
        {
            for(int x=0; x<SIZE_X; ++x)
            {
                points = new MatOfPoint3f(new Point3(x, y, 0));
                a.push_back(points);
            }
        }

    object_points.add(a);
    Calib3d.calibrateCamera(object_points, corners, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs);
 }

Код Python, который я использую, можно найти здесь

Я использую только одно изображение, но параметры не должны совпадать. Найденные шахматные углы точно такие же.

Вот параметры, которые я получаю в Java(которые не имеют смысла)

K1: 519.399710654873
K2: -42465.04562762376
P1: -11.363668181023353
P2: -1.5606689962722413
K3: -661829.1347551622
Fx: 8848.871073244098
Cx: 850.1589437229045
Fy: 9242.065368089003
Cy: 471.258611493399 

Я был бы очень признателен, если бы кто-нибудь мог мне помочь. заранее спасибо

1 ответ

Кажется, я неправильно инициализировал объектные точки. Изменены X и Y, и все работает нормально (см. Код и результаты)

for(int x=0; x<SIZE_X; ++x) 
{
    for(int y=0;  y<SIZE_Y; ++y)
    {
        points = new MatOfPoint3f(new Point3(y, x, 0));
        a.push_back(points);
    }
}

K1: -0.018826429817406057
K2: 0.004765861493124195
P1: -0.013705374382823956
P2: 0.004067969604879225
K3: -0.05266506928016909
Fx: 594.0637743671965
Cx: 657.3929211728023
Fy: 604.1989278105854
Cy: 572.8441406065865
Другие вопросы по тегам