Pārlūkot izejas kodu

相机标定流程新增畸变校正功能及界面

本次提交实现了标定流程中的图像畸变校正功能,包括:
- 新增畸变校正界面(CalibrationDistortion)及其ViewModel,集成Cognex棋盘格标定控件;
- 标定参数支持“是否进行畸变校正”选项,流程可根据选择自动分支;
- 采集图像及流程运行时支持自动加载并应用畸变校正工具;
- CalibrationInfo数据结构新增相关属性,服务层完善支持;
- 完成依赖注入、导航注册及工程文件配置;
- 优化流程中图像采集与处理的畸变校正逻辑。
孝锋 徐 8 mēneši atpakaļ
vecāks
revīzija
9fe8446ba8

+ 2 - 0
TeamAAS-VM/App.xaml.cs

@@ -107,6 +107,7 @@ namespace TeamAAS_VP
             containerRegistry.RegisterForNavigation<CalibrationVerification>();
             containerRegistry.RegisterForNavigation<FixedUpCameraFindP0>();
             containerRegistry.RegisterForNavigation<CalibIndependentCamera>();
+            containerRegistry.RegisterForNavigation<CalibrationDistortion>();
             //**************************************************************************************
 
             //------------------------注册单类------------------------------------------------
@@ -162,6 +163,7 @@ namespace TeamAAS_VP
             containerRegistry.RegisterSingleton<CalibrationVerificationViewModel>();
             containerRegistry.RegisterSingleton<FixedUpCameraFindP0ViewModel>();
             containerRegistry.RegisterSingleton<CalibIndependentCameraViewModel>();
+            containerRegistry.RegisterSingleton<CalibrationDistortionViewModel>();
             //**************************************************************************************
 
             //------------------------注册对话框------------------------------------------------

+ 15 - 1
TeamAAS-VM/Models/Calibration/CalibrationInfo.cs

@@ -1,4 +1,5 @@
-using MathNet.Numerics.LinearAlgebra;
+using Cognex.VisionPro.CalibFix;
+using MathNet.Numerics.LinearAlgebra;
 using Newtonsoft.Json;
 using Prism.Mvvm;
 using System;
@@ -306,6 +307,16 @@ namespace TeamAAS_VP.Models.Calibration
             set { SetProperty(ref _FixedDownCameraNoReturnToHome, value); }
         }
 
+        private bool _IsDistortionCorrection;
+        /// <summary>
+        /// 是否进行畸变校正
+        /// </summary>
+        public bool IsDistortionCorrection
+        {
+            get { return _IsDistortionCorrection; }
+            set { SetProperty(ref _IsDistortionCorrection, value); }
+        }
+
         private RPoint _MarkPoint;
         /// <summary>
         /// 特征点的坐标
@@ -465,6 +476,9 @@ namespace TeamAAS_VP.Models.Calibration
         [JsonIgnore]
         public Cognex.VisionPro.ToolBlock.CogToolBlock ToolBlock { get; set; }
 
+        [JsonIgnore]
+        public CogCalibCheckerboardTool CalibCheckerboardTool { get; set; }
+
         public CalibrationInfo Clone()
         {
             try

+ 40 - 1
TeamAAS-VM/Services/RemoteCommandService.cs

@@ -1478,6 +1478,26 @@ namespace TeamAAS_VP.Services
                     outputCollection = null;
                     return false;
                 }
+                //图像畸变校正
+                var calib = _calibrationService.GetCalibration(procedure.CalibrationId);
+                if (calib != null)
+                {
+                    if (calib.IsDistortionCorrection)
+                    {
+                        if (calib.CalibCheckerboardTool == null)
+                        {
+                            string prcPath = FilePath.CalibrationPath + "//" + calib.Name + "//" + "CalibCheckerboardTool.vpp";
+                            if (File.Exists(prcPath))
+                            {
+                                calib.CalibCheckerboardTool = CogSerializer.LoadObjectFromFile(prcPath) as Cognex.VisionPro.CalibFix.CogCalibCheckerboardTool;
+                                calib.CalibCheckerboardTool.InputImage = image;
+                                calib.CalibCheckerboardTool.Run();
+                                image = calib.CalibCheckerboardTool.OutputImage;
+                            }
+                        }
+                    }
+                }
+                
                 procedure.ToolBlock.Inputs["InputImage"].Value = image;
                 LogHelper.WriteLogInfo($"采集图像完成;用时:{(DateTime.Now - nowtime).Milliseconds}ms");
 
