流程图连接图效果图
细节部分
思路见前面流程图,重点是如何用脚本实现。
注释掉自动运行工具的代码 ,因为部分工具等待脚本调用
CogGraphicCollection gc = new CogGraphicCollection(); //添加图形集合
CogSobelEdgeTool sobel = mToolBlock.Tools["CogSobelEdgeTool1"] as CogSobelEdgeTool;
sobel.Run();//1.运行边缘提取工具
CogBlobTool blob1 = mToolBlock.Tools["CogBlobTool1"] as CogBlobTool;
blob1.Run();//2.运行斑点工具
CogDistancePointPointTool dis = mToolBlock.Tools["CogDistancePointPointTool1"] as CogDistancePointPointTool;
CogCopyRegionTool copy = mToolBlock.Tools["CogCopyRegionTool1"] as CogCopyRegionTool;//获取copyRegion工具
CogBlobTool blob2 = mToolBlock.Tools["CogBlobTool2"] as CogBlobTool;
gc.Clear();//每次运行 清空图形集合
//处理每个斑点的信息
for(int i = 0;i < blob1.Results.GetBlobs().Count ; i++)//blob1.Results.GetBlobs().Count斑点个数
{
//定义数组 用于存放距离
ArrayList disList = new ArrayList();
disList.Clear();
//获取边缘 获取每个顶点 计算顶点到圆心的距离 并从小到大进行排序 取N个值计算均值 以均值作为填补圆的半径
//1.获取边缘和质心
double center_x = blob1.Results.GetBlobs()[i].CenterOfMassX;
double center_y = blob1.Results.GetBlobs()[i].CenterOfMassY;
CogPolygon p = blob1.Results.GetBlobs()[i].GetBoundary(); //获取某个斑点的边缘的多边形
for(int no = 0;no < p.NumVertices ;no++) //获取每个顶点的信息
{
dis.StartX = p.GetVertexX(no);
dis.StartY = p.GetVertexY(no);
dis.EndX = center_x;
dis.EndY = center_y;
dis.Run();//2.计算 顶点到圆心的距离
disList.Add(dis.Distance);//3.把距离加入列表
}
//4.排序 从小到大排序
disList.Sort();
int Num = 100;
double sum = 0;//和
double r = 0;
//5.取前面的Num个值 假定 Num=100 求平均
if( disList.Count >= Num )
{
for(int j = 0; j < Num; j++)
{
sum += (double ) disList[j];
}
r = sum / Num; //6. 半径
}
//得到半径之后,填补
((CogCircle) copy.Region).CenterX = center_x;
((CogCircle) copy.Region).CenterY = center_y;
((CogCircle) copy.Region).Radius = r; //***** 最关键的部分
copy.Run();//运行 copyregion工具
//对每个斑点进行一下 blob分析
blob2.Region = p;//每个斑点 ******
blob2.Run();
//显示 blob2的结果数取出 并且进行显示 添加label框
CogGraphicLabel lb = new CogGraphicLabel();
lb.X = blob1.Results.GetBlobs()[i].CenterOfMassX; //放置坐标 质心
lb.Y = blob1.Results.GetBlobs()[i].CenterOfMassY; //放置坐标 质心
lb.Color = CogColorConstants.Red;
lb.Font = new Font("楷体", 10);
lb.Text = "齿数:" + blob2.Results.GetBlobs().Count.ToString();
gc.Add(lb);
}
foreach( ICogGraphic item in gc )
mToolBlock.AddGraphicToRunRecord(item, lastRecord, "CogSobelEdgeTool1.InputImage", "");