集成导航相机畸变校准和坐标标定

This commit is contained in:
李伟
2026-05-11 13:07:48 +08:00
parent d89c8c4f44
commit 9f604d4e2f
5 changed files with 148 additions and 62 deletions
@@ -74,32 +74,42 @@
<Border Grid.Row="0" Background="#FAFAFA" BorderBrush="{StaticResource BorderColor}" <Border Grid.Row="0" Background="#FAFAFA" BorderBrush="{StaticResource BorderColor}"
BorderThickness="0,0,0,1" Padding="12,8"> BorderThickness="0,0,0,1" Padding="12,8">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationLoadImage}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationLoadImage}"
Command="{Binding LoadImageCommand}" FontFamily="Segoe UI" Command="{Binding LoadImageCommand}" FontFamily="Segoe UI"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/添加图像.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/添加图像.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationLoadCsv}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationLoadCsv}"
Command="{Binding LoadCsvCommand}" FontFamily="Segoe UI" Command="{Binding LoadCsvCommand}" FontFamily="Segoe UI"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/外部导入.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/外部导入.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationExecute}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationExecute}"
Command="{Binding CalibrateCommand}" FontFamily="Segoe UI" Command="{Binding CalibrateCommand}" FontFamily="Segoe UI"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/执行.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/执行.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationSave}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationSave}"
Command="{Binding SaveCalibrationCommand}" FontFamily="Segoe UI" Command="{Binding SaveCalibrationCommand}" FontFamily="Segoe UI"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/保存结果.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/保存结果.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationLoad}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationLoad}"
Command="{Binding LoadCalibrationCommand}" FontFamily="Segoe UI" Command="{Binding LoadCalibrationCommand}" FontFamily="Segoe UI"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/加载数据.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/加载数据.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<CheckBox Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationShowWorld}" <CheckBox Content="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationShowWorld}"
VerticalAlignment="Center" FontFamily="Segoe UI" VerticalAlignment="Center" FontFamily="Segoe UI"
IsChecked="{Binding ShowWorldCoordinates}" IsChecked="{Binding ShowWorldCoordinates}"
Margin="10,0,0,0" FontSize="13" Foreground="{StaticResource TextColor}" /> Margin="10,0,0,0" FontSize="13" Foreground="{StaticResource TextColor}" />
@@ -120,7 +130,7 @@
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationPointList}" <TextBlock Grid.Row="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationPointList}"
FontSize="15" FontWeight="SemiBold" FontFamily="Segoe UI" FontSize="15" FontWeight="SemiBold" FontFamily="Segoe UI"
Margin="0,0,0,12" Foreground="{StaticResource TextColor}" /> Margin="0,0,0,12" Foreground="{StaticResource TextColor}" />
@@ -130,13 +140,13 @@
FontFamily="Segoe UI" FontFamily="Segoe UI"
BorderBrush="{StaticResource BorderColor}" BorderThickness="1"> BorderBrush="{StaticResource BorderColor}" BorderThickness="1">
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationPixelX}" <DataGridTextColumn Header="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationPixelX}"
Binding="{Binding PixelX}" FontFamily="Segoe UI" Width="*" /> Binding="{Binding PixelX}" FontFamily="Segoe UI" Width="*" />
<DataGridTextColumn Header="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationPixelY}" <DataGridTextColumn Header="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationPixelY}"
Binding="{Binding PixelY}" FontFamily="Segoe UI" Width="*" /> Binding="{Binding PixelY}" FontFamily="Segoe UI" Width="*" />
<DataGridTextColumn Header="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationWorldX}" <DataGridTextColumn Header="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationWorldX}"
Binding="{Binding WorldX}" FontFamily="Segoe UI" Width="*" /> Binding="{Binding WorldX}" FontFamily="Segoe UI" Width="*" />
<DataGridTextColumn Header="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.CalibrationWorldY}" <DataGridTextColumn Header="{Binding Source={StaticResource LocalizedStrings}, Path=CalibrationWorldY}"
Binding="{Binding WorldY}" FontFamily="Segoe UI" Width="*" /> Binding="{Binding WorldY}" FontFamily="Segoe UI" Width="*" />
</DataGrid.Columns> </DataGrid.Columns>
</DataGrid> </DataGrid>
@@ -162,4 +172,4 @@
</Grid> </Grid>
</Grid> </Grid>
</Grid> </Grid>
</UserControl> </UserControl>
@@ -74,29 +74,41 @@
<Border Grid.Row="0" Background="#FAFAFA" BorderBrush="{StaticResource BorderColor}" <Border Grid.Row="0" Background="#FAFAFA" BorderBrush="{StaticResource BorderColor}"
BorderThickness="0,0,0,1" Padding="12,8"> BorderThickness="0,0,0,1" Padding="12,8">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardAddImages}" Command="{Binding AddImagesCommand}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardAddImages}" Command="{Binding AddImagesCommand}"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/添加图像.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/添加图像.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardClearImages}" Command="{Binding ClearImagesCommand}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardClearImages}" Command="{Binding ClearImagesCommand}"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/清空列表.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/清空列表.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardCalibrate}" Command="{Binding CalibrateCommand}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardCalibrate}" Command="{Binding CalibrateCommand}"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/校准.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/校准.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardSave}" Command="{Binding SaveCalibrationCommand}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardSave}" Command="{Binding SaveCalibrationCommand}"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/保存结果.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/保存结果.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardLoad}" Command="{Binding LoadCalibrationCommand}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardLoad}" Command="{Binding LoadCalibrationCommand}"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/加载数据.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/加载数据.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
<Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardUndistort}" Command="{Binding UndistortImageCommand}" <Button Content="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardUndistort}" Command="{Binding UndistortImageCommand}"
Style="{StaticResource ToolbarButtonStyle}"> Style="{StaticResource ToolbarButtonStyle}">
<Button.Tag><Image Source="/Calibration/Resources/执行.png" Width="24" Height="24" /></Button.Tag> <Button.Tag>
<Image Source="/XP.Camera;component/Calibration/Resources/执行.png" Width="24" Height="24" />
</Button.Tag>
</Button> </Button>
</StackPanel> </StackPanel>
</Border> </Border>
@@ -117,7 +129,7 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<StackPanel Grid.Row="0" Margin="0,0,0,16"> <StackPanel Grid.Row="0" Margin="0,0,0,16">
<TextBlock Text="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardParameters}" FontFamily="Segoe UI" FontSize="15" FontWeight="SemiBold" <TextBlock Text="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardParameters}" FontFamily="Segoe UI" FontSize="15" FontWeight="SemiBold"
Margin="0,0,0,12" Foreground="{StaticResource TextColor}" /> Margin="0,0,0,12" Foreground="{StaticResource TextColor}" />
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
@@ -129,16 +141,16 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardWidth}" FontFamily="Segoe UI" VerticalAlignment="Center" Margin="0,0,8,8" /> <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardWidth}" FontFamily="Segoe UI" VerticalAlignment="Center" Margin="0,0,8,8" />
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding ChessboardWidth}" FontFamily="Segoe UI" Height="28" Margin="0,0,0,8" /> <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding ChessboardWidth}" FontFamily="Segoe UI" Height="28" Margin="0,0,0,8" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardHeight}" FontFamily="Segoe UI" VerticalAlignment="Center" Margin="0,0,8,8" /> <TextBlock Grid.Row="1" Grid.Column="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardHeight}" FontFamily="Segoe UI" VerticalAlignment="Center" Margin="0,0,8,8" />
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding ChessboardHeight}" FontFamily="Segoe UI" Height="28" Margin="0,0,0,8" /> <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding ChessboardHeight}" FontFamily="Segoe UI" Height="28" Margin="0,0,0,8" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardSquareSize}" FontFamily="Segoe UI" VerticalAlignment="Center" Margin="0,0,8,0" /> <TextBlock Grid.Row="2" Grid.Column="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardSquareSize}" FontFamily="Segoe UI" VerticalAlignment="Center" Margin="0,0,8,0" />
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding SquareSize}" FontFamily="Segoe UI" Height="28" /> <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding SquareSize}" FontFamily="Segoe UI" Height="28" />
</Grid> </Grid>
</StackPanel> </StackPanel>
<TextBlock Grid.Row="1" Text="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardImageList}" FontFamily="Segoe UI" FontSize="15" FontWeight="SemiBold" <TextBlock Grid.Row="1" Text="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardImageList}" FontFamily="Segoe UI" FontSize="15" FontWeight="SemiBold"
Margin="0,0,0,12" Foreground="{StaticResource TextColor}" /> Margin="0,0,0,12" Foreground="{StaticResource TextColor}" />
<ListBox Grid.Row="2" ItemsSource="{Binding ImageFileNames}" SelectedIndex="{Binding SelectedImageIndex}" <ListBox Grid.Row="2" ItemsSource="{Binding ImageFileNames}" SelectedIndex="{Binding SelectedImageIndex}"
FontFamily="Segoe UI" BorderBrush="{StaticResource BorderColor}" BorderThickness="1" /> FontFamily="Segoe UI" BorderBrush="{StaticResource BorderColor}" BorderThickness="1" />
@@ -169,7 +181,7 @@
Visibility="{Binding IsCalibrating, Converter={StaticResource BooleanToVisibilityConverter}}" /> Visibility="{Binding IsCalibrating, Converter={StaticResource BooleanToVisibilityConverter}}" />
<ProgressBar Grid.Row="1" Height="24" Value="{Binding ProgressValue}" Maximum="100" <ProgressBar Grid.Row="1" Height="24" Value="{Binding ProgressValue}" Maximum="100"
Visibility="{Binding IsCalibrating, Converter={StaticResource BooleanToVisibilityConverter}}" /> Visibility="{Binding IsCalibrating, Converter={StaticResource BooleanToVisibilityConverter}}" />
<TextBlock Grid.Row="0" Grid.RowSpan="2" Text="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardStatusReady}" FontFamily="Segoe UI" FontSize="12" <TextBlock Grid.Row="0" Grid.RowSpan="2" Text="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardStatusReady}" FontFamily="Segoe UI" FontSize="12"
VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryColor}"> VerticalAlignment="Center" Foreground="{StaticResource TextSecondaryColor}">
<TextBlock.Style> <TextBlock.Style>
<Style TargetType="TextBlock"> <Style TargetType="TextBlock">
@@ -193,7 +205,7 @@
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=Resources.ChessboardStatusInfo}" FontFamily="Segoe UI" FontSize="15" FontWeight="SemiBold" <TextBlock Grid.Row="0" Text="{Binding Source={StaticResource LocalizedStrings}, Path=ChessboardStatusInfo}" FontFamily="Segoe UI" FontSize="15" FontWeight="SemiBold"
Margin="0,0,0,12" Foreground="{StaticResource TextColor}" /> Margin="0,0,0,12" Foreground="{StaticResource TextColor}" />
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"> <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<TextBlock TextWrapping="Wrap" FontSize="12" FontFamily="Segoe UI" <TextBlock TextWrapping="Wrap" FontSize="12" FontFamily="Segoe UI"
@@ -204,4 +216,4 @@
</Grid> </Grid>
</Grid> </Grid>
</Grid> </Grid>
</UserControl> </UserControl>
@@ -1705,7 +1705,10 @@
"Telerik.UI.for.Wpf.NetCore.Xaml": "2024.1.408" "Telerik.UI.for.Wpf.NetCore.Xaml": "2024.1.408"
}, },
"runtime": { "runtime": {
"XP.Common.dll": {} "XP.Common.dll": {
"assemblyVersion": "1.4.16.1",
"fileVersion": "1.4.16.1"
}
}, },
"resources": { "resources": {
"en-US/XP.Common.resources.dll": { "en-US/XP.Common.resources.dll": {
+63 -9
View File
@@ -1,5 +1,8 @@
using Emgu.CV;
using Emgu.CV.Structure;
using Microsoft.Win32; using Microsoft.Win32;
using Prism.Commands; using Prism.Commands;
using Prism.Dialogs;
using Prism.Events; using Prism.Events;
using Prism.Ioc; using Prism.Ioc;
using Prism.Mvvm; using Prism.Mvvm;
@@ -12,26 +15,24 @@ using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using Emgu.CV; using XP.Camera.Calibration;
using Emgu.CV.Structure; using XP.Common.GeneralForm.Views;
using XP.Common.Logging.Interfaces;
using XP.Common.PdfViewer.Interfaces;
using XP.Hardware.MotionControl.Abstractions;
using XP.Hardware.MotionControl.Services;
using XplorePlane.Events; using XplorePlane.Events;
using XplorePlane.Services.MainViewport; using XplorePlane.Services.MainViewport;
using XplorePlane.Services.Storage; using XplorePlane.Services.Storage;
using XplorePlane.ViewModels.Cnc; using XplorePlane.ViewModels.Cnc;
using XplorePlane.Views; using XplorePlane.Views;
using XplorePlane.Views.Cnc; using XplorePlane.Views.Cnc;
using XP.Common.Logging.Interfaces;
using XP.Common.GeneralForm.Views;
using XP.Common.PdfViewer.Interfaces;
using XP.Hardware.MotionControl.Abstractions;
using XP.Hardware.MotionControl.Services;
namespace XplorePlane.ViewModels namespace XplorePlane.ViewModels
{ {
public class MainViewModel : BindableBase public class MainViewModel : BindableBase
{ {
private const double CncEditorHostWidth = 452d; private const double CncEditorHostWidth = 452d;
private readonly ILoggerService _logger; private readonly ILoggerService _logger;
private readonly IContainerProvider _containerProvider; private readonly IContainerProvider _containerProvider;
private readonly IEventAggregator _eventAggregator; private readonly IEventAggregator _eventAggregator;
@@ -75,7 +76,6 @@ namespace XplorePlane.ViewModels
public DelegateCommand OpenToolboxCommand { get; } public DelegateCommand OpenToolboxCommand { get; }
public DelegateCommand OpenLibraryVersionsCommand { get; } public DelegateCommand OpenLibraryVersionsCommand { get; }
public DelegateCommand OpenUserManualCommand { get; } public DelegateCommand OpenUserManualCommand { get; }
public DelegateCommand OpenCameraSettingsCommand { get; }
public DelegateCommand OpenSettingsCommand { get; } public DelegateCommand OpenSettingsCommand { get; }
public DelegateCommand BrowseDataRootPathCommand { get; } public DelegateCommand BrowseDataRootPathCommand { get; }
public DelegateCommand ResetDataRootPathCommand { get; } public DelegateCommand ResetDataRootPathCommand { get; }
@@ -95,6 +95,12 @@ namespace XplorePlane.ViewModels
public DelegateCommand RunCncCommand { get; } public DelegateCommand RunCncCommand { get; }
public DelegateCommand StopCncCommand { get; } public DelegateCommand StopCncCommand { get; }
//导航相机
public DelegateCommand OpenCameraSettingsCommand { get; }
public DelegateCommand OpenCameraChessboardCalibrationCommand { get; }
public DelegateCommand OpenCameraCalibrationCommand { get; }
// 硬件命令 // 硬件命令
public DelegateCommand AxisResetCommand { get; } public DelegateCommand AxisResetCommand { get; }
@@ -121,6 +127,7 @@ namespace XplorePlane.ViewModels
// 图像处理命令 // 图像处理命令
public DelegateCommand WhiteBackgroundDetectionCommand { get; } public DelegateCommand WhiteBackgroundDetectionCommand { get; }
public DelegateCommand BlackBackgroundDetectionCommand { get; } public DelegateCommand BlackBackgroundDetectionCommand { get; }
public DelegateCommand GrayscaleCommand { get; } public DelegateCommand GrayscaleCommand { get; }
public DelegateCommand SharpenCommand { get; } public DelegateCommand SharpenCommand { get; }
@@ -278,6 +285,9 @@ namespace XplorePlane.ViewModels
OpenLibraryVersionsCommand = new DelegateCommand(() => ShowWindow(new Views.LibraryVersionsWindow(), "关于")); OpenLibraryVersionsCommand = new DelegateCommand(() => ShowWindow(new Views.LibraryVersionsWindow(), "关于"));
OpenUserManualCommand = new DelegateCommand(ExecuteOpenUserManual); OpenUserManualCommand = new DelegateCommand(ExecuteOpenUserManual);
OpenCameraSettingsCommand = new DelegateCommand(ExecuteOpenCameraSettings); OpenCameraSettingsCommand = new DelegateCommand(ExecuteOpenCameraSettings);
OpenCameraChessboardCalibrationCommand = new DelegateCommand(ExecuteOpenCameraChessboardCalibration);
OpenCameraCalibrationCommand = new DelegateCommand(ExecuteOpenCameraCalibration);
OpenSettingsCommand = new DelegateCommand(ExecuteOpenSettings); OpenSettingsCommand = new DelegateCommand(ExecuteOpenSettings);
BrowseDataRootPathCommand = new DelegateCommand(ExecuteBrowseDataRootPath); BrowseDataRootPathCommand = new DelegateCommand(ExecuteBrowseDataRootPath);
ResetDataRootPathCommand = new DelegateCommand(ExecuteResetDataRootPath); ResetDataRootPathCommand = new DelegateCommand(ExecuteResetDataRootPath);
@@ -469,6 +479,50 @@ namespace XplorePlane.ViewModels
} }
} }
private void ExecuteOpenCameraChessboardCalibration()
{
var chessboardWindow = new System.Windows.Window
{
Title = XP.Common.Resources.Resources.ChessboardToolTitle,
Width = 1600,
Height = 900,
WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen,
Icon = System.Windows.Application.Current.MainWindow?.Icon
};
var calibrationDialogService = new XP.Camera.Calibration.DefaultCalibrationDialogService();
var chessboardViewModel = new XP.Camera.Calibration.ViewModels.ChessboardCalibrationViewModel(calibrationDialogService);
var chessboardControl = new XP.Camera.Calibration.Controls.ChessboardCalibrationControl
{
DataContext = chessboardViewModel
};
chessboardWindow.Content = chessboardControl;
chessboardWindow.ShowDialog();
}
private void ExecuteOpenCameraCalibration()
{
var calibrationWindow = new System.Windows.Window
{
Title = XP.Common.Resources.Resources.CalibrationToolTitle,
Width = 1400,
Height = 850,
WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen,
Icon = System.Windows.Application.Current.MainWindow?.Icon
};
var calibrationDialogService = new XP.Camera.Calibration.DefaultCalibrationDialogService();
var calibrationViewModel = new XP.Camera.Calibration.ViewModels.CalibrationViewModel(calibrationDialogService);
var calibrationControl = new XP.Camera.Calibration.Controls.CalibrationControl
{
DataContext = calibrationViewModel
};
calibrationWindow.Content = calibrationControl;
calibrationWindow.ShowDialog();
}
private void ExecuteOpenSettings() private void ExecuteOpenSettings()
{ {
try try
+22 -15
View File
@@ -309,7 +309,7 @@
SmallImage="/Assets/Icons/Module.png" SmallImage="/Assets/Icons/Module.png"
Text="插入模块" /> Text="插入模块" />
</StackPanel> </StackPanel>
<!-- <!--
<StackPanel> <StackPanel>
<telerik:RadRibbonButton <telerik:RadRibbonButton
telerik:ScreenTip.Title="参考点" telerik:ScreenTip.Title="参考点"
@@ -343,7 +343,6 @@
Command="{Binding InsertInspectionModuleCommand}" Command="{Binding InsertInspectionModuleCommand}"
SmallImage="/Assets/Icons/Module.png" SmallImage="/Assets/Icons/Module.png"
Text="检测模块" /> Text="检测模块" />
</StackPanel> </StackPanel>
<StackPanel> <StackPanel>
<telerik:RadRibbonButton <telerik:RadRibbonButton
@@ -360,8 +359,6 @@
Text="插入等待" /> Text="插入等待" />
</StackPanel> </StackPanel>
--> -->
</telerik:RadRibbonGroup> </telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="高级模块" IsEnabled="{Binding Path=CellsGroup.IsEnabled}"> <telerik:RadRibbonGroup Header="高级模块" IsEnabled="{Binding Path=CellsGroup.IsEnabled}">
@@ -417,14 +414,13 @@
<telerik:GroupVariant Priority="0" Variant="Large" /> <telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants> </telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonButton <telerik:RadRibbonButton
Size="Large" Size="Large"
SmallImage="/Assets/Icons/setting.png" SmallImage="/Assets/Icons/setting.png"
Command="{Binding OpenSettingsCommand}" Command="{Binding OpenSettingsCommand}"
Text="全局设置" /> Text="全局设置" />
</telerik:RadRibbonGroup> </telerik:RadRibbonGroup>
<telerik:RadRibbonGroup <telerik:RadRibbonGroup
telerik:ScreenTip.Description="Show the Alignment tab of the Format Cells dialog box." telerik:ScreenTip.Description="Show the Alignment tab of the Format Cells dialog box."
telerik:ScreenTip.Title="Format Cells: Alignment" telerik:ScreenTip.Title="Format Cells: Alignment"
@@ -441,7 +437,7 @@
<spreadsheetControls:RadVerticalAlignmentToBooleanConverter x:Key="verticalAlignmentToBooleanConverter" /> <spreadsheetControls:RadVerticalAlignmentToBooleanConverter x:Key="verticalAlignmentToBooleanConverter" />
</telerik:RadRibbonGroup.Resources> </telerik:RadRibbonGroup.Resources>
<StackPanel/> <StackPanel />
<StackPanel> <StackPanel>
<telerik:RadRibbonToggleButton <telerik:RadRibbonToggleButton
@@ -483,10 +479,24 @@
SmallImage="/Assets/Icons/tools.png" SmallImage="/Assets/Icons/tools.png"
Text="PLC 地址" /> Text="PLC 地址" />
</StackPanel> </StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="导航相机镜头畸变校正"
telerik:ScreenTip.Title="畸变校正"
Command="{Binding OpenCameraChessboardCalibrationCommand}"
Size="Medium"
SmallImage="/Assets/Icons/detector2.png"
Text="畸变校正" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="平面坐标系标定"
telerik:ScreenTip.Title="坐标标定"
Command="{Binding OpenCameraCalibrationCommand}"
Size="Medium"
SmallImage="/Assets/Icons/tools.png"
Text="坐标标定" />
</StackPanel>
</telerik:RadRibbonGroup> </telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="多语言"> <telerik:RadRibbonGroup Header="多语言">
<telerik:RadRibbonGroup.Variants> <telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" /> <telerik:GroupVariant Priority="0" Variant="Large" />
@@ -498,7 +508,6 @@
SmallImage="/Assets/Icons/tools.png" SmallImage="/Assets/Icons/tools.png"
Command="{Binding OpenLanguageSwitcherCommand}" Command="{Binding OpenLanguageSwitcherCommand}"
Text="语言设置" /> Text="语言设置" />
</telerik:RadRibbonGroup> </telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="日志"> <telerik:RadRibbonGroup Header="日志">
@@ -532,8 +541,6 @@
Command="{Binding OpenLibraryVersionsCommand}" Command="{Binding OpenLibraryVersionsCommand}"
Text="关于" /> Text="关于" />
</telerik:RadRibbonGroup> </telerik:RadRibbonGroup>
</telerik:RadRibbonTab> </telerik:RadRibbonTab>
</telerik:RadRibbonView> </telerik:RadRibbonView>
@@ -563,7 +570,7 @@
<Grid Grid.Column="2"> <Grid Grid.Column="2">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="370"/> <ColumnDefinition Width="370" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />