1. 导读:
前面有一篇博客分享了如何使用C#调用ToolBlock,以完成一个简单的视觉开发项目。今天主要分享一下在ToolBlock中,如何编写运行脚本,主要包括以下几个方面的演示:
- ToolBlock添加输入项,主要用于用户界面参数修改,然后以参数的形式传入ToolBlock,以影响算法工具。
- 通过函数绘制自定义图形Graphics,然后将其打印到ToolBlock的某一个图层中(在VP中常说的Record类似于PS中的图层)。
- 输出一个不常用的数据类型,PMAlign工具的运行结果对象,也就是CogPMAlignResults类型。
最终效果:
2. 实现步骤:
- 在ToolBlock中添加一个CogPMAlignTool 工具,然后选择一张边缘对比较好的图像,训练模板。
- 选择ToolBlock的输出引脚类型–CogPMAlignResults
- 为当前ToolBlocl编写脚本,注意:这里选择C#高级脚本模式。
public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase
{
private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;
private CogPMAlignTool pmaTool = new CogPMAlignTool();
private CogGraphicCollection graphicList = new CogGraphicCollection();
public override bool GroupRun(ref string message, ref CogToolResultConstants result)
{
//if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();
graphicList.Clear();
//初始化PMAlign工具
pmaTool = mToolBlock.Tools["CogPMAlignTool1"]as CogPMAlignTool;
//将ToolBlock的Inputs[SetCount]引脚设置为PMAlignTool的预期查找数量
pmaTool.RunParams.ApproximateNumberToFind = (int) mToolBlock.Inputs["SetCount"].Value;
//运行PMAlign工具
pmaTool.Run();
//获取结果,并将自定义图像添加到画板中
foreach (CogPMAlignResult item in pmaTool.Results)
{
graphicList.Add(CreateCircle(item.GetPose().TranslationX, item.GetPose().TranslationY, 50, CogColorConstants.Green));
graphicList.Add(CreatLabel("Score:" + item.Score.ToString("0.000"), 12, item.GetPose().TranslationX - 30, item.GetPose().TranslationY - 25, CogColorConstants.Green));
}
//将PMAlign工具的结果集合绑定到ToolBlock的输出
mToolBlock.Outputs["ResultList"].Value = pmaTool.Results;
//如果ToolBlock内的运行流程是自定义的,则返回false,否则如果按照正常流程执行则返回true
return false;
}
/// <summary>
/// 绘制仿射矩形
/// </summary>
private CogRectangleAffine CreateRectangleAffine(double Postion_X, double Postion_Y, double Weight, double Height, double Rotation, CogColorConstants Color)
{
CogRectangleAffine RectangleAffine = new CogRectangleAffine();
RectangleAffine.SetOriginLengthsRotationSkew(Postion_X, Postion_Y, Weight, Height, Rotation, 0);
RectangleAffine.Color = Color;
RectangleAffine.LineStyle = CogGraphicLineStyleConstants.Solid;
RectangleAffine.LineWidthInScreenPixels = 1;
//RectangleAffine.SelectedSpaceName = affine.Region.SelectedSpaceName;
return RectangleAffine;
}
/// <summary>
/// 绘制矩形
/// </summary>
private CogRectangle CreatRectangle(double Postion_X, double Postion_Y, double Weight, double Height, CogColorConstants Color)
{
CogRectangle Rectangle = new CogRectangle();
Rectangle.X = Postion_X;
Rectangle.Y = Postion_Y;
Rectangle.SetCenterWidthHeight(Rectangle.X, Rectangle.Y, Weight, Height);
Rectangle.Color = Color;
Rectangle.LineStyle = CogGraphicLineStyleConstants.Solid;
Rectangle.LineWidthInScreenPixels = 5;
return Rectangle;
}
/// <summary>
/// 绘制标签
/// </summary>
private CogGraphicLabel CreatLabel(string text, float size, double x, double y, CogColorConstants Color)
{
CogGraphicLabel label = new CogGraphicLabel();
label.Font = new Font("Arial", size, FontStyle.Bold, GraphicsUnit.Point);
label.Color = Color;
label.SetXYText(x, y, text);
label.Alignment = CogGraphicLabelAlignmentConstants.TopLeft;
return label;
}
/// <summary>
/// 绘制圆形
/// </summary>
private CogCircle CreateCircle(double Center_X,double Center_Y,double Radius,CogColorConstants color)
{
CogCircle circle = new CogCircle();
circle.CenterX = Center_X;
circle.CenterY = Center_Y;
circle.Radius = Radius;
circle.Color = color;
circle.LineStyle=CogGraphicLineStyleConstants.Solid;
circle.LineWidthInScreenPixels = 3;
return circle;
}
/// <summary>
/// 当上一次的记录发生改变,并正在重构时调用此函数
/// </summary>
/// <param name="lastRecord">新的运行记录</param>
public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord)
{
// 遍历画板,然后将自定义图形添加到ToolBlock的新的绘制记录上
foreach (ICogGraphic item in graphicList)
{
mToolBlock.AddGraphicToRunRecord(item, lastRecord, "CogPMAlignTool1.InputImage", "Script");
}
}
}
- 开发程序中,在ToolBlock的Ran事件回调函数中显示,并获取结果。
private void OnToolBlockRan(object sender, EventArgs e)
{
cogRecordDisplay2.Image = null;
//将当前ToolBlock的Record显示在RecordDisplay控件上
cogRecordDisplay2.Record = (CogRecord)cogToolBlock2.CreateLastRunRecord().SubRecords[0];
cogRecordDisplay2.Fit(true);
//获取ToolBlock的输出结果,然后显示DataGridView控件中
List<DataObj> dataList = new List<DataObj>();
CogPMAlignResults resultList = (CogPMAlignResults)cogToolBlock2.Outputs["ResultList"].Value;
foreach (CogPMAlignResult item in resultList)
{
dataList.Add(new DataObj(item.ID, item.GetPose().TranslationX, item.GetPose().TranslationY, item.GetPose().Rotation, item.GetPose().Scaling, item.Score));
}
dgv_DataList.DataSource = dataList;
}
以上如有错误,欢迎指正,谢谢。。