@@ -1600,7 +1620,26 @@ namespace TeamAAS_VP.Services
                     outputCollection = null;
                     return false;
                 }
-                outImage= image;
+                //图像畸变校正
+                var calib = _calibrationService.GetCalibration(procedure.CalibrationId);
+                if (calib != null)
+                {
+                    if (calib.IsDistortionCorrection)
+                    {
+                        if (calib.CalibCheckerboardTool == null)
+                        {
+                            string prcPath = FilePath.CalibrationPath + "//" + calib.Name + "//" + "CalibCheckerboardTool.vpp";
+                            if (File.Exists(prcPath))
+                            {
+                                calib.CalibCheckerboardTool = CogSerializer.LoadObjectFromFile(prcPath) as Cognex.VisionPro.CalibFix.CogCalibCheckerboardTool;
+                                calib.CalibCheckerboardTool.InputImage = image;
+                                calib.CalibCheckerboardTool.Run();
+                                image = calib.CalibCheckerboardTool.OutputImage;
+                            }
+                        }
+                    }
+                }
+                outImage = image;
                 procedure.ToolBlock.Inputs["InputImage"].Value = image;
                 LogHelper.WriteLogInfo($"采集图像完成;用时:{(DateTime.Now - nowtime).Milliseconds}ms");
 

+ 8 - 0
TeamAAS-VM/TeamAAS-VP.csproj

@@ -533,6 +533,7 @@
     <Compile Include="Events\MainTabSwitchNotification.cs" />
     <Compile Include="Models\Feeder\ScrewFeederInfo.cs" />
     <Compile Include="Models\ScrewFeederBatchRecord.cs" />
+    <Compile Include="ViewModels\Calibration\CalibrationDistortionViewModel.cs" />
     <Compile Include="ViewModels\Calibration\CalibIndependentCameraViewModel.cs" />
     <Compile Include="ViewModels\DebugMod\PlcRobotManualStepViewModel.cs" />
     <Compile Include="ViewModels\Product\ImageDisplayViewModel.cs" />
@@ -541,6 +542,9 @@
     <Compile Include="Views\Calibration\CalibIndependentCamera.xaml.cs">
       <DependentUpon>CalibIndependentCamera.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\Calibration\CalibrationDistortion.xaml.cs">
+      <DependentUpon>CalibrationDistortion.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\DebugMod\FocusAnalyzerl.xaml.cs">
       <DependentUpon>FocusAnalyzerl.xaml</DependentUpon>
     </Compile>
@@ -1097,6 +1101,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\Calibration\CalibrationDistortion.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Views\DebugMod\FocusAnalyzerl.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 8 - 1
TeamAAS-VM/ViewModels/Calibration/CalibIndependentCameraViewModel.cs

