public AzureKinectCalibration(Camera depthCamera, Camera colorCamera,
                               Extrinsics depthToColorExtrinsics)
 {
     DepthCamera            = depthCamera;
     ColorCamera            = colorCamera;
     DepthToColorExtrinsics = depthToColorExtrinsics;
 }
 private Vector3D MapWorldToWorld(Vector3D original, Extrinsics extrinsics)
 {
     return(new Vector3D
            (
                extrinsics.rotation[0] * original[0] + extrinsics.rotation[3] * original[1] + extrinsics.rotation[6] * original[2] + extrinsics.translation[0],
                extrinsics.rotation[1] * original[0] + extrinsics.rotation[4] * original[1] + extrinsics.rotation[7] * original[2] + extrinsics.translation[1],
                extrinsics.rotation[2] * original[0] + extrinsics.rotation[5] * original[1] + extrinsics.rotation[8] * original[2] + extrinsics.translation[2]
            ));
 }
예제 #3
0
        // gets the given camera extrinsics
        private void GetCameraExtrinsics(Extrinsics camExtr, ref KinectInterop.CameraExtrinsics extr)
        {
            extr = new KinectInterop.CameraExtrinsics();

            extr.rotation = new float[camExtr.Rotation.Length];
            camExtr.Rotation.CopyTo(extr.rotation, 0);

            extr.translation = new float[camExtr.Translation.Length];
            camExtr.Translation.CopyTo(extr.translation, 0);
        }
 /// <summary>
 /// Creates a new coordinate mapper with the specified intrinsics and extrinsics parameters.
 /// </summary>
 /// <param name="colorIntrinsics">The color intrinsics.</param>
 /// <param name="colorExtrinsics">The color extrinsics.</param>
 /// <param name="depthIntrinsics">The depth intrinsics.</param>
 /// <param name="depthExtrinsics">The depth extrinsics.</param>
 /// <returns>The coordinate mapper with the given intrinsics and extrinsics.</returns>
 public static CoordinateMapper Create(Intrinsics colorIntrinsics, Extrinsics colorExtrinsics, Intrinsics depthIntrinsics, Extrinsics depthExtrinsics)
 {
     return(new CoordinateMapper
            (
                colorIntrinsics,
                colorExtrinsics,
                depthIntrinsics,
                depthExtrinsics
            ));
 }
