欢迎光临
我们一直在努力

WPF测量软件之测量印刷圆心到点的距离-UI

WPF测量软件之测量印刷圆心到点的距离-UI

在这里插入图片描述

在这里插入图片描述

一 UI设计

在这里插入图片描述

<Grid Grid.Column="6" Grid.ColumnSpan="6">

<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>

</Grid.ColumnDefinitions>

<Label Grid.Column="0" Content="测量距离:" VerticalAlignment="Center" HorizontalAlignment="Center" ></Label>
<Label x:Name="lb_MeasureDistance" Grid.Column="1" Content="0" VerticalAlignment="Center" HorizontalAlignment="Center" ></Label>
<Label Grid.Column="2" Content="标准距离:" VerticalAlignment="Center" HorizontalAlignment="Center" ></Label>
<Label x:Name="lb_StdDistance" Grid.Column="3" Content="0" VerticalAlignment="Center" HorizontalAlignment="Center" ></Label>
<Label Grid.Column="4" Content="距离差:" VerticalAlignment="Center" HorizontalAlignment="Center" ></Label>
<Label x:Name="lb_diffValue" Grid.Column="5" Content="0" VerticalAlignment="Center" HorizontalAlignment="Center" ></Label>

</Grid>

二 标准距离

/// <summary>
/// 测量的标准距离
/// </summary>
private double _stdDistance = 0;
public double StdDistance
{
get { return _stdDistance; }
set => SetProperty(ref _stdDistance, value);
}
/// <summary>
/// 卡控阈值
/// </summary>
private double _thre = 0;
public double Thre
{
get { return _thre; }
set => SetProperty(ref _thre, value);
}

<Label Content="标准距离:" Margin="10"/>
<TextBox x:Name="tbx_STDDistance" Text="{Binding AppParameter.StdDistance}" Margin="10"/>
<Label Content="卡控阈值:" Margin="10"/>
<TextBox x:Name="tbx_Thre" Text="{Binding AppParameter.Thre}" Margin="10"/>

三 加载标定文件

HTuple hv_CamParamChange = new HTuple();
HTuple hv_CameraPose = new HTuple();

HOperatorSet.ReadTuple(@"./标定文件/CameraParameters.tup", out hv_CamParamChange);
HOperatorSet.ReadTuple(@"./标定文件/CameraPose.tup", out hv_CameraPose);

四 HalconAlgo

/// <summary>
/// 计算两线交点和圆心的距离
/// </summary>
/// <param name="img"></param>
/// <param name="X"></param>
/// <param name="Y"></param>
/// <param name="A"></param>
public void MeasurePPDistance(HObject img, out double PPDistance, out double CircleX, out double CircleY, out double PointX, out double PointY)
{

// 一 畸变矫正
// 读取畸变矫正文件
HOperatorSet.ReadImage(out HObject Map, @"./标定文件/Map");
// 畸变矫正
HOperatorSet.MapImage(img, Map, out img);

// 二 计算线线交点
// 模板匹配
HOperatorSet.FindNccModel(
img,
ModelID_Lines,
fitLinesModel.angleStart_F,
fitLinesModel.angleExtent_F,
fitLinesModel.minScore_F,
fitLinesModel.numMatches_F,
fitLinesModel.maxOverlap_F,
fitLinesModel.subPixel_F,
fitLinesModel.numLevels_F,
out HTuple row,
out HTuple column,
out HTuple angle,
out HTuple score
);

//2.获取模板匹配后的点和角度

//3.生成仿射矩阵
XYAModel xya = (XYAModel)XmlSerializerHelper.ReadXML(@"./算法参数/linesXYA", typeof(XYAModel));

HOperatorSet.VectorAngleToRigid(xya.Y, xya.X, xya.A, row.D, column.D, angle.D, out HTuple HomMat2D);

HTuple affineStartY = new HTuple(), affineStartX = new HTuple(), affineEndY = new HTuple(), affineEndX = new HTuple();
HTuple affineStartY2 = new HTuple(), affineStartX2 = new HTuple(), affineEndY2 = new HTuple(), affineEndX2 = new HTuple();
HTuple Angle = new HTuple();
if (File.Exists("./算法参数/line1.xml"))
{
Line_INFO line = (Line_INFO)XmlSerializerHelper.ReadXML("./算法参数/line1.xml", typeof(Line_INFO));

if (HomMat2D.Length > 0)
{
HOperatorSet.AffineTransPixel(HomMat2D, line.StartY, line.StartX, out affineStartY, out affineStartX);
HOperatorSet.AffineTransPixel(HomMat2D, line.EndY, line.EndX, out affineEndY, out affineEndX);
}

}

if (File.Exists("./算法参数/line2.xml"))
{
Line_INFO line = (Line_INFO)XmlSerializerHelper.ReadXML("./算法参数/line2.xml", typeof(Line_INFO));
if (HomMat2D.Length > 0)
{

HOperatorSet.AffineTransPixel(HomMat2D, line.StartY, line.StartX, out affineStartY2, out affineStartX2);
HOperatorSet.AffineTransPixel(HomMat2D, line.EndY, line.EndX, out affineEndY2, out affineEndX2);

}

}

Line_INFO DrawLineInfo1 = new Line_INFO(affineStartY.D, affineStartX.D, affineEndY.D, affineEndX.D);

// 拟合直线的工具
FitLineTool(img, DrawLineInfo1, out Line_INFO line_Info1);
HOperatorSet.LineOrientation(line_Info1.StartY, line_Info1.StartX, line_Info1.EndY, line_Info1.EndX, out HTuple line1Phi);
Angle = line1Phi;

Line_INFO DrawLineInfo2 = new Line_INFO(affineStartY2.D, affineStartX2.D, affineEndY2.D, affineEndX2.D);

// 拟合直线的工具
FitLineTool(img, DrawLineInfo2, out Line_INFO line_Info2);

// 核心:两线相交
HOperatorSet.IntersectionLines(line_Info1.StartY, line_Info1.StartX, line_Info1.EndY, line_Info1.EndX, line_Info2.StartY, line_Info2.StartX, line_Info2.EndY, line_Info2.EndX, out HTuple y, out HTuple x, out HTuple isOverlapping);

// 三 拟合印刷圆心
// 模板匹配
HOperatorSet.FindNccModel(
img,
ModelID_Circle,
findCircleModel.angleStart_F,
findCircleModel.angleExtent_F,
findCircleModel.minScore_F,
findCircleModel.numMatches_F,
findCircleModel.maxOverlap_F,
findCircleModel.subPixel_F,
findCircleModel.numLevels_F,
out HTuple Y2,
out HTuple X2,
out HTuple angle2,
out HTuple score2
);

// 1.屏蔽区域
HRegion hRegion = new HRegion();

Circle_INFO circle_INFO = new Circle_INFO(Y2.D, X2.D, findCircleModel.Radius);

// 2.拟合圆
AlgoHelper.MeasureCircle(AlgoHelper.HobjectToHimage(img),
circle_INFO,
MetrologyInfo,
hRegion,
out Circle_INFO _outCircleInfo,
out HTuple row2,
out HTuple col2,
out HXLDCont MeasureXLD2
);

// 四 计算印刷圆心到点的距离

HOperatorSet.ImagePointsToWorldPlane(hv_CamParamChange, hv_CameraPose, _outCircleInfo.CenterY, _outCircleInfo.CenterX, "mm", out HTuple hv_X1, out HTuple hv_Y1);

HOperatorSet.ImagePointsToWorldPlane(hv_CamParamChange, hv_CameraPose, y, x, "mm", out HTuple hv_X2, out HTuple hv_Y2);

HOperatorSet.DistancePp(hv_Y1, hv_X1, hv_Y2, hv_X2, out HTuple distance);

PPDistance = distance.D;

CircleX = _outCircleInfo.CenterX;

CircleY = _outCircleInfo.CenterY;
PointX = x.D;

PointY = y.D;

}

