第十六篇 机器视觉案例 之 凹点检测
文章目录
- 第十六篇 机器视觉案例 之 凹点检测
 - 1.案例要求
 - 2.实现思路
 - 2.1 方式一:斑点工具加画线工具加点线距离工具
 - 2.2 方法二 使用斑点工具的结果集边缘坐标的横坐标最大值ImageBoundMaxX
 - 2.3 方法三 使用斑点工具的结果集凹点结果集 ConvexHull()
 
- 3.使用控件
 - 3.1 斑点工具 —— CogBlobTool
 - 3.2 画线工具 —— CogCreateLineTool
 - 3.3 点到线距离工具 —— CogDistancePointLineTool
 
- 4.代码逻辑
 - 5.实现效果
 - 6.知识点总结
 - 6.1 坐标排序
 
1.案例要求
检测两个凹点的坐标
 

2.实现思路
2.1 方式一:斑点工具加画线工具加点线距离工具
-  
设置斑点工具的区域

 -  
在靠近凹点的一侧画一条垂直的直线

 -  
循环遍历斑点图像的每一个点到到直线的距离,距离最短的两个区域即为凹点区域,对应的点就是凹点
 
2.2 方法二 使用斑点工具的结果集边缘坐标的横坐标最大值ImageBoundMaxX
- 同方法一设置斑点工具的区域,将极性设置为黑底白点

 - 此时斑点边缘最右侧的点即凹点
 
2.3 方法三 使用斑点工具的结果集凹点结果集 ConvexHull()
- 同方法二斑点工具的区域和极性设置

 - ConvexHull

 
3.使用控件
3.1 斑点工具 —— CogBlobTool
- 设定区域
 - 使用结果集ConvexHull/GetVertexX
 
3.2 画线工具 —— CogCreateLineTool
3.3 点到线距离工具 —— CogDistancePointLineTool
4.代码逻辑
using System.Collections.Generic;
//引入list列表的相关命名空间
 
//定义一个point类用于存贮坐标点
public class Point
{
 public double x ;
 public double y ;
  public Point(double x,double y)
  {
    this.x = x;
    this.y = y;
  }  
}
 
  private CogGraphicCollection gc = new CogGraphicCollection();
  private List<Point> list = new List<Point>();
 
CogBlobTool cbt = mToolBlock.Tools["CogBlobTool1"] as CogBlobTool;
    int count = cbt.Results.GetBlobs()[0].GetBoundary().ConvexHull().GetVertices().Length / 2;
    CogGraphicLabel l = new CogGraphicLabel();
    l.SetXYText(100, 100, count.ToString());
    gc.Add(l);
    
    for(int i = 0 ;i < count ;i++)
    {
      double x = cbt.Results.GetBlobByID(0).GetBoundary().ConvexHull().GetVertexX(i);
      double y = cbt.Results.GetBlobByID(0).GetBoundary().ConvexHull().GetVertexY(i);
      list.Add(new Point(x,y));
    }
    list.Sort((p1,p2) => p1.x.CompareTo(p2.x));
    list.Reverse();
    for(int i = 0;i < 3;i++)
    {
      CogCircle c = new CogCircle();
      c.Color = CogColorConstants.Red;
      c.CenterX = list[i].x;
      c.CenterY = list[i].y;
      c.LineWidthInScreenPixels = 4;
      c.Radius = 2;
      gc.Add(c);
    }
    
   
 
5.实现效果


6.知识点总结
6.1 坐标排序
list.Sort((p1,p2) => p1.x.CompareTo(p2.x));
list.Reverse();
                


















