public double Calibrate(Size resolution)
		{
			MCvPoint3D32f[][] objectPoints = new MCvPoint3D32f[1][];
			PointF[][] imagePoints = new PointF[1][];

			int count = this.FObjectPoints.Count;

			objectPoints[0] = new MCvPoint3D32f[count];
			imagePoints[0] = new PointF[count];

			for (int i = 0; i < count; i++)
			{
				objectPoints[0][i] = FObjectPoints[i];
				imagePoints[0][i] = FImagePoints[i];
			}

			IntrinsicCameraParameters intrinsicParam = new IntrinsicCameraParameters();
			ExtrinsicCameraParameters[] extrinsicParams;

			Matrix<double> mat = intrinsicParam.IntrinsicMatrix;
			mat[0, 0] = resolution.Width;
			mat[1, 1] = resolution.Height;
			mat[0, 2] = resolution.Width / 2.0d;
			mat[1, 2] = resolution.Height / 2.0d;
			mat[2, 2] = 1;

			CALIB_TYPE flags;
			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 | CALIB_TYPE.CV_CALIB_USE_INTRINSIC_GUESS | CALIB_TYPE.CV_CALIB_ZERO_TANGENT_DIST;

			double error = CameraCalibration.CalibrateCamera(objectPoints, imagePoints, resolution, intrinsicParam, flags, out extrinsicParams);
			this.FIntrinsics = new Intrinsics(intrinsicParam, resolution);
			this.FExtrinsics = new Extrinsics(extrinsicParams[0]);
			return error;
		}
Пример #2
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( (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;
						mat[1, 1] = FPinInSensorSize[0].y;
						mat[0, 2] = FPinInSensorSize[0].x / 2.0d;
						mat[1, 2] = FPinInSensorSize[0].y / 2.0d;
						mat[2, 2] = 1;
					}
					else
					{
						intrinsicParam = FPinInIntrinsics[0].intrinsics;
					}

				}

				imagePoints = MatrixUtils.ImagePoints(FPinInImage, nPointsPerImage);

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

					for (int j=0; j<nPointsPerImage; j++)
					{
						objectPoints[i] = MatrixUtils.ObjectPoints(FPinInObject);
					}
				}

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

					Intrinsics intrinsics = new Intrinsics(intrinsicParam, imageSize);
					FPinOutIntrinsics[0] = intrinsics;
					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;
						FPinOutView[i] = extrinsics.Matrix;
					}

					if (FPinInCoordSystem[0] == TCoordinateSystem.VVVV)
					{
						for (int i=0; i<FPinOutView.SliceCount; i++)
							FPinOutView[i] = MatrixUtils.ConvertToVVVV(FPinOutView[i]);
					}

					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((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;
                        mat[1, 1] = FPinInSensorSize[0].y;
                        mat[0, 2] = FPinInSensorSize[0].x / 2.0d;
                        mat[1, 2] = FPinInSensorSize[0].y / 2.0d;
                        mat[2, 2] = 1;
                    }
                    else
                    {
                        intrinsicParam = FPinInIntrinsics[0].intrinsics;
                    }
                }

                imagePoints = MatrixUtils.ImagePoints(FPinInImage, nPointsPerImage);

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

                    for (int j = 0; j < nPointsPerImage; j++)
                    {
                        objectPoints[i] = MatrixUtils.ObjectPoints(FPinInObject);
                    }
                }

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

                    Intrinsics intrinsics = new Intrinsics(intrinsicParam, imageSize);
                    FPinOutIntrinsics[0] = intrinsics;
                    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;
                        FPinOutView[i]       = extrinsics.Matrix;
                    }

                    if (FPinInCoordSystem[0] == TCoordinateSystem.VVVV)
                    {
                        for (int i = 0; i < FPinOutView.SliceCount; i++)
                        {
                            FPinOutView[i] = MatrixUtils.ConvertToVVVV(FPinOutView[i]);
                        }
                    }

                    FPinOutSuccess[0] = true;
                    FStatus[0]        = "OK";
                }
                catch (Exception e)  {
                    FPinOutSuccess[0] = false;
                    FStatus[0]        = e.Message;
                }
            }
        }
		public void Calibrate(Size Resolution)
		{
			CalibrationSet Calibration = new CalibrationSet();
			try
			{
				foreach (var Correspondence in this.Correspondences)
				{
					Calibration.Add(Correspondence.World, Correspondence.Projection);
				}
				this.ReprojectionError = Calibration.Calibrate(Resolution);
				this.FView = Calibration.View;
				this.FProjection = Calibration.Projection;
				this.Intrinsics = Calibration.Intrinsics;
				this.Calibrated = true;
			}
			catch (Exception e)
			{
                this.ReprojectionError = 0.0;
				this.Calibrated = false;
			}
		}