Example #1
0
    public CalibrationUtil(Camera cam)
    {
        this.cam = cam;

        objectPoints    = new MCvPoint3D32f[1][];
        objectPoints[0] = new MCvPoint3D32f[0];

        imagePoints    = new PointF[1][];
        imagePoints[0] = new PointF[0];

        intrinsics = new IntrinsicCameraParameters();
        imageSize  = new Size(Screen.width, Screen.height);

        //Settings based on Mapamok default settings
        calibrationType = CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS
                          | CALIB_TYPE.CV_CALIB_FIX_PRINCIPAL_POINT //required to work properly !!
                          | CALIB_TYPE.CV_CALIB_FIX_ASPECT_RATIO
                          | CALIB_TYPE.CV_CALIB_FIX_K1
                          | CALIB_TYPE.CV_CALIB_FIX_K2
                          | CALIB_TYPE.CV_CALIB_FIX_K3
                          | CALIB_TYPE.CV_CALIB_FIX_K4
                          | CALIB_TYPE.CV_CALIB_FIX_K5
                          | CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST
        ;

        termCriteria = new MCvTermCriteria();
    }
Example #2
0
 public Calibration(Camera mainCamera)
 {
     _mainCamera = mainCamera;
     _termCriteria = new MCvTermCriteria();
     _flags = CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS | CALIB_TYPE.CV_CALIB_FIX_K1 | CALIB_TYPE.CV_CALIB_FIX_K2 | CALIB_TYPE.CV_CALIB_FIX_K3 | CALIB_TYPE.CV_CALIB_FIX_K4 | CALIB_TYPE.CV_CALIB_FIX_K5 | CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST;
     _size = new Size(Screen.width, Screen.height);
 }
Example #3
0
 public Calibration(Camera mainCamera)
 {
     _mainCamera   = mainCamera;
     _termCriteria = new MCvTermCriteria();
     _flags        = CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS | CALIB_TYPE.CV_CALIB_FIX_K1 | CALIB_TYPE.CV_CALIB_FIX_K2 | CALIB_TYPE.CV_CALIB_FIX_K3 | CALIB_TYPE.CV_CALIB_FIX_K4 | CALIB_TYPE.CV_CALIB_FIX_K5 | CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST;
     _size         = new Size(Screen.width, Screen.height);
 }
Example #4
0
 private void GetFlags(out CALIB_TYPE flags)
 {
     flags = 0;
     foreach (var flag in FPinInFlags)
     {
         flags |= flag;
     }
 }
