首先要知道在halcon中,可以通过get_contour_xld算子获取一个xld对象的所有坐标点:

然后问题就变成了把这些坐标点在WPF中绘制出来。
针对这些点集,WPF中可以使用Geometry对象表示;
Geometry抽象类有一个派生类:StreamGeometry:
如何:使用 StreamGeometry 创建形状 - WPF | Microsoft Learn
根据官网Demo,发现可以通过 StreamGeometryContext.PolyLineTo(IList<Point>, Boolean, Boolean) 方法描述整个点集。
按照这个逻辑,可以封装以下方法:
cs
internal static Geometry GetXldGeometry(HXLD xld)
{
if (xld == null || xld.Key == IntPtr.Zero)
{
return Geometry.Empty;
}
//将 HALCON 的 HXLDCont 轮廓(XLD 轮廓)转换为 WPF 的 StreamGeometry 对象
if (xld is HXLDCont cont)
{
cont.GetContourXld(out HTuple row, out HTuple col);
var points = GetXldPoints(row.DArr, col.DArr);
StreamGeometry geometry = new StreamGeometry();
var c = geometry.Open();
c.BeginFigure(points[0], false, false);
c.PolyLineTo(points, true, false);
c.Close();
return geometry;
}
else if (xld is HXLDPoly poly)
{
poly.GetPolygonXld(out HTuple row, out HTuple col, out _, out _);
var points = GetXldPoints(row.DArr, col.DArr);
StreamGeometry geometry = new StreamGeometry();
var c = geometry.Open();
c.BeginFigure(points[0], false, false);
c.PolyLineTo(points, true, false);
c.Close();
return geometry;
}
else
{
var objClass = xld.GetObjClass();
if (objClass == "xld_cont")
{
var cont1 = new HXLDCont(xld);
cont1.GetContourXld(out HTuple row, out HTuple col);//row和col都有上千个点
var points = GetXldPoints(row.DArr, col.DArr);
StreamGeometry geometry = new StreamGeometry();
var c = geometry.Open();
c.BeginFigure(points[0], false, false);
c.PolyLineTo(points, true, false);
cont1.Dispose();
c.Close();
return geometry;
}
else if (objClass == "xld_poly")
{
var poly1 = new HXLDPoly(xld);
poly1.GetPolygonXld(out HTuple row, out HTuple col, out _, out _);
var points = GetXldPoints(row.DArr, col.DArr);
StreamGeometry geometry = new StreamGeometry();
var c = geometry.Open();
c.BeginFigure(points[0], false, false);
c.PolyLineTo(points, true, false);
poly1.Dispose();
c.Close();
return geometry;
}
else
{
return Geometry.Empty;
}
}
}
internal static IList<Point> GetXldPoints(double[] row, double[] column)
{
if (row == null || column == null || row.Length != column.Length)
{
return null;
}
//var rowSpan = new Span<double>(row);
//var colSpan = new Span<double>(column);
List<Point> points = new List<Point>(row.Length);
for (int i = 0; i < row.Length; i++)
{
// Halcon: (row, column) 像素中心
// .NET System.Drawing: (x, y) 像素左上角
points.Add(new Point(column[i] + 0.5, row[i] + 0.5));
}
return points;
}
得到Geometry对象之后,可以通过GeometryDrawing 对象再包装一层:
cs
GeometryDrawing drawing = new GeometryDrawing
{
Geometry = geometry
};
然后通过DrawingContext类中提供的DrawDrawing方法绘制GeometryDrawing对象:
(GeometryDrawing继承自Drawing)
