我正在制作一个程序来校准相机并使用 Java 中的 OpenCV 使用棋盘消除失真。我一直在阅读“Learning OpenCV”,我的代码非常相似,但即使程序运行没有错误,结果也是错误的。我正在寻找内在矩阵和失真系数。
有人可以帮助我吗?我很绝望!!简而言之,我设置了棋盘的大小(宽度为 4 点,高度为 5 点)。
我捕获图像,并创建 4 个矩阵 image_points、object_points、图像大小(作为输入)camera_matrix 和失真系数(作为输出)。然后我对噪声效果应用一个平滑滤波器(高斯滤波器),并且:
cvFindChessboardCorners(图像,board_sz,corners,corner_count,CV_CALIB_CB_FAST_CHECK);
cvCvtColor(image, gray_image, CV_BGR2GRAY);
cvFindCornerSubPix( // Get Subpixel accuracy on those corners
gray_image,
corners,
corner_count[0],
cvSize(11,11),
cvSize(-1, -1),
cvTermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30,
0.1));
cvDrawChessboardCorners(image, board_sz, corners,
corner_count[0], found);
// CALIBRATE THE CAMERA!
cvCalibrateCamera2(object_points2, image_points2, point_counts2,
cvGetSize(image), intrinsic_matrix, distortion_coeffs, null,
null, CV_CALIB_RATIONAL_MODEL //0 // CV_CALIB_FIX_ASPECT_RATIO
);
IplImage mapx = cvCreateImage(cvGetSize(image), IPL_DEPTH_32F, 1);
IplImage mapy = cvCreateImage(cvGetSize(image), IPL_DEPTH_32F, 1);
cvInitUndistortMap(intrinsic, distortion, mapx, mapy);
while (image != null) {
imga = ImageIO.read(u);
image = IplImage.createFrom(imga);
IplImage t = cvCloneImage(image);
rawFrame.showImage(image); // Show raw image
cvRemap(t, image, mapx, mapy, CV_INTER_LINEAR
| CV_WARP_FILL_OUTLIERS, cvScalarAll(0));
cvReleaseImage(t);
undistortFrame.showImage(image); // Show corrected image
}
我必须获得的参数应该接近这些参数:
*内在矩阵:
fx 800.161011;
fy = 800.174866;
cx = 648.423279;
cy = 483.997681;
失真系数:
k1 -4.25992794e-002;k2 = -1.11125395e-001;k3 = 8.78498256e-002; k4 = 3.94474864e-002; k5 = -1.00275539e-001;k6 = 8.33327100e-002; p1 = 6.98052521e-004; p2=4.69301594e-004;
我真的很绝望!非常感谢!:)