Example #5
0
        private void UpdateFromCalibrationFlags()
        {
            CALIB_TYPE calibrationFlags = m_Model.CalibrationFlags;

            m_UseIntrinsicGuessCheckBox.Checked        = (calibrationFlags & CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS) > 0;
            m_FixPrincipalPointCheckBox.Checked        = (calibrationFlags & CALIB_TYPE.CV_CALIB_FIX_PRINCIPAL_POINT) > 0;
            m_FixAspectRatioCheckBox.Checked           = (calibrationFlags & CALIB_TYPE.CV_CALIB_FIX_ASPECT_RATIO) > 0;
            m_FixFocalLengthCheckBox.Checked           = (calibrationFlags & CALIB_TYPE.CV_CALIB_FIX_FOCAL_LENGTH) > 0;
            m_FixK1CheckBox.Checked                    = (calibrationFlags & CALIB_TYPE.CV_CALIB_FIX_K1) > 0;
            m_FixK2CheckBox.Checked                    = (calibrationFlags & CALIB_TYPE.CV_CALIB_FIX_K2) > 0;
            m_FixK3CheckBox.Checked                    = (calibrationFlags & CALIB_TYPE.CV_CALIB_FIX_K3) > 0;
            m_ZeroTangentialDistortionCheckBox.Checked = (calibrationFlags & CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST) > 0;
        }
        //called when data for any output pin is requested
        public void Evaluate(int SpreadMax)
        {
            if (FPinInDo[0])
            {
                int nPointsPerImage = FPinInObject.SliceCount;
                if (nPointsPerImage == 0)
                {
                    FStatus[0] = "Insufficient points";
                    return;
                }
                int nImages = Math.Max(FPinInImage1.SliceCount, FPinInImage2.SliceCount) / nPointsPerImage;

                CALIB_TYPE        flags        = CALIB_TYPE.DEFAULT;
                MCvTermCriteria   termCrit     = new MCvTermCriteria(100, 0.001);
                MCvPoint3D32f[][] objectPoints = new MCvPoint3D32f[nImages][];
                PointF[][]        imagePoints1 = new PointF[nImages][];
                PointF[][]        imagePoints2 = new PointF[nImages][];
                Size imageSize = new Size((int)FPinInSensorSize[0].x, (int)FPinInSensorSize[0].y);
                ExtrinsicCameraParameters interCameraExtrinsics;
                Matrix <double>           foundamentalMatrix;
                Matrix <double>           essentialMatrix;
                IntrinsicCameraParameters intrinsics1 = FPinInIntrinsics1[0].intrinsics;
                IntrinsicCameraParameters intrinsics2 = FPinInIntrinsics2[0].intrinsics;

                imagePoints1 = MatrixUtils.ImagePoints(FPinInImage1, nPointsPerImage);
                imagePoints2 = MatrixUtils.ImagePoints(FPinInImage2, nPointsPerImage);

                for (int i = 0; i < nImages; i++)
                {
                    objectPoints[i] = MatrixUtils.ObjectPoints(FPinInObject, true);
                }

                try
                {
                    CameraCalibration.StereoCalibrate(objectPoints, imagePoints1, imagePoints2, intrinsics1, intrinsics2, imageSize, flags, termCrit, out interCameraExtrinsics, out foundamentalMatrix, out essentialMatrix);

                    Extrinsics extrinsics = new Extrinsics(interCameraExtrinsics);
                    FPinOutExtrinsics[0] = extrinsics;
                    FPinOutTransform[0]  = extrinsics.Matrix;

                    FPinOutSuccess[0] = true;
                    FStatus[0]        = "OK";
                }
                catch (Exception e)  {
                    FPinOutSuccess[0] = false;
                    FStatus[0]        = e.Message;
                }
            }
        }
Example #7
0
        private void OnClibrationFlagsCheckChanged(object sender, EventArgs e)
        {
            CALIB_TYPE calibrationFlags = CALIB_TYPE.DEFAULT;

            if (m_UseIntrinsicGuessCheckBox.Checked)
            {
                calibrationFlags |= CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS;
            }
            if (m_FixPrincipalPointCheckBox.Checked)
            {
                calibrationFlags |= CALIB_TYPE.CV_CALIB_FIX_PRINCIPAL_POINT;
            }
            if (m_FixAspectRatioCheckBox.Checked)
            {
                calibrationFlags |= CALIB_TYPE.CV_CALIB_FIX_ASPECT_RATIO;
            }
            if (m_FixFocalLengthCheckBox.Checked)
            {
                calibrationFlags |= CALIB_TYPE.CV_CALIB_FIX_FOCAL_LENGTH;
            }
            if (m_FixK1CheckBox.Checked)
            {
                calibrationFlags |= CALIB_TYPE.CV_CALIB_FIX_K1;
            }
            if (m_FixK2CheckBox.Checked)
            {
                calibrationFlags |= CALIB_TYPE.CV_CALIB_FIX_K2;
            }
            if (m_FixK3CheckBox.Checked)
            {
                calibrationFlags |= CALIB_TYPE.CV_CALIB_FIX_K3;
            }
            if (m_ZeroTangentialDistortionCheckBox.Checked)
            {
                calibrationFlags |= CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST;
            }

            m_Model.CalibrationFlags = calibrationFlags;
        }
        private void GetFlags(out CALIB_TYPE flags)
        {
            flags = 0;
            if (FPinInIntrinsicGuess[0])
            {
                flags |= CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS;
            }

            if (FPinInFixAspectRatio[0])
            {
                flags |= CALIB_TYPE.CV_CALIB_FIX_ASPECT_RATIO;
            }

            if (FPinInFixPincipalPoint[0])
            {
                flags |= CALIB_TYPE.CV_CALIB_FIX_PRINCIPAL_POINT;
            }

            if (FPinInZeroTangent[0])
            {
                flags |= CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST;
            }

            if (FPinInFixFocalLength[0])
            {
                flags |= CALIB_TYPE.CV_CALIB_FIX_FOCAL_LENGTH;
            }

            if (FPinInFixDistortion[0])
            {
                flags |= (CALIB_TYPE.CV_CALIB_FIX_K1 | CALIB_TYPE.CV_CALIB_FIX_K2 | CALIB_TYPE.CV_CALIB_FIX_K3 | CALIB_TYPE.CV_CALIB_FIX_K4 | CALIB_TYPE.CV_CALIB_FIX_K5 | CALIB_TYPE.CV_CALIB_FIX_K6);
            }

            if (FPinInRationalModel[0])
            {
                flags |= CALIB_TYPE.CV_CALIB_RATIONAL_MODEL;
            }
        }
