Exemplo n.º 1
0
        public byte[] FusionCameraPose()
        {
            //Create a defined registration pattern - in this case a cube
            var cube    = CoordinateDefinition.Microcube();
            var yu2     = LatestYUVImage();
            var colorCv = new CvColor(yu2);
            //Find and draw (make sure it can be found)
            var markers = Vision.FindAruco(colorCv);

            if (!markers.Any())
            {
                return(PoseFormatter.PoseToBytes(new double[4, 4]));
            }                                                                          //zeros

            //Calculate pose
            var depth = LatestDepthImage();

            CameraSpacePoint[] _3dImage = new CameraSpacePoint[KinectSettings.COLOR_PIXEL_COUNT];
            KxBuffer.instance.coordinateMapper.MapColorFrameToCameraSpace(depth, _3dImage);
            var cvCameraSpace = new CvCameraSpace(_3dImage);
            var kxTransform   = Vision.GetPoseFromImage(cube, cvCameraSpace, markers);
            var pose          = kxTransform.FusionCameraPose;

            return(PoseFormatter.PoseToBytes(pose));
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            RemoteKinectXEFExample.Run(null);
            RGBPointCloudExampleWithMarkerHightlights.Run(null);
            MulticameraFusionExample.Run(null);

            var xefPath = @"C:\XEF\cam1_cal.xef";
            var xef     = new Xef(xefPath);
            //Load computer vision (CV) color file
            var colorCV = xef.LoadCvColorFrame(0);
            var cube    = CoordinateDefinition.Microcube();

            var markers    = colorCV.FindAruco();
            var colorBytes = colorCV.GetBRGABytes();
            var cspace     = xef.LoadCVCameraSpace(2);
            var marker1    = cspace.SubMat(Cv2.BoundingRect(markers.First().Points));
            var realMask   = marker1.GetRealMask();
            var center     = marker1.Mean(realMask);

            var marker2 = cspace.SubMat(Cv2.BoundingRect(markers.Skip(1).First().Points));

            realMask = marker2.GetRealMask();
            var center2           = marker2.Mean(realMask);
            var between           = center2.DistanceTo(center);
            var indeterminiteMask = marker1.GetIndeterminteMask();

            realMask.ShowNoWait();
            Cv2.WaitKey(0);
            Console.Read();
            //Save as XYZRGB file (open in MeshLab to view)
            // XYZRGB.Export(cameraSpace, colorBytes, @"C:\XEF\cam1_cal.txt");
        }
Exemplo n.º 3
0
        public static void Run(string[] args)
        {
            int NUM_SCANS_PER_CAMERA = 20;

            //Create a defined registration pattern - in this case a cube
            var cube = CoordinateDefinition.Microcube();

            var scans = new Dictionary <string, string>()
            {
                { @"C:\XEF\cam2_cal.xef", @"C:\XEF\cam2_cal.xef" },
                // {@"C:\XEF\cam1_cal.xef", @"C:\XEF\cam1_cal.xef" }
            };

            var fusion = new Engine();

            FusionVolume.VoxelsPerMeter = 384;
            FusionVolume.VoxelsX        = 384;
            FusionVolume.VoxelsY        = 384;
            FusionVolume.VoxelsZ        = 384;

            var firstPose = Pose.GetPoseFromXef(scans.First().Key)
                            .FusionCameraPose
                            .ToMatrix4();

            //Start fusion volume at first pose
            fusion.InitializeFusionVolume(firstPose);
            VolumeResetter.TranslateResetPoseByMinDepthThreshold = false;
            fusion.DataIntegrator.IntegrationWeight = 500;
            fusion.DataIntegrator.CaptureColor      = false;
            var listener = fusion.StartFrameListener <XefFrameListener>();

            foreach (var scan in scans)
            {
                var scanXef = scan.Value;
                var pose    = Pose.GetPoseFromXef(scan.Key)
                              .FusionCameraPose
                              .ToMatrix4();
                //This would be where you would set your scan xef
                listener.SetXefFile(scanXef);
                //You need to set world to camera BEFORE scanning (if more than one XEF)
                fusion.FusionVolume.WorldToCameraTransform = pose;
                fusion.Scanner.Scan(NUM_SCANS_PER_CAMERA, false);
            }

            fusion.RenderController.RenderReconstructionAsMat();
            fusion.FusionVolume.Renderer.RenderReconstruction();
            Cv2.WaitKey(0);
            //Export your model in world space (it is transformed already)
            fusion.MeshExporter.ExportVolume(@"C:\XEF\scan.ply");
            Console.Read();
        }
        public static void Run(string[] args)
        {
            //Create a defined registration pattern - in this case a cube
            var cube = CoordinateDefinition.Microcube();

            //Find registration
            var xef     = new Xef(@"../../../Resources/cube.xef");
            var colorCv = xef.LoadCvColorFrame(0);

            //Find and draw (make sure it can be found)
            var markers = Vision.FindAruco(colorCv);
            //Vision.DrawAruco(colorCv).Show();

            //Calculate pose
            var _3dImage    = xef.LoadCVCameraSpace(5);
            var kxTransform = Vision.GetPoseFromImage(cube, _3dImage, markers);
            var pose        = kxTransform.FusionCameraPose.ToMatrix4();

            var fusion = new Engine();

            FusionVolume.VoxelsPerMeter = 128;
            FusionVolume.VoxelsX        = 384;
            FusionVolume.VoxelsY        = 384;
            FusionVolume.VoxelsZ        = 384;

            //Start fusion volume at first pose
            fusion.InitializeFusionVolume(pose);
            VolumeResetter.TranslateResetPoseByMinDepthThreshold = false;

            fusion.DataIntegrator.CaptureColor = false;
            var listener = fusion.StartFrameListener <XefFrameListener>();

            //This would be where you would set your scan xef
            listener.SetXefFile(@"../../../Resources/cube.xef");
            //You need to set world to camera BEFORE scanning (if more than one XEF)
            fusion.FusionVolume.WorldToCameraTransform = pose;
            fusion.Scanner.Scan(3, false);

            fusion.RenderController.RenderReconstructionAsMat();
            fusion.FusionVolume.Renderer.RenderReconstruction();

            //Export your model in world space (it is transformed already)
            fusion.MeshExporter.ExportVolume(@"cube.ply");
            Console.Read();
        }