五 AlgorithmService

/// <summary>
/// 计算两线交点和圆心的距离
/// </summary>
/// <param name="img"></param>
/// <param name="PPDistance"></param>
public void MeasurePPDistance(HObject img, out double PPDistance,out double CircleX, out double CircleY, out double PointX, out double PointY)
{
halconAlgo.MeasurePPDistance(img , out PPDistance, out CircleX, out CircleY, out PointX, out PointY);
}

六 工作线程

try
{

AlgorithmService.Instance.MeasurePPDistance(info.Image, out double PPDistance ,out double CircleX, out double CircleY, out double PointX, out double PointY);

Application.Current.Dispatcher.Invoke(

new Action(
() =>
{
// 1.获取_mainWindow
var _mainWindow = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is MainWindow) as MainWindow;

MainWindowViewModel mainWindowViewModel = _mainWindow.DataContext as MainWindowViewModel;

_mainWindow.lb_MeasureDistance.Content = PPDistance;
_mainWindow.lb_StdDistance.Content = mainWindowViewModel.AppParameter.StdDistance;
_mainWindow.lb_diffValue.Content = PPDistance mainWindowViewModel.AppParameter.StdDistance;

// 五 发送结果给上位机
// 通讯定义:res,offsetX,offsetY

if(Math.Abs(PPDistance mainWindowViewModel.AppParameter.StdDistance)> mainWindowViewModel.AppParameter.Thre)
{
CommunicateService.Instance.Send("res,NG," + PPDistance);
Log.Info("res,NG," + PPDistance);
mainWindowViewModel.StatisticalData.NGNum++;

}
else
{
CommunicateService.Instance.Send("res,OK," + PPDistance);
Log.Info("res,OK," + PPDistance);
mainWindowViewModel.StatisticalData.OKNum++;

}

// 绑定显示UI

if (mainWindowViewModel.OKDatas.Count == 0)
{
mainWindowViewModel.OKDatas.Add(new ObservableValue(mainWindowViewModel.StatisticalData.OKNum));
mainWindowViewModel.NGDatas.Add(new ObservableValue(mainWindowViewModel.StatisticalData.NGNum));
}
else
{
mainWindowViewModel.OKDatas[0] = new ObservableValue(mainWindowViewModel.StatisticalData.OKNum);
mainWindowViewModel.NGDatas[0] = new ObservableValue(mainWindowViewModel.StatisticalData.NGNum);
}

// 2.获取窗口上的显示控件
HWindow_Final hWindow_Final = _mainWindow.hWindow_Final_CameraImg;

// 3.显示标定点
hWindow_Final.HobjectToHimage(info.Image);

HOperatorSet.GenCrossContourXld(out HObject cross1, CircleY, CircleX, 60, 0);
hWindow_Final.DispObj(cross1, "red");
HOperatorSet.GenCrossContourXld(out HObject cross2, PointY, PointX, 60, 0);
hWindow_Final.DispObj(cross2, "yellow");
}

)

);

}
catch
{

}

赞(0)
未经允许不得转载:171主机测评 » WPF测量软件之测量印刷圆心到点的距离-UI
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址