Example #9
0
        //called when data for any output pin is requested
        public void Evaluate(int SpreadMax)
        {
            if (FPinInDo[0])
            {
                int  nPointsPerImage = FPinInObject.SliceCount;
                bool useVVVVCoords   = FPinInCoordSystem[0] == TCoordinateSystem.VVVV;

                if (nPointsPerImage == 0)
                {
                    FStatus[0] = "Insufficient points";
                    return;
                }
                int nImages = FPinInImage.SliceCount / nPointsPerImage;

                MCvPoint3D32f[][] objectPoints = new MCvPoint3D32f[nImages][];
                PointF[][]        imagePoints  = new PointF[nImages][];
                Size       imageSize           = new Size((int)FPinInSensorSize[0].x, (int)FPinInSensorSize[0].y);
                CALIB_TYPE flags = new CALIB_TYPE();
                IntrinsicCameraParameters   intrinsicParam = new IntrinsicCameraParameters();
                ExtrinsicCameraParameters[] extrinsicsPerView;
                GetFlags(out flags);

                if (flags.HasFlag(CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS))
                {
                    if (FPinInIntrinsics[0] == null)
                    {
                        Matrix <double> mat = intrinsicParam.IntrinsicMatrix;
                        mat[0, 0] = FPinInSensorSize[0].x / 2.0d;
                        mat[1, 1] = FPinInSensorSize[0].y / 2.0d;
                        mat[0, 2] = FPinInSensorSize[0].x / 2.0d;
                        mat[1, 2] = FPinInSensorSize[0].y / 2.0d;
                        mat[2, 2] = 1;
                    }
                    else
                    {
                        intrinsicParam.DistortionCoeffs = FPinInIntrinsics[0].intrinsics.DistortionCoeffs.Clone();
                        intrinsicParam.IntrinsicMatrix  = FPinInIntrinsics[0].intrinsics.IntrinsicMatrix.Clone();
                    }
                }

                imagePoints = MatrixUtils.ImagePoints(FPinInImage, nPointsPerImage);

                for (int i = 0; i < nImages; i++)
                {
                    objectPoints[i] = MatrixUtils.ObjectPoints(FPinInObject, useVVVVCoords);
                }

                try
                {
                    FPinOutError[0] = CameraCalibration.CalibrateCamera(objectPoints, imagePoints, imageSize, intrinsicParam, flags, out extrinsicsPerView);

                    Intrinsics intrinsics = new Intrinsics(intrinsicParam, imageSize);
                    FPinOutIntrinsics[0] = intrinsics;
                    if (useVVVVCoords)
                    {
                        FPinOutProjection[0] = intrinsics.Matrix;
                    }
                    else
                    {
                        FPinOutProjection[0] = intrinsics.Matrix;
                    }

                    FPinOutExtrinsics.SliceCount = nImages;
                    FPinOutView.SliceCount       = nImages;
                    for (int i = 0; i < nImages; i++)
                    {
                        Extrinsics extrinsics = new Extrinsics(extrinsicsPerView[i]);
                        FPinOutExtrinsics[i] = extrinsics;

                        if (useVVVVCoords)
                        {
                            FPinOutView[i] = MatrixUtils.ConvertToVVVV(extrinsics.Matrix);
                        }
                        else
                        {
                            FPinOutView[i] = extrinsics.Matrix;
                        }
                    }

                    FPinOutSuccess[0] = true;
                    FStatus[0]        = "OK";
                }
                catch (Exception e)  {
                    FPinOutSuccess[0] = false;
                    FStatus[0]        = e.Message;
                }
            }
        }
 public CalibrateDialogModel(MainModel mainModel)
 {
     m_MainModel = mainModel;
     InitializeCameraParameters();
     m_CalibrationFlags = CALIB_TYPE.CV_CALIB_FIX_ASPECT_RATIO | CALIB_TYPE.CV_CALIB_FIX_K3 | CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST;
 }
