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; }
//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; } }