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)); }
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"); }
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(); }