예제 #5
0
        /// <summary>
        /// 開啟RealSense相機並進行取像
        /// </summary>
        internal void Open(out Image <Bgr, byte> ColorImg,
                           out Image <Rgb, byte> DepthImg,
                           out Image <Rgb, byte> FilteredImg,
                           out VideoFrame color,
                           out DepthFrame depth,
                           out Frame filtered)
        {
            DepthImg = null; ColorImg = null; FilteredImg = null; color = null; depth = null; filtered = null;
            if (CamState != CameraState.Opened)
            {
                PipelineProfile = Camera.Start(cfg);                                                            // 以cfg設定並開始串流
                vsp             = PipelineProfile.GetStream <VideoStreamProfile>(Intel.RealSense.Stream.Depth); // 取得內部參數
                intrinsics      = vsp.GetIntrinsics();
                sp         = PipelineProfile.GetStream(Intel.RealSense.Stream.Color);                           // 取得外部參數
                extrinsics = vsp.GetExtrinsicsTo(sp);
                CamState   = CameraState.Opened;                                                                // 更新相機狀態
            }
            else
            {
                try
                {
                    FrameSet frames = Camera.WaitForFrames();
                    depth    = frames.DepthFrame.DisposeWith(frames);
                    color    = frames.ColorFrame.DisposeWith(frames);
                    filtered = depth;
                    if (depth != null)
                    {
                        //Thres_Filter.Options[Option.MinDistance].Value = float.Parse(form1.textBox2.Text);
                        //Thres_Filter.Options[Option.MaxDistance].Value = float.Parse(form1.textBox1.Text);
                        //filtered = Thres_Filter.Process(filtered);

                        //Spa_Filter.Options[Option.FilterMagnitude].Value = 1;
                        //Spa_Filter.Options[Option.FilterSmoothAlpha].Value = 0.6f;
                        //Spa_Filter.Options[Option.FilterSmoothDelta].Value = 8;
                        //filtered = Spa_Filter.Process(filtered);

                        Temp_Filter.Options[Option.FilterSmoothAlpha].Value = 0.5f;
                        Temp_Filter.Options[Option.FilterSmoothDelta].Value = 20;
                        Temp_Filter.Options[Option.HolesFill].Value         = 2;
                        filtered = Temp_Filter.Process(filtered);

                        depColor      = colorizer.Colorize(depth);
                        filteredColor = colorizer.Colorize(filtered);

                        ColorImg    = new Image <Bgr, byte>(color.Width, color.Height, color.Stride, color.Data);
                        DepthImg    = new Image <Rgb, byte>(depColor.Width, depColor.Height, depColor.Stride, depColor.Data);
                        FilteredImg = new Image <Rgb, byte>(filteredColor.Width, filteredColor.Height, filteredColor.Stride, filteredColor.Data);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
예제 #6
0
        public CameraCalibrationResult(int _width, int _height, Extrinsics __extrinsics, Intrinsics __intrinsics, Distortion __distortion, double _error)
        {
            width  = _width;
            height = _height;

            this._extrinsics = __extrinsics;
            this._intrinsics = __intrinsics;
            this._distortion = __distortion;

            error = _error;
        }
        /// <summary>
        /// Creates a new coordinate mapper for the specified pipeline.
        /// </summary>
        /// <param name="pipeline">The specified pipeline.</param>
        /// <param name="colorWidth">The desired color frame width.</param>
        /// <param name="colorHeight">The desired color frame height.</param>
        /// <param name="depthWidth">The desired depth frame width.</param>
        /// <param name="depthHeight">The desired depth frame height.</param>
        /// <returns>The color/depth coordinate mapper of the current pipline, if all of the supported streams were found. Null otherwise.</returns>
        public static CoordinateMapper Create(PipelineProfile pipeline, int colorWidth, int colorHeight, int depthWidth, int depthHeight)
        {
            if (pipeline == null)
            {
                return(null);
            }
            if (pipeline.Streams == null)
            {
                return(null);
            }
            if (pipeline.Streams.Count == 0)
            {
                return(null);
            }

            StreamProfile colorProfile = null;
            StreamProfile depthProfile = null;

            foreach (StreamProfile profile in pipeline.Streams)
            {
                VideoStreamProfile videoProfile = profile as VideoStreamProfile;

                if (profile.Stream == Stream.Color && videoProfile.Width == colorWidth && videoProfile.Height == colorHeight)
                {
                    colorProfile = profile;
                }
                else if (profile.Stream == Stream.Depth && videoProfile.Width == depthWidth && videoProfile.Height == depthHeight)
                {
                    depthProfile = profile;
                }
            }

            if (colorProfile == null)
            {
                return(null);
            }
            if (depthProfile == null)
            {
                return(null);
            }

            Intrinsics colorIntrinsics = (colorProfile as VideoStreamProfile).GetIntrinsics();
            Extrinsics colorExtrinsics = colorProfile.GetExtrinsicsTo(depthProfile);
            Intrinsics depthIntrinsics = (depthProfile as VideoStreamProfile).GetIntrinsics();
            Extrinsics depthExtrinsics = depthProfile.GetExtrinsicsTo(colorProfile);

            return(Create(colorIntrinsics, colorExtrinsics, depthIntrinsics, depthExtrinsics));
        }
        /// <summary>
        /// Creates a new Coordinate Mapper with the specified intrinsics and extrinsics parameters.
        /// </summary>
        /// <param name="colorIntrinsics">The color intrinsics.</param>
        /// <param name="colorExtrinsics">The color extrinsics.</param>
        /// <param name="depthIntrinsics">The depth intrinsics.</param>
        /// <param name="depthExtrinsics">The depth extrinsics.</param>
        private CoordinateMapper(Intrinsics colorIntrinsics, Extrinsics colorExtrinsics, Intrinsics depthIntrinsics, Extrinsics depthExtrinsics)
        {
            ColorIntrinsics = colorIntrinsics;
            ColorExtrinsics = colorExtrinsics;
            DepthIntrinsics = depthIntrinsics;
            DepthExtrinsics = depthExtrinsics;

            if (ColorIntrinsics.width == DepthIntrinsics.width ||
                ColorIntrinsics.height == DepthIntrinsics.height ||
                ColorIntrinsics.ppx == DepthIntrinsics.ppx ||
                ColorIntrinsics.ppy == DepthIntrinsics.ppy ||
                ColorIntrinsics.fx == DepthIntrinsics.fx ||
                ColorIntrinsics.fy == DepthIntrinsics.fy ||
                ColorIntrinsics.model == DepthIntrinsics.model)
            {
                colorAndDepthMatch = true;
            }
        }
예제 #9
0
        private K4A.CalibrationCamera CreateCalibrationCamera(CameraCalibration cameraCalibration, int width, int height)
        {
            K4A.CalibrationCamera calibrationCamera = new K4A.CalibrationCamera();

            float[]    intrinsicsParameters = cameraCalibration.Intrinsics.Parameters;
            Extrinsics extrinsics           = cameraCalibration.Extrinsics;

            calibrationCamera.resolutionWidth  = width;
            calibrationCamera.resolutionHeight = height;
            calibrationCamera.metricRadius     = cameraCalibration.MetricRadius;

            calibrationCamera.intrinsics.cx           = intrinsicsParameters[0];
            calibrationCamera.intrinsics.cy           = intrinsicsParameters[1];
            calibrationCamera.intrinsics.fx           = intrinsicsParameters[2];
            calibrationCamera.intrinsics.fy           = intrinsicsParameters[3];
            calibrationCamera.intrinsics.k1           = intrinsicsParameters[4];
            calibrationCamera.intrinsics.k2           = intrinsicsParameters[5];
            calibrationCamera.intrinsics.k3           = intrinsicsParameters[6];
            calibrationCamera.intrinsics.k4           = intrinsicsParameters[7];
            calibrationCamera.intrinsics.k5           = intrinsicsParameters[8];
            calibrationCamera.intrinsics.k6           = intrinsicsParameters[9];
            calibrationCamera.intrinsics.codx         = intrinsicsParameters[10];
            calibrationCamera.intrinsics.cody         = intrinsicsParameters[11];
            calibrationCamera.intrinsics.p2           = intrinsicsParameters[12]; // p2: tangential distortion coefficient y
            calibrationCamera.intrinsics.p1           = intrinsicsParameters[13]; // p1: tangential distortion coefficient x
            calibrationCamera.intrinsics.metricRadius = intrinsicsParameters[14];

            calibrationCamera.extrinsics.rotation[0][0] = extrinsics.Rotation[0];
            calibrationCamera.extrinsics.rotation[0][1] = extrinsics.Rotation[1];
            calibrationCamera.extrinsics.rotation[0][2] = extrinsics.Rotation[2];
            calibrationCamera.extrinsics.rotation[1][0] = extrinsics.Rotation[3];
            calibrationCamera.extrinsics.rotation[1][1] = extrinsics.Rotation[4];
            calibrationCamera.extrinsics.rotation[1][2] = extrinsics.Rotation[5];
            calibrationCamera.extrinsics.rotation[2][0] = extrinsics.Rotation[6];
            calibrationCamera.extrinsics.rotation[2][1] = extrinsics.Rotation[7];
            calibrationCamera.extrinsics.rotation[2][2] = extrinsics.Rotation[8];
            calibrationCamera.extrinsics.translation[0] = extrinsics.Translation[0];
            calibrationCamera.extrinsics.translation[1] = extrinsics.Translation[1];
            calibrationCamera.extrinsics.translation[2] = extrinsics.Translation[2];

            return(calibrationCamera);
        }
        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);
        }
예제 #11
0
        K4A.CalibrationCamera CreateCalibrationCamera(CameraCalibration cameraCalibration, int width, int height)
        {
            K4A.CalibrationCamera calibrationCamera = new K4A.CalibrationCamera();

            float[]    intrinsicsParameters = cameraCalibration.Intrinsics.Parameters;
            Extrinsics extrinsics           = cameraCalibration.Extrinsics;

            calibrationCamera.resolutionWidth  = width;
            calibrationCamera.resolutionHeight = height;
            calibrationCamera.metricRadius     = cameraCalibration.MetricRadius;

            calibrationCamera.intrinsics.cx           = intrinsicsParameters[0];
            calibrationCamera.intrinsics.cy           = intrinsicsParameters[1];
            calibrationCamera.intrinsics.fx           = intrinsicsParameters[2];
            calibrationCamera.intrinsics.fy           = intrinsicsParameters[3];
            calibrationCamera.intrinsics.k1           = intrinsicsParameters[4];
            calibrationCamera.intrinsics.k2           = intrinsicsParameters[5];
            calibrationCamera.intrinsics.k3           = intrinsicsParameters[6];
            calibrationCamera.intrinsics.k4           = intrinsicsParameters[7];
            calibrationCamera.intrinsics.k5           = intrinsicsParameters[8];
            calibrationCamera.intrinsics.k6           = intrinsicsParameters[9];
            calibrationCamera.intrinsics.codx         = intrinsicsParameters[10];
            calibrationCamera.intrinsics.cody         = intrinsicsParameters[11];
            calibrationCamera.intrinsics.p2           = intrinsicsParameters[12]; // p2: tangential distortion coefficient y
            calibrationCamera.intrinsics.p1           = intrinsicsParameters[13]; // p1: tangential distortion coefficient x
            calibrationCamera.intrinsics.metricRadius = intrinsicsParameters[14];

            calibrationCamera.extrinsics.rotation[0][0] = extrinsics.Rotation[0];
            calibrationCamera.extrinsics.rotation[0][1] = extrinsics.Rotation[1];
            calibrationCamera.extrinsics.rotation[0][2] = extrinsics.Rotation[2];
            calibrationCamera.extrinsics.rotation[1][0] = extrinsics.Rotation[3];
            calibrationCamera.extrinsics.rotation[1][1] = extrinsics.Rotation[4];
            calibrationCamera.extrinsics.rotation[1][2] = extrinsics.Rotation[5];
            calibrationCamera.extrinsics.rotation[2][0] = extrinsics.Rotation[6];
            calibrationCamera.extrinsics.rotation[2][1] = extrinsics.Rotation[7];
            calibrationCamera.extrinsics.rotation[2][2] = extrinsics.Rotation[8];
            calibrationCamera.extrinsics.translation[0] = extrinsics.Translation[0];
            calibrationCamera.extrinsics.translation[1] = extrinsics.Translation[1];
            calibrationCamera.extrinsics.translation[2] = extrinsics.Translation[2];

            // Debug.Log("***** Camera parameters *****");
            // Debug.Log(" Intrinsics.cx: " + calibrationCamera.intrinsics.cx);
            // Debug.Log(" Intrinsics.cy: " + calibrationCamera.intrinsics.cy);
            // Debug.Log(" Intrinsics.fx: " + calibrationCamera.intrinsics.fx);
            // Debug.Log(" Intrinsics.fy: " + calibrationCamera.intrinsics.fy);
            // Debug.Log(" Intrinsics.k1: " + calibrationCamera.intrinsics.k1);
            // Debug.Log(" Intrinsics.k2: " + calibrationCamera.intrinsics.k2);
            // Debug.Log(" Intrinsics.k3: " + calibrationCamera.intrinsics.k3);
            // Debug.Log(" Intrinsics.k4: " + calibrationCamera.intrinsics.k4);
            // Debug.Log(" Intrinsics.k5: " + calibrationCamera.intrinsics.k5);
            // Debug.Log(" Intrinsics.k6: " + calibrationCamera.intrinsics.k6);
            // Debug.Log(" Intrinsics.codx: " + calibrationCamera.intrinsics.codx);
            // Debug.Log(" Intrinsics.cody: " + calibrationCamera.intrinsics.cody);
            // Debug.Log(" Intrinsics.p2: " + calibrationCamera.intrinsics.p2);
            // Debug.Log(" Intrinsics.p1: " + calibrationCamera.intrinsics.p1);
            // Debug.Log(" Intrinsics.metricRadius: " + calibrationCamera.intrinsics.metricRadius);
            // Debug.Log(" MetricRadius: " + calibrationCamera.metricRadius);
            // Debug.Log("*****************************");

            // for (int i = 0; i < extrinsics.Rotation.Length; i++)
            // {
            //     Debug.Log(" Extrinsics.R[" + i + "]: " + extrinsics.Rotation[i]);
            // }
            // for (int i = 0; i < extrinsics.Translation.Length; i++)
            // {
            //     Debug.Log(" Extrinsics.T[" + i + "]: " + extrinsics.Translation[i]);
            // }

            // extrinsics = deviceDepthCameraCalibration.Extrinsics;
            // for (int i = 0; i < extrinsics.Rotation.Length; i++)
            // {
            //     Debug.Log(" Extrinsics.R[" + i + "]: " + extrinsics.Rotation[i]);
            // }
            // for (int i = 0; i < extrinsics.Translation.Length; i++)
            // {
            //     Debug.Log(" Extrinsics.T[" + i + "]: " + extrinsics.Translation[i]);
            // }

            return(calibrationCamera);
        }
예제 #12
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;
				}
			}

		}
