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(); }
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); }
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); }
private void GetFlags(out CALIB_TYPE flags) { flags = 0; foreach (var flag in FPinInFlags) { flags |= flag; } }
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; } } }
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; } }
//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; }
// 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; }
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); }
//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; } } }