Java OpenCv中的相机标定

1 投票
1 回答
1367 浏览
提问于 2025-04-19 00:06

我一直在努力用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 个回答

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

撰写回答