Example #1
0
        private static void TestCalibration(string pixelShape, bool uncalibrated, PointF pt1, PointF pt2, double calibrationValue, double expectedRowSpacing, double expectedColSpacing)
        {
            using (IPresentationImage image = GetCalibrationTestImage(pixelShape, uncalibrated))
            {
                Trace.WriteLine(string.Format("TEST {0} image with {1} pixels", uncalibrated ? "uncalibrated" : "calibrated", pixelShape));
                Trace.WriteLine(string.Format("calibrating [{0}, {1}] to {2} mm", pt1, pt2, calibrationValue));

                PolylineGraphic          lineGraphic;
                IOverlayGraphicsProvider overlayGraphicsProvider = (IOverlayGraphicsProvider)image;
                overlayGraphicsProvider.OverlayGraphics.Add(new VerticesControlGraphic(lineGraphic = new PolylineGraphic()));
                lineGraphic.CoordinateSystem = CoordinateSystem.Source;
                lineGraphic.Points.Add(pt1);
                lineGraphic.Points.Add(pt2);
                lineGraphic.ResetCoordinateSystem();

                CalibrationTool.TestCalibration(calibrationValue, lineGraphic);

                IImageSopProvider imageSopProvider = (IImageSopProvider)image;

                Trace.WriteLine(string.Format("Pixel Spacing (Actual)/(Expected): ({0:F4}:{1:F4})/({2:F4}:{3:F4})",
                                              imageSopProvider.Frame.NormalizedPixelSpacing.Row, imageSopProvider.Frame.NormalizedPixelSpacing.Column,
                                              expectedRowSpacing, expectedColSpacing));

                float percentErrorRow = Math.Abs((float)((imageSopProvider.Frame.NormalizedPixelSpacing.Row - expectedRowSpacing) / expectedRowSpacing * 100F));
                float percentErrorCol = Math.Abs((float)((imageSopProvider.Frame.NormalizedPixelSpacing.Column - expectedColSpacing) / expectedColSpacing * 100F));

                Trace.WriteLine(String.Format("Percent Error (Row/Column): {0:F3}%/{1:F3}%", percentErrorRow, percentErrorCol));

                Assert.AreEqual(expectedColSpacing, imageSopProvider.Frame.NormalizedPixelSpacing.Column, 0.005, "Column Spacing appears to be wrong");
                Assert.AreEqual(expectedRowSpacing, imageSopProvider.Frame.NormalizedPixelSpacing.Row, 0.005, "Row Spacing appears to be wrong");

                Assert.IsTrue(percentErrorCol < 1.5, "Column Spacing appears to be wrong");
                Assert.IsTrue(percentErrorRow < 1.5, "Row Spacing appears to be wrong");
            }
        }
Example #2
0
        public void TestComputationIsotropicPixel()
        {
            double widthInPixels = 4;
            double heightInPixels = 3;
            double pixelAspectRatio = 1;
            double pixelSpacingWidth, pixelSpacingHeight;

            double testPixelSpacingWidth  = 1;
            double testPixelSpacingHeight = testPixelSpacingWidth * pixelAspectRatio;
            double testWidthInMm          = testPixelSpacingWidth * widthInPixels;
            double testHeightInMm         = testPixelSpacingHeight * heightInPixels;
            double lengthInMm             = Math.Sqrt(testWidthInMm * testWidthInMm + testHeightInMm * testHeightInMm);

            CalibrationTool.CalculatePixelSpacing(
                lengthInMm,
                widthInPixels,
                heightInPixels,
                pixelAspectRatio,
                out pixelSpacingWidth,
                out pixelSpacingHeight);

            Assert.AreEqual(1, pixelSpacingWidth, 1e-10);
            Assert.AreEqual(1, pixelSpacingHeight, 1e-10);
        }