Example #11
0
    // Use this for initialization
    void Start()
    {
        //init variables
        unityObjectPoints = new Vector3[1][];
        unityObjectPoints [0] = new Vector3[numPoints];
        unityImagePoints = new Vector2[1][];
        unityImagePoints [0] = new Vector2[numPoints];
        objectPoints = new MCvPoint3D32f[1][];
        objectPoints [0] = new MCvPoint3D32f[numPoints];
        imagePoints = new PointF[1][];
        imagePoints [0] = new PointF[numPoints];

        imageSize = new Size (Screen.width, Screen.height);
        intrinsics = new IntrinsicCameraParameters ();

        //Settings based on Mapamok default settings
        calibrationType = CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS
                | CALIB_TYPE.CV_CALIB_FIX_PRINCIPAL_POINT //required to work properly !!
                | CALIB_TYPE.CV_CALIB_FIX_ASPECT_RATIO
                | CALIB_TYPE.CV_CALIB_FIX_K1
                | CALIB_TYPE.CV_CALIB_FIX_K2
                | CALIB_TYPE.CV_CALIB_FIX_K3
                | CALIB_TYPE.CV_CALIB_FIX_K4
                | CALIB_TYPE.CV_CALIB_FIX_K5
                | CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST
                ;

        termCriteria = new MCvTermCriteria();

        //used for CV Matrix to unity camera position

        setPointsFromObject (calibObject);
    }
		private void GetFlags(out CALIB_TYPE flags)
		{
			flags = 0;
			if (FPinInIntrinsicGuess[0])
				flags |= CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS;

			if (FPinInFixAspectRatio[0])
				flags |= CALIB_TYPE.CV_CALIB_FIX_ASPECT_RATIO;

			if (FPinInFixPincipalPoint[0])
				flags |= CALIB_TYPE.CV_CALIB_FIX_PRINCIPAL_POINT;

			if (FPinInZeroTangent[0])
				flags |= CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST;
 
			if (FPinInFixFocalLength[0])
				flags |= CALIB_TYPE.CV_CALIB_FIX_FOCAL_LENGTH;
 
			if (FPinInFixDistortion[0])
				flags |=  (CALIB_TYPE.CV_CALIB_FIX_K1 | CALIB_TYPE.CV_CALIB_FIX_K2 | CALIB_TYPE.CV_CALIB_FIX_K3 | CALIB_TYPE.CV_CALIB_FIX_K4 | CALIB_TYPE.CV_CALIB_FIX_K5 | CALIB_TYPE.CV_CALIB_FIX_K6);

			if (FPinInRationalModel[0])
				flags |= CALIB_TYPE.CV_CALIB_RATIONAL_MODEL;
		}
