Почему калибровка камеры 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, это естественно?
Кроме того, как проверить, правильно ли выполнена калибровка?