0

我正在制作一个程序来校准相机并使用 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;

我真的很绝望!非常感谢!:)

4

0 回答 0