Example #3
0
        public CalibrationWindow(OptiTrackSystem optiTrack, KUKARobot robot1, KUKARobot robot2)
        {
            calibrationTool = new CalibrationTool(optiTrack);

            InitializeComponent();

            Text        = title;
            MinimumSize = new Size(Width, Height);
            MaximumSize = new Size(Width, Height);

            BindingList <KUKARobot> robotsList = new BindingList <KUKARobot>();

            robotSelect.DropDown += (s, e) => {
                if (robotsList.Contains(robot1))
                {
                    if (!robot1.IsInitialized())
                    {
                        robotsList.Remove(robot1);
                    }
                }
                else
                {
                    if (robot1.IsInitialized())
                    {
                        robotsList.Add(robot1);
                    }
                }

                if (robotsList.Contains(robot2))
                {
                    if (!robot2.IsInitialized())
                    {
                        robotsList.Remove(robot2);
                    }
                }
                else
                {
                    if (robot2.IsInitialized())
                    {
                        robotsList.Add(robot2);
                    }
                }
            };
            robotSelect.TextChanged += (s, e) => {
                selectedRobot = (KUKARobot)robotSelect.SelectedItem;

                if (selectedRobot != null)
                {
                    startBtn.Enabled = true;
                }
                else
                {
                    startBtn.Enabled = false;
                }
            };
            robotSelect.DataSource = robotsList;
            robotSelect.Text       = "- Select robot -";

            FormClosing    += (s, e) => calibrationTool.Cancel();
            startBtn.Click += (s, e) => {
                calibrationTool.Calibrate(selectedRobot, (int)intermediatePoints.Value, (int)samplesPerPoint.Value);
            };
            stopBtn.Click += (s, e) => {
                Text = title;
                robotSelect.Enabled = true;
                startBtn.Enabled    = true;
                calibrationTool.Cancel();
            };

            calibrationTool.Start += () => {
                UpdateUI(() => {
                    Text = $"{title} (0%)";
                    robotSelect.Enabled = false;
                    startBtn.Enabled    = false;
                });
            };
            calibrationTool.ProgressChanged += (progress, transformation) => {
                selectedRobot.OptiTrackTransformation = transformation;
                UpdateUI(() => {
                    Text = $"{title} ({progress}%)";
                    progressBar.Value = progress;
                    m11.Text          = transformation[0, 0].ToString("F3");
                    m12.Text          = transformation[0, 1].ToString("F3");
                    m13.Text          = transformation[0, 2].ToString("F3");
                    m14.Text          = transformation[0, 3].ToString("F3");

                    m21.Text = transformation[1, 0].ToString("F3");
                    m22.Text = transformation[1, 1].ToString("F3");
                    m23.Text = transformation[1, 2].ToString("F3");
                    m24.Text = transformation[1, 3].ToString("F3");

                    m31.Text = transformation[2, 0].ToString("F3");
                    m32.Text = transformation[2, 1].ToString("F3");
                    m33.Text = transformation[2, 2].ToString("F3");
                    m34.Text = transformation[2, 3].ToString("F3");

                    m41.Text = transformation[3, 0].ToString("F3");
                    m42.Text = transformation[3, 1].ToString("F3");
                    m43.Text = transformation[3, 2].ToString("F3");
                    m44.Text = transformation[3, 3].ToString("F3");
                });
            };
            calibrationTool.Completed += (transformation) => {
                selectedRobot.OptiTrackTransformation = transformation;
                UpdateUI(() => {
                    robotSelect.Enabled = true;
                    startBtn.Enabled    = true;
                });
            };
        }
        public CalibrationWindow(Robot robot, OptiTrackSystem optiTrack)
        {
            InitializeComponent();

            Transformation currentTransformation = null;

            calibrationTool = new CalibrationTool(robot, optiTrack);

            calibrationTool.Start += () => {
                Dispatcher.Invoke(() => {
                    progressBar.Value        = 0;
                    progressBarLabel.Content = "0%";
                    startBtn.IsEnabled       = false;
                    cancelBtn.IsEnabled      = true;
                });
            };

            calibrationTool.ProgressChanged += (progress, transformation) => {
                currentTransformation = transformation;

                Dispatcher.Invoke(() => {
                    progressBar.Value        = progress;
                    progressBarLabel.Content = $"{progress}%";

                    t00.Text = transformation[0, 0].ToString("F3");
                    t01.Text = transformation[0, 1].ToString("F3");
                    t02.Text = transformation[0, 2].ToString("F3");
                    t03.Text = transformation[0, 3].ToString("F3");

                    t10.Text = transformation[1, 0].ToString("F3");
                    t11.Text = transformation[1, 1].ToString("F3");
                    t12.Text = transformation[1, 2].ToString("F3");
                    t13.Text = transformation[1, 3].ToString("F3");

                    t20.Text = transformation[2, 0].ToString("F3");
                    t21.Text = transformation[2, 1].ToString("F3");
                    t22.Text = transformation[2, 2].ToString("F3");
                    t23.Text = transformation[2, 3].ToString("F3");

                    t30.Text = transformation[3, 0].ToString("F3");
                    t31.Text = transformation[3, 1].ToString("F3");
                    t32.Text = transformation[3, 2].ToString("F3");
                    t33.Text = transformation[3, 3].ToString("F3");
                });
            };

            calibrationTool.Completed += () => {
                Completed?.Invoke(currentTransformation);
                Close();
            };

            startBtn.Click += (s, e) => {
                try {
                    calibrationTool.Calibrate(10, 200);
                } catch (Exception ex) {
                    MainWindow.ShowErrorDialog("Unable to start calibration.", ex);
                }
            };
            cancelBtn.Click += (s, e) => {
                calibrationTool.Cancel();
            };

            Closing += (s, e) => {
                calibrationTool.Cancel();
            };
            robotIpAdress.Content += robot.ToString();
        }