예제 #13
0
        public ProjectorCalibrationResult(int _width, int _height, Extrinsics _extrinsics, Intrinsics _intrinsics, Distortion _distortion, double _error) :
            base(_width, _height, _extrinsics, _intrinsics, _distortion, _error)

        {
        }
예제 #14
0
 internal static extern void rs2_get_extrinsics(
     StreamProfileHandle from,
     StreamProfileHandle to,
     out Extrinsics extrin,
     out RsError error);
예제 #15
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;
                }
            }
        }
예제 #16
0
        public override IObservable <Mat> Process(IObservable <DeviceEvents> source)
        {
            return(source.SelectMany(evts =>
            {
                var device = evts.Device;
                Extrinsics depthToColor;
                Intrinsics colorIntrinsics, depthIntrinsics;
                var colorStream = Observable.FromEvent <FrameCallback, Frame>(handler => evts.ColorFrame += handler, handler => evts.ColorFrame -= handler);
                var depthStream = Observable.FromEvent <FrameCallback, Frame>(handler => evts.DepthFrame += handler, handler => evts.DepthFrame -= handler);
                device.GetStreamIntrinsics(Stream.Color, out colorIntrinsics);
                device.GetStreamIntrinsics(Stream.Depth, out depthIntrinsics);
                device.GetExtrinsics(Stream.Depth, Stream.Color, out depthToColor);
                var pixelScale = new Vector2(colorIntrinsics.Width, colorIntrinsics.Height);
                var depthScale = device.DepthScale;


                int depthBufferWidth = 0;
                ushort[] depthBuffer = null;
                TexVertex[] depthPoints = null;
                var depthBufferStream = depthStream.Select(frame =>
                {
                    if (depthBuffer == null)
                    {
                        depthBufferWidth = frame.Width;
                        depthBuffer = new ushort[frame.Width * frame.Height];
                        depthPoints = new TexVertex[depthBuffer.Length];
                    }

                    var depthFrameHeader = new Mat(frame.Height, frame.Width, Depth.U16, 1, frame.FrameData, frame.Stride);
                    using (var bufferHeader = Mat.CreateMatHeader(depthBuffer, depthFrameHeader.Rows, depthFrameHeader.Cols, depthFrameHeader.Depth, depthFrameHeader.Channels))
                    {
                        CV.Copy(depthFrameHeader, bufferHeader);
                    }

                    return depthBuffer;
                });

                return depthBufferStream.Select(depth =>
                {
                    int pindex = 0;
                    for (int i = 0; i < depthBuffer.Length; i++)
                    {
                        Vector2 depthPixel, colorPixel;
                        depthPixel.X = i % depthBufferWidth;
                        depthPixel.Y = i / depthBufferWidth;
                        var depthValue = depth[i] * depthScale;
                        if (depthValue == 0)
                        {
                            continue;
                        }

                        Vector3 depthPoint, colorPoint;
                        Intrinsics.DeprojectPoint(ref depthPixel, ref depthIntrinsics, depthValue, out depthPoint);
                        Extrinsics.TransformPoint(ref depthPoint, ref depthToColor, out colorPoint);
                        Intrinsics.ProjectPoint(ref colorPoint, ref colorIntrinsics, out colorPixel);
                        Vector2.Divide(ref colorPixel, ref pixelScale, out depthPoints[pindex].TexCoord);
                        depthPoints[pindex].Position = depthPoint;
                        pindex++;
                    }

                    return Mat.FromArray(depthPoints, pindex, 5, Depth.F32, 1);
                });
            }));
        }