Example #13
0
        public DistortionParameters Calibrate()
        {
            CALIB_TYPE flags =
                //CALIB_TYPE.CV_CALIB_FIX_ASPECT_RATIO |
                //CALIB_TYPE.CV_CALIB_FIX_FOCAL_LENGTH |
                //CALIB_TYPE.CV_CALIB_FIX_PRINCIPAL_POINT |
                //CALIB_TYPE.CV_CALIB_FIX_K3 |
                (CALIB_TYPE)16384; // CV_CALIB_RATIONAL_MODEL

            int imageCount = allImagePoints.Length;

            int[] pointCounts = new int[allObjectPoints.Length];
            for (int i = 0; i < allObjectPoints.Length; i++)
            {
                // TODO: Check that both image and object have the same number of points for this image.
                pointCounts[i] = allObjectPoints[i].Length;
            }

            IntrinsicCameraParameters icp = new IntrinsicCameraParameters();

            MCvTermCriteria termCriteria = new MCvTermCriteria();

            termCriteria.type     = TERMCRIT.CV_TERMCRIT_ITER | TERMCRIT.CV_TERMCRIT_EPS;
            termCriteria.max_iter = 30;
            termCriteria.epsilon  = 0.001;

            using (Matrix <float> objectPointMatrix = EmguHelper.ToMatrix(allObjectPoints))
                using (Matrix <float> imagePointMatrix = EmguHelper.ToMatrix(allImagePoints))
                    using (Matrix <int> pointCountsMatrix = new Matrix <int>(pointCounts))
                        using (Matrix <double> rotationVectors = new Matrix <double>(imageCount, 3))
                            using (Matrix <double> translationVectors = new Matrix <double>(imageCount, 3))
                            {
                                CvInvoke.cvCalibrateCamera2(
                                    objectPointMatrix.Ptr,
                                    imagePointMatrix.Ptr,
                                    pointCountsMatrix.Ptr,
                                    imageSize,
                                    icp.IntrinsicMatrix,
                                    icp.DistortionCoeffs,
                                    rotationVectors,
                                    translationVectors,
                                    flags,
                                    termCriteria);
                            }

            double k1 = icp.DistortionCoeffs[0, 0];
            double k2 = icp.DistortionCoeffs[1, 0];
            double k3 = icp.DistortionCoeffs[4, 0];
            double p1 = icp.DistortionCoeffs[2, 0];
            double p2 = icp.DistortionCoeffs[3, 0];
            double fx = icp.IntrinsicMatrix[0, 0];
            double fy = icp.IntrinsicMatrix[1, 1];
            double cx = icp.IntrinsicMatrix[0, 2];
            double cy = icp.IntrinsicMatrix[1, 2];

            DistortionParameters parameters = new DistortionParameters(icp);

            log.DebugFormat("Distortion coefficients: k1:{0:0.000}, k2:{1:0.000}, k3:{2:0.000}, p1:{3:0.000}, p2:{4:0.000}.", k1, k2, k3, p1, p2);
            log.DebugFormat("Camera intrinsics: fx:{0:0.000}, fy:{1:0.000}, cx:{2:0.000}, cy:{3:0.000}", fx, fy, cx, cy);

            return(parameters);
        }
