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