@@ -198,7 +198,14 @@ namespace TeamAAS_VP.ViewModels.Calibration
             //采集图像
             if (Camera != null)
             {
-                SelectCalibration.ToolBlock.Inputs["InputImage"].Value = Camera.Grab();
+                ICogImage image = Camera.Grab();
+                if (SelectCalibration.IsDistortionCorrection && SelectCalibration.CalibCheckerboardTool != null)
+                {
+                    SelectCalibration.CalibCheckerboardTool.InputImage = image;
+                    SelectCalibration.CalibCheckerboardTool.Run();
+                    image = SelectCalibration.CalibCheckerboardTool.OutputImage;
+                }
+                SelectCalibration.ToolBlock.Inputs["InputImage"].Value = image;
 
             }
             App.Current.Dispatcher.Invoke(() =>

+ 8 - 1
TeamAAS-VM/ViewModels/Calibration/CalibToolViewModel.cs

@@ -310,7 +310,14 @@ namespace TeamAAS_VP.ViewModels.Calibration
             //采集图像
             if (Camera != null)
             {
-                SelectCalibration.ToolBlock.Inputs["InputImage"].Value = Camera.Grab();
+                ICogImage image = Camera.Grab();
+                if (SelectCalibration.IsDistortionCorrection && SelectCalibration.CalibCheckerboardTool != null)
+                {
+                    SelectCalibration.CalibCheckerboardTool.InputImage = image;
+                    SelectCalibration.CalibCheckerboardTool.Run();
+                    image = SelectCalibration.CalibCheckerboardTool.OutputImage;
+                }
+                SelectCalibration.ToolBlock.Inputs["InputImage"].Value = image;
                 
             }
             App.Current.Dispatcher.Invoke(() =>

+ 8 - 2
TeamAAS-VM/ViewModels/Calibration/CalibrationAutoViewModel.cs

@@ -258,8 +258,14 @@ namespace TeamAAS_VP.ViewModels.Calibration
             //采集图像
             if (Camera != null)
             {
-                SelectCalibration.ToolBlock.Inputs["InputImage"].Value = Camera.Grab();
-                
+                ICogImage image = Camera.Grab();
+                if (SelectCalibration.IsDistortionCorrection && SelectCalibration.CalibCheckerboardTool != null)
+                {
+                    SelectCalibration.CalibCheckerboardTool.InputImage = image;
+                    SelectCalibration.CalibCheckerboardTool.Run();
+                    image = SelectCalibration.CalibCheckerboardTool.OutputImage;
+                }
+                SelectCalibration.ToolBlock.Inputs["InputImage"].Value = image;
             }
             App.Current.Dispatcher.Invoke(() =>
             {

+ 9 - 1
TeamAAS-VM/ViewModels/Calibration/CalibrationCameraParamsViewModel.cs

@@ -222,7 +222,15 @@ namespace TeamAAS_VP.ViewModels.Calibration
             }
             NavigationParameters param = new NavigationParameters();
             param.Add("SelectCalibration", SelectCalibration);
-            _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationEditVision", param);
+
+            if (SelectCalibration.IsDistortionCorrection)
+            {
+                _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationDistortion", param);
+            }
+            else
+            {
+                _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationEditVision", param);
+            }
         }
 
         /// <summary>

+ 256 - 0
TeamAAS-VM/ViewModels/Calibration/CalibrationDistortionViewModel.cs

@@ -0,0 +1,256 @@
+using Cognex.VisionPro;
+using Cognex.VisionPro.CalibFix;
+using Cognex.VisionPro.ToolBlock;
+using Prism.Commands;
+using Prism.Events;
+using Prism.Ioc;
+using Prism.Mvvm;
+using Prism.Regions;
+using Prism.Services.Dialogs;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows;
+using Team.FFFeederService.Interfaces;
+using TeamAAS_VP.Core;
+using TeamAAS_VP.Events;
+using TeamAAS_VP.Interfaces;
+using TeamAAS_VP.Models.Calibration;
+
+namespace TeamAAS_VP.ViewModels.Calibration
+{
+    public class CalibrationDistortionViewModel : BindableBase, IConfirmNavigationRequest
+    {
+        IRegionManager _regionManager;
+        IRegionNavigationService _regionNavigationService;
+        IContainerProvider _container;
+        IDialogService _dialogService;
+        IEventAggregator _eventAggregator;
+        IConfigService _configService;
+        IRobotService _robotService;
+        ICameraService _cameraService;
+        IFeederService _feederService;
+        ISystemDatabaseService _systemDatabaseService;
+
+        #region 属性
+
+        private CogCalibCheckerboardEditV2 _CalibCheckerboardEdit;
+
+        public CogCalibCheckerboardEditV2 CalibCheckerboardEdit
+        {
+            get { return _CalibCheckerboardEdit; }
+            set { SetProperty(ref _CalibCheckerboardEdit, value); }
+        }
+
+
+        private CalibrationInfo _SelectCalibration;
+
+        public CalibrationInfo SelectCalibration
+        {
+            get { return _SelectCalibration; }
+            set { SetProperty(ref _SelectCalibration, value); }
+        }
+
+        private ICamera _Camera;
+
+        public ICamera Camera
+        {
+            get { return _Camera; }
+            set { SetProperty(ref _Camera, value); }
+        }
+        #endregion
+
+        #region 命令
+        private DelegateCommand _LoadedCommand;
+        public DelegateCommand LoadedCommand =>
+            _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
+        private DelegateCommand _NextCommand;
+        public DelegateCommand NextCommand =>
+            _NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand));
+
+        private DelegateCommand _BackCommand;
+        public DelegateCommand BackCommand =>
+            _BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand));
+
+        private DelegateCommand _RunCommand;
+        public DelegateCommand RunCommand =>
+            _RunCommand ?? (_RunCommand = new DelegateCommand(ExecuteRunCommand));
+        #endregion
+
+        #region 事件
+
+        #endregion
+
+        public CalibrationDistortionViewModel(IRegionManager regionManager, IEventAggregator ea, IRegionNavigationService regionNavigationService, IContainerProvider container, IDialogService dialogService,
+            IConfigService configService, IRobotService robotService, ICameraService cameraService, IFeederService feederService, ISystemDatabaseService systemDatabaseService)
+        {
+            _regionManager = regionManager;
+            _regionNavigationService = regionNavigationService;
+            _container = container;
+            _dialogService = dialogService;
+            _eventAggregator = ea;
+            _configService = configService;
+            _robotService = robotService;
+            _cameraService = cameraService;
+            _feederService = feederService;
+            _systemDatabaseService = systemDatabaseService;
+        }
+
+        #region 方法
+        void ExecuteLoadedCommand()
+        {
+            try
+            {
+                if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator)
+                {
+                    IsAllowEdit = false;
+                }
+                else
+                {
+                    IsAllowEdit = true;
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// 下一步
+        /// </summary>
+        void ExecuteNextCommand()
+        {
+            try
+            {
+                string calibToolPath = FilePath.CalibrationPath + "//" + SelectCalibration.Name + "//" + "CalibCheckerboard.vpp";
+                SelectCalibration.CalibCheckerboardTool = CalibCheckerboardEdit.Subject;
+                //保存校准工具
+                CogSerializer.SaveObjectToFile(CalibCheckerboardEdit.Subject, calibToolPath);
+                
+                NavigationParameters param = new NavigationParameters();
+                param.Add("SelectCalibration", SelectCalibration);
+                _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationEditVision", param);
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("相机校准-畸变校准工具界面点击下一步时出错!", ex);
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// 上一步
+        /// </summary>
+        void ExecuteBackCommand()
+        {
+            try
+            {
+                NavigationParameters param = new NavigationParameters();
+                param.Add("SelectCalibration", SelectCalibration);
+                _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationCameraParams", param);
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("相机校准-畸变校准工具界面点击上一步时出错!", ex);
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// 运行
+        /// </summary>
+        void ExecuteRunCommand()
+        {
+            try
+            {
+                SelectCalibration.CalibCheckerboardTool = CalibCheckerboardEdit.Subject;
+                CalibCheckerboardEdit.Subject.InputImage = Camera.Grab();
+                CalibCheckerboardEdit.Subject.Run();
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("相机校准-畸变校准时出错", ex);
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
+            }
+        }
+        #endregion
+
+        #region 继承
+        /// <summary>
+        /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。
+        /// </summary>
+        /// <param name="navigationContext"></param>
+        /// <param name="continuationCallback"></param>
+        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
+        {
+            continuationCallback(true);
+        }
+
+        /// <summary>
+        /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。
+        /// </summary>
+        /// <param name="navigationContext"></param>
+        /// <exception cref="NotImplementedException"></exception>
+        public async void OnNavigatedTo(NavigationContext navigationContext)
+        {
+            SelectCalibration = navigationContext.Parameters.GetValue<CalibrationInfo>("SelectCalibration");
+            if (CalibCheckerboardEdit != null)
+            {
+                //先判断校准文件夹下是否存在校准工具VPP文件,存在则加载,不存在则新建一个工具
+                string calibToolPath = FilePath.CalibrationPath + "//" + SelectCalibration.Name + "//" + "CalibCheckerboard.vpp";
+                if (System.IO.File.Exists(calibToolPath))
+                {
+                    SelectCalibration.CalibCheckerboardTool = CogSerializer.LoadObjectFromFile(calibToolPath) as CogCalibCheckerboardTool;
+                    CalibCheckerboardEdit.Subject = SelectCalibration.CalibCheckerboardTool;
+                }
+                else
+                {
+                    SelectCalibration.CalibCheckerboardTool = new CogCalibCheckerboardTool();
+                    CalibCheckerboardEdit.Subject = SelectCalibration.CalibCheckerboardTool;
+                }
+            }
+            Camera = _cameraService.GetCamera(SelectCalibration.CameraID);
+        }
+
+        /// <summary>
+        /// 是否允许导航到此视图模型。
+        /// </summary>
+        /// <param name="navigationContext"></param>
+        /// <returns></returns>
+        public bool IsNavigationTarget(NavigationContext navigationContext)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。
+        /// </summary>
+        /// <param name="navigationContext"></param>
+        public void OnNavigatedFrom(NavigationContext navigationContext)
+        {
+
+        }
+        #endregion
+
+        private bool _IsAllowEdit = false;
+
+        public bool IsAllowEdit
+        {
+            get { return _IsAllowEdit; }
+            set { SetProperty(ref _IsAllowEdit, value); }
+        }
+
+        private void LoginChange(Models.User user)
+        {
+            if (user.userPart == Enums.UserPart.Operator)
+            {
+                IsAllowEdit = false;
+            }
+            else
+            {
+                IsAllowEdit = true;
+            }
+        }
+    }
+}

+ 16 - 2
TeamAAS-VM/ViewModels/Calibration/CalibrationEditVisionViewModel.cs

@@ -159,7 +159,14 @@ namespace TeamAAS_VP.ViewModels.Calibration
             {
                 NavigationParameters param = new NavigationParameters();
                 param.Add("SelectCalibration", SelectCalibration);
-                _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationCameraParams", param);
+                if (SelectCalibration.IsDistortionCorrection)
+                {
+                    _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationDistortion", param);
+                }
+                else
+                {
+                    _regionManager.RequestNavigate("CalibrationRegionContext", "CalibrationCameraParams", param);
+                }
             }
             catch (Exception ex)
             {
@@ -173,7 +180,14 @@ namespace TeamAAS_VP.ViewModels.Calibration
             try
             {
                 SelectCalibration.ToolBlock = ToolBlockEdit.Subject;
-                ToolBlockEdit.Subject.Inputs["InputImage"].Value = Camera.Grab();
+                ICogImage image = Camera.Grab();
+                if (SelectCalibration.IsDistortionCorrection && SelectCalibration.CalibCheckerboardTool!=null)
+                {
+                    SelectCalibration.CalibCheckerboardTool.InputImage= image;
+                    SelectCalibration.CalibCheckerboardTool.Run();
+                    image = SelectCalibration.CalibCheckerboardTool.OutputImage;
+                }
+                ToolBlockEdit.Subject.Inputs["InputImage"].Value = image;
                 ToolBlockEdit.Subject.Run();
             }
             catch (Exception ex)

+ 8 - 1
TeamAAS-VM/ViewModels/Calibration/CalibrationVerificationViewModel.cs

@@ -218,7 +218,14 @@ namespace TeamAAS_VP.ViewModels.Calibration
             //采集图像
             if (Camera != null)
             {
-                SelectCalibration.ToolBlock.Inputs["InputImage"].Value = Camera.Grab();
+                ICogImage image = Camera.Grab();
+                if (SelectCalibration.IsDistortionCorrection && SelectCalibration.CalibCheckerboardTool != null)
+                {
+                    SelectCalibration.CalibCheckerboardTool.InputImage = image;
+                    SelectCalibration.CalibCheckerboardTool.Run();
+                    image = SelectCalibration.CalibCheckerboardTool.OutputImage;
+                }
+                SelectCalibration.ToolBlock.Inputs["InputImage"].Value = image;
                 
             }
             App.Current.Dispatcher.Invoke(() =>

+ 14 - 0
TeamAAS-VM/ViewModels/Calibration/FixedUpCameraFindP0ViewModel.cs

@@ -573,6 +573,20 @@ namespace TeamAAS_VP.ViewModels.Calibration
             if (Camera != null)
             {
                 image = Camera.Grab();
+                if (SelectedCalibration.IsDistortionCorrection)
+                {
+                    if (SelectedCalibration.CalibCheckerboardTool==null)
+                    {
+                        string prcPath = FilePath.CalibrationPath + "//" + SelectedCalibration.Name + "//" + "CalibCheckerboardTool.vpp";
+                        if (File.Exists(prcPath))
+                        {
+                            SelectedCalibration.CalibCheckerboardTool = CogSerializer.LoadObjectFromFile(prcPath) as Cognex.VisionPro.CalibFix.CogCalibCheckerboardTool;
+                            SelectedCalibration.CalibCheckerboardTool.InputImage = image;
+                            SelectedCalibration.CalibCheckerboardTool.Run();
+                            image = SelectedCalibration.CalibCheckerboardTool.OutputImage;
+                        }
+                    }
+                }
                 ToolBlockEdit.Subject.Inputs["InputImage"].Value = image;
             }
             ToolBlockEdit.Subject.Run();

+ 6 - 0
TeamAAS-VM/Views/Calibration/CalibrationBasics.xaml

@@ -110,6 +110,8 @@
                                    MinHeight="35" />
                     <RowDefinition Height="auto"
                                    MinHeight="35" />
+                    <RowDefinition Height="auto"
+                                   MinHeight="35" />
                 </Grid.RowDefinitions>
                 <Grid.ColumnDefinitions>
                     <ColumnDefinition Width="100" />
@@ -367,6 +369,10 @@
                                           StringFormat="{}{0:N0} ms"
                                           materialDesign:HintAssist.Hint="{lex:Loc 破真空时长}"
                                           Value="{Binding SelectCalibration.WaitBlow,Mode=TwoWay}" />
+                <CheckBox Grid.Row="12"
+                          Grid.Column="1"
+                          Content="是否进行畸变校正"
+                          IsChecked="{Binding SelectCalibration.IsDistortionCorrection,Mode=TwoWay}" />
             </Grid>
         </ScrollViewer>
 

+ 92 - 0
TeamAAS-VM/Views/Calibration/CalibrationDistortion.xaml

@@ -0,0 +1,92 @@
+<UserControl x:Class="TeamAAS_VP.Views.Calibration.CalibrationDistortion"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:prism="http://prismlibrary.com/"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+             xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
+             xmlns:wf="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
+             xmlns:vp="clr-namespace:Cognex.VisionPro.CalibFix;assembly=Cognex.VisionPro.CalibFix.Controls"
+             xmlns:uControl="clr-namespace:TeamAAS_VP.Controls"
+             xmlns:vm="clr-namespace:TeamAAS_VP.ViewModels.Calibration"
+             xmlns:convert="clr-namespace:TeamAAS_VP.ValueConverter"
+             xmlns:lex="http://wpflocalizeextension.codeplex.com"
+             lex:LocalizeDictionary.DesignCulture="zh-CN"
+             lex:ResxLocalizationProvider.DefaultAssembly="TeamAAS-VP"
+             lex:ResxLocalizationProvider.DefaultDictionary="Lang"
+             prism:ViewModelLocator.AutoWireViewModel="True"
+             mc:Ignorable="d"
+             d:DataContext="{d:DesignInstance Type=vm:CalibrationDistortionViewModel}"
+             d:Height="600"
+             d:Width="1024"
+             d:Background="White"
+             FontFamily="{DynamicResource DefaultFont}">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="auto" />
+            <RowDefinition Height="*" />
+            <RowDefinition Height="auto" />
+        </Grid.RowDefinitions>
+        <Button Grid.Row="0"
+                Content="{materialDesign:PackIcon Kind=ArrowLeftCircle}"
+                Width="50"
+                HorizontalAlignment="Left"
+                VerticalAlignment="Top"
+                ToolTip="{lex:Loc 返回}"
+                Style="{StaticResource MaterialDesignIconButton}"
+                Command="{Binding BackCommand}" />
+        <StackPanel Grid.Row="0"
+                    Orientation="Horizontal"
+                    Margin="50,0"
+                    VerticalAlignment="Center">
+            <materialDesign:PackIcon Kind="CrosshairsGps"
+                                     Width="30"
+                                     Height="30" />
+            <TextBlock Text="{Binding SelectCalibration.Name,Converter={StaticResource StringFormatConverter},ConverterParameter=' [{0}] '}"
+                       VerticalAlignment="Center" />
+            <TextBlock Text="- 图像畸变校准"
+                       VerticalAlignment="Center" />
+        </StackPanel>
+
+        <materialDesign:DrawerHost Grid.Row="1"
+                                   IsEnabled="{Binding IsAllowEdit}"
+                                   OpenMode="Standard"
+                                   x:Name="DrawerHost">
+            <materialDesign:DrawerHost.RightDrawerContent>
+                <uControl:PlcRobotManual x:Name="robotManual" />
+            </materialDesign:DrawerHost.RightDrawerContent>
+
+            <Grid>
+                <wf:WindowsFormsHost Grid.Column="0"
+                                     Margin="0,0,0,35">
+                    <vp:CogCalibCheckerboardEditV2 x:Name="ToolBlockEditV2" />
+                </wf:WindowsFormsHost>
+                <Button Content="{lex:Loc 运行流程}"
+                        Width="100"
+                        HorizontalAlignment="Left"
+                        VerticalAlignment="Bottom"
+                        Margin="5,3"
+                        Command="{Binding RunCommand}" />
+            </Grid>
+
+
+        </materialDesign:DrawerHost>
+
+        <StackPanel Grid.Row="2"
+                    Orientation="Horizontal"
+                    HorizontalAlignment="Center"
+                    VerticalAlignment="Center"
+                    Margin="20">
+            <Button Content="{lex:Loc 下一步}"
+                    IsEnabled="{Binding IsAllowEdit}"
+                    MinWidth="150"
+                    Margin="10,0"
+                    HorizontalAlignment="Center"
+                    VerticalAlignment="Center"
+                    materialDesign:ButtonAssist.CornerRadius="10"
+                    Style="{StaticResource MaterialDesignRaisedButton}"
+                    Command="{Binding NextCommand}" />
+        </StackPanel>
+    </Grid>
+</UserControl>

+ 15 - 0
TeamAAS-VM/Views/Calibration/CalibrationDistortion.xaml.cs

@@ -0,0 +1,15 @@
+using System.Windows.Controls;
+
+namespace TeamAAS_VP.Views.Calibration
+{
+    /// <summary>
+    /// Interaction logic for CalibrationDistortion
+    /// </summary>
+    public partial class CalibrationDistortion : UserControl
+    {
+        public CalibrationDistortion()
+        {
+            InitializeComponent();
+        }
+    }
+}