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 个回答
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