Example #14
0
        //called when data for any output pin is requested
        public void Evaluate(int SpreadMax)
        {
            if (FPinInDo[0])
            {
                int nPointsPerImage = FPinInObject.SliceCount;
                if (nPointsPerImage == 0)
                {
                    FStatus[0] = "Insufficient points";
                    return;
                }
                int nImages = FPinInImage.SliceCount / nPointsPerImage;

                MCvPoint3D32f[][] objectPoints = new MCvPoint3D32f[nImages][];
                PointF[][]        imagePoints  = new PointF[nImages][];
                Size       imageSize           = new Size(FPinInSensorSize[0], FPinInSensorSize[1]);
                CALIB_TYPE flags = new CALIB_TYPE();
                IntrinsicCameraParameters   intrinsicParam = new IntrinsicCameraParameters();
                ExtrinsicCameraParameters[] extrinsicsPerView;
                GetFlags(out flags);

                if (FPinInIntrinsicGuess[0])
                {
                    Matrix <double> mat = intrinsicParam.IntrinsicMatrix;
                    mat[0, 0] = FPinInSensorSize[0];
                    mat[1, 1] = FPinInSensorSize[1];
                    mat[0, 2] = FPinInSensorSize[0] / 2.0d;
                    mat[1, 2] = FPinInSensorSize[1] / 2.0d;
                    mat[2, 2] = 1;
                }

                for (int i = 0; i < nImages; i++)
                {
                    objectPoints[i] = new MCvPoint3D32f[nPointsPerImage];
                    imagePoints[i]  = new PointF[nPointsPerImage];

                    for (int j = 0; j < nPointsPerImage; j++)
                    {
                        objectPoints[i][j].x = (float)FPinInObject[j].x;
                        objectPoints[i][j].y = (float)FPinInObject[j].y;
                        objectPoints[i][j].z = (float)FPinInObject[j].z;

                        imagePoints[i][j].X = (float)FPinInImage[i * nPointsPerImage + j].x;
                        imagePoints[i][j].Y = (float)FPinInImage[i * nPointsPerImage + j].y;
                    }
                }

                try
                {
                    FPinOutError[0]     = CameraCalibration.CalibrateCamera(objectPoints, imagePoints, imageSize, intrinsicParam, flags, out extrinsicsPerView);
                    FPinOutIntinsics[0] = intrinsicParam;


                    FPinOutExtrinsics.SliceCount = nImages;
                    for (int i = 0; i < nImages; i++)
                    {
                        FPinOutExtrinsics[i] = extrinsicsPerView[i];
                    }

                    FStatus[0] = "OK";
                }
                catch (Exception e)  {
                    FStatus[0] = e.Message;
                }
            }
        }
		private void GetFlags(out CALIB_TYPE flags)
		{
			flags = 0;
			foreach (var flag in FPinInFlags)
				flags |= flag;
		}
		//called when data for any output pin is requested
		public void Evaluate(int SpreadMax)
		{
			if (FPinInDo[0])
			{
				int nPointsPerImage = FPinInObject.SliceCount;
				bool useVVVVCoords = FPinInCoordSystem[0] == TCoordinateSystem.VVVV;

				if (nPointsPerImage == 0)
				{
					FStatus[0] = "Insufficient points";
					return;
				}
				int nImages = FPinInImage.SliceCount / nPointsPerImage;

				MCvPoint3D32f[][] objectPoints = new MCvPoint3D32f[nImages][];
				PointF[][] imagePoints = new PointF[nImages][];
				Size imageSize = new Size( (int) FPinInSensorSize[0].x, (int) FPinInSensorSize[0].y);
				CALIB_TYPE flags = new CALIB_TYPE();
				IntrinsicCameraParameters intrinsicParam = new IntrinsicCameraParameters();
				ExtrinsicCameraParameters[] extrinsicsPerView;
				GetFlags(out flags);

				if (flags.HasFlag(CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS))
				{
					if (FPinInIntrinsics[0] == null)
					{
						Matrix<double> mat = intrinsicParam.IntrinsicMatrix;
						mat[0, 0] = FPinInSensorSize[0].x / 2.0d;
						mat[1, 1] = FPinInSensorSize[0].y / 2.0d;
						mat[0, 2] = FPinInSensorSize[0].x / 2.0d;
						mat[1, 2] = FPinInSensorSize[0].y / 2.0d;
						mat[2, 2] = 1;
					}
					else
					{
						intrinsicParam.DistortionCoeffs = FPinInIntrinsics[0].intrinsics.DistortionCoeffs.Clone();
						intrinsicParam.IntrinsicMatrix = FPinInIntrinsics[0].intrinsics.IntrinsicMatrix.Clone();
					}

				}

				imagePoints = MatrixUtils.ImagePoints(FPinInImage, nPointsPerImage);

				for (int i=0; i<nImages; i++)
				{
					objectPoints[i] = MatrixUtils.ObjectPoints(FPinInObject, useVVVVCoords);
				}

				try
				{
					FPinOutError[0] = CameraCalibration.CalibrateCamera(objectPoints, imagePoints, imageSize, intrinsicParam, flags, out extrinsicsPerView);

					Intrinsics intrinsics = new Intrinsics(intrinsicParam, imageSize);
					FPinOutIntrinsics[0] = intrinsics;
					if (useVVVVCoords)
						FPinOutProjection[0] = intrinsics.Matrix;
					else
						FPinOutProjection[0] = intrinsics.Matrix;

					FPinOutExtrinsics.SliceCount = nImages;
					FPinOutView.SliceCount = nImages;
					for (int i = 0; i < nImages; i++)
					{
						Extrinsics extrinsics = new Extrinsics(extrinsicsPerView[i]);
						FPinOutExtrinsics[i] = extrinsics;

						if (useVVVVCoords)
							FPinOutView[i] = MatrixUtils.ConvertToVVVV(extrinsics.Matrix);
						else
							FPinOutView[i] = extrinsics.Matrix;
					}

					FPinOutSuccess[0] = true;
					FStatus[0] = "OK";
				}
				catch (Exception e)  {
					FPinOutSuccess[0] = false;
					FStatus[0] = e.Message;
				}
			}

		}
		//called when data for any output pin is requested
		public void Evaluate(int SpreadMax)
		{
			if (FPinInDo[0])
			{
				int nPointsPerImage = FPinInObject.SliceCount;
				if (nPointsPerImage == 0)
				{
					FStatus[0] = "Insufficient points";
					return;
				}
				int nImages = FPinInImage.SliceCount / nPointsPerImage;

				MCvPoint3D32f[][] objectPoints = new MCvPoint3D32f[nImages][];
				PointF[][] imagePoints = new PointF[nImages][];
				Size imageSize = new Size(FPinInSensorSize[0], FPinInSensorSize[1]);
				CALIB_TYPE flags = new CALIB_TYPE();
				IntrinsicCameraParameters intrinsicParam = new IntrinsicCameraParameters();
				ExtrinsicCameraParameters[] extrinsicsPerView;
				GetFlags(out flags);

				if (FPinInIntrinsicGuess[0])
				{
					Matrix<double> mat = intrinsicParam.IntrinsicMatrix;
					mat[0, 0] = FPinInSensorSize[0];
					mat[1, 1] = FPinInSensorSize[1];
					mat[0, 2] = FPinInSensorSize[0] / 2.0d;
					mat[1, 2] = FPinInSensorSize[1] / 2.0d;
					mat[2, 2] = 1;

				}

				for (int i=0; i<nImages; i++)
				{
					objectPoints[i] = new MCvPoint3D32f[nPointsPerImage];
					imagePoints[i] = new PointF[nPointsPerImage];

					for (int j=0; j<nPointsPerImage; j++)
					{
						objectPoints[i][j].x = (float)FPinInObject[j].x;
						objectPoints[i][j].y = (float)FPinInObject[j].y;
						objectPoints[i][j].z = (float)FPinInObject[j].z;
						
						imagePoints[i][j].X = (float)FPinInImage[i*nPointsPerImage + j].x;
						imagePoints[i][j].Y = (float)FPinInImage[i*nPointsPerImage + j].y;
					}
				}

				try
				{
					FPinOutError[0] = CameraCalibration.CalibrateCamera(objectPoints, imagePoints, imageSize, intrinsicParam, flags, out extrinsicsPerView);
					FPinOutIntinsics[0] = intrinsicParam;


					FPinOutExtrinsics.SliceCount = nImages;
					for (int i = 0; i < nImages; i++)
						FPinOutExtrinsics[i] = extrinsicsPerView[i];

					FStatus[0] = "OK";
				}
				catch (Exception e)  {
					FStatus[0] = e.Message;
				}
			}

		}