private void ResultsMatrices(StringBuilder result, CalibrationData.CameraIndex camIdx)
        {
            if(camIdx == CalibrationData.CameraIndex.Left)
            {
                result.AppendLine("Camera Matrix Left: ");
            }
            else
            {
                result.AppendLine("Camera Matrix Right: ");
            }
            Matrix<double> camera = CalibrationData.Data.GetCameraMatrix(camIdx);
            Matrix<double> calib = CalibrationData.Data.GetCalibrationMatrix(camIdx);
            Matrix<double> rotation = CalibrationData.Data.GetRotationMatrix(camIdx);
            Vector<double> center = CalibrationData.Data.GetTranslationVector(camIdx);
            Vector<double> epiPole = CalibrationData.Data.GetEpipole(camIdx);

            result.Append("|" + camera[0, 0].ToString("F3"));
            result.Append("; " + camera[0, 1].ToString("F3"));
            result.Append("; " + camera[0, 2].ToString("F3"));
            result.Append("; " + camera[0, 3].ToString("F3"));
            result.AppendLine("|");

            result.Append("|" + camera[1, 0].ToString("F3"));
            result.Append("; " + camera[1, 1].ToString("F3"));
            result.Append("; " + camera[1, 2].ToString("F3"));
            result.Append("; " + camera[1, 3].ToString("F3"));
            result.AppendLine("|");

            result.Append("|" + camera[2, 0].ToString("F3"));
            result.Append("; " + camera[2, 1].ToString("F3"));
            result.Append("; " + camera[2, 2].ToString("F3"));
            result.Append("; " + camera[2, 3].ToString("F3"));
            result.AppendLine("|");

            result.AppendLine("");
            result.AppendLine("Internal Parameters:");
            result.Append("|" + calib[0, 0].ToString("F3"));
            result.Append("; " + calib[0, 1].ToString("F3"));
            result.Append("; " + calib[0, 2].ToString("F3"));
            result.AppendLine("|");

            result.Append("|" + calib[1, 0].ToString("F3"));
            result.Append("; " + calib[1, 1].ToString("F3"));
            result.Append("; " + calib[1, 2].ToString("F3"));
            result.AppendLine("|");

            result.Append("|" + calib[2, 0].ToString("F3"));
            result.Append("; " + calib[2, 1].ToString("F3"));
            result.Append("; " + calib[2, 2].ToString("F3"));
            result.AppendLine("|");

            result.AppendLine("");
            result.AppendLine("Rotation:");
            result.Append("|" + rotation[0, 0].ToString("F3"));
            result.Append("; " + rotation[0, 1].ToString("F3"));
            result.Append("; " + rotation[0, 2].ToString("F3"));
            result.AppendLine("|");

            result.Append("|" + rotation[1, 0].ToString("F3"));
            result.Append("; " + rotation[1, 1].ToString("F3"));
            result.Append("; " + rotation[1, 2].ToString("F3"));
            result.AppendLine("|");

            result.Append("|" + rotation[2, 0].ToString("F3"));
            result.Append("; " + rotation[2, 1].ToString("F3"));
            result.Append("; " + rotation[2, 2].ToString("F3"));
            result.AppendLine("|");

            result.AppendLine("");
            result.AppendLine("Camera Center:");
            result.Append("|" + center[0].ToString("F3"));
            result.Append("; " + center[1].ToString("F3"));
            result.Append("; " + center[2].ToString("F3"));
            result.AppendLine("|");

            result.AppendLine();
            result.AppendLine("Epipole: ");
            result.Append("[" + epiPole[0] / epiPole[2] + ", ");
            result.Append(epiPole[1] / epiPole[2] + "]");
        }
        private void ResultReprojectionError(StringBuilder result, CalibrationData.CameraIndex camIdx)
        {
            Matrix<double> camera = CalibrationData.Data.GetCameraMatrix(camIdx);
            var imgs = camIdx == CalibrationData.CameraIndex.Left ? _imgsLeft : _imgsRight;
            var reals = _reals; //camIdx == CalibrationData.CameraIndex.Left ? _realsLeft : _realsRight;
            var cpoints = camIdx == CalibrationData.CameraIndex.Left ? CalibPointsLeft : CalibPointsRight;
            var grids = CalibGrids;  //camIdx == CalibrationData.CameraIndex.Left ? GridsLeft : GridsRight;
            string name = camIdx == CalibrationData.CameraIndex.Left ? "Left" : "Right";

            double error = 0.0;
            double error2 = 0.0;
            double relerror = 0.0;
            double rerrx = 0.0;
            double rerry = 0.0;
            for(int p = 0; p < imgs.Length; ++p)
            {
                Vector<double> ip = cpoints[p].Img.ToMathNetVector3();
                Vector<double> rp = reals[p];

                Vector<double> eip = camera * rp;
                eip.DivideThis(eip[2]);

                var d = (ip - eip);
                double e = d.L2Norm();
                error += e;
                error2 += e * e;
                ip[2] = 0.0;
                relerror += e / ip.L2Norm();
                double rx = Math.Abs(d[0]) / Math.Abs(ip[0]), ry = Math.Abs(d[1]) / Math.Abs(ip[1]);
                rerrx += rx;
                rerry += ry;
            }

            result.AppendLine();
            result.AppendLine("Reprojection error " + name + "( d(xi, PXr) ): ");
            result.AppendLine("Points count: " + imgs.Length.ToString());
            result.AppendLine("Total: " + error.ToString("F4"));
            result.AppendLine("Total Squared: " + error2.ToString("F4"));
            result.AppendLine("Mean: " + (error / imgs.Length).ToString("F4"));
        }