Почему калибровка камеры EmguCV V3.1.0 всегда дает мне неверное значение?

            Debug.WriteLine("Now calibrating image.");
            List<PointF[]> ImagePointsCollection = new List<PointF[]>();
            List<MCvPoint3D32f[]> RealPointsCollection = new List<MCvPoint3D32f[]>();
            for (int i = 0; i < ImageStore.Size; i++)
            {
                VectorOfPointF Corners = new VectorOfPointF();
                if (CvInvoke.FindChessboardCorners(ImageStore[i], new Size(width, height), Corners, Emgu.CV.CvEnum.CalibCbType.AdaptiveThresh | Emgu.CV.CvEnum.CalibCbType.NormalizeImage))
                {
                    CvInvoke.CornerSubPix(ImageStore[i], Corners, new Size(11, 11), new Size(-1, -1), new MCvTermCriteria(30, 0.1));
                }
                List<MCvPoint3D32f> RealPoints = new List<MCvPoint3D32f>();
                for (int h = 0; h < height; h++)
                {
                    for (int w = 0; w < width; w++)
                    {
                        RealPoints.Add(new MCvPoint3D32f(w * SquareSize, h * SquareSize, 0));
                    }
                }
                RealPointsCollection.Add(RealPoints.ToArray());
                ImagePointsCollection.Add(Corners.ToArray());
            }
            Mat CameraMatrix = new Mat(3, 3, DepthType.Cv64F, 1);
            Mat DistortionCoefficients = new Mat(5, 1, DepthType.Cv64F, 1);
            Mat[] RotationalVector;
            Mat[] TranslationVector;
            double error = CvInvoke.CalibrateCamera(RealPointsCollection.ToArray(), ImagePointsCollection.ToArray(), grayFrame.Size, CameraMatrix, DistortionCoefficients, CalibType.Default, new MCvTermCriteria(30, 0.1), out RotationalVector, out TranslationVector);

            float[] CameraMatrixArray = new float[CameraMatrix.Width * CameraMatrix.Height];
            Marshal.Copy(CameraMatrix.DataPointer, CameraMatrixArray, 0, CameraMatrix.Width * CameraMatrix.Height);

            float[] DistortionCoefficientArray = new float[DistortionCoefficients.Width * DistortionCoefficients.Height];
            Marshal.Copy(DistortionCoefficients.DataPointer, DistortionCoefficientArray, 0, DistortionCoefficients.Width * DistortionCoefficients.Height);

            string[] CameraParameters = new string[] { "# Intrinsic parameters:", "fx:\t" + CameraMatrixArray[0], "fy:\t" + CameraMatrixArray[4], "cx:\t" + CameraMatrixArray[1], "cy:\t" + CameraMatrixArray[5], "", "# Distortion parameters:", "k1:\t" + DistortionCoefficientArray[0], "k2:\t" + DistortionCoefficientArray[1], "k3:\t" + DistortionCoefficientArray[4], "p1:\t" + DistortionCoefficientArray[2], "p2:\t" + DistortionCoefficientArray[3] };

            File.WriteAllLines("CameraParameters.txt", CameraParameters);
            Application.Idle -= Application_Idle;

Почему EmguCV V3.1.0 Camera Calibration всегда дает мне значение cx матрицы внутренних параметров на 2-й позиции первой строки вместо 3-й позиции той же строки?

Также я получаю 14 элементов DistortionCoefficients, это естественно?

Кроме того, как проверить, правильно ли выполнена калибровка?

0 ответов

Другие вопросы по тегам