private void button1_Click_1(object sender, EventArgs e)
{
if (ib_original.Image != null)
{
Mat src = new Image<Bgr, byte>(ib_original.Image.Bitmap).Mat;
Mat dst = new Mat();
//Canny 边缘检测算子
CvInvoke.Canny(src, dst, 120, 180);
//创建用于存储轮廓的VectorOfVectorOfPoint数据类型
//需要添加引用命名空间Emgu.CV.Util
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
//IOutputArray contours:检测到的轮廓。通常使用VectorOfVectorOfPoint类型。
//IOutputArray hierarchy:可选的输出向量,包含图像的拓扑信息。不使用的时候可以用 null 填充。
//每个独立的轮廓(连通域)对应 4 个 hierarchy元素 hierarchy[i][0]~hierarchy[i][4]
//(i表示独立轮廓的序数)分别表示后一个轮廓、前一个轮廓、父轮廓、子轮廓的序数。
//RetrType mode标识符及其解析:
//External = 0 提取的最外层轮廓;
//List = 1 提取所有轮廓
//Ccomp = 2 检索所有轮廓并将它们组织成两级层次结构:水平是组件的外部边界,二级约束边界的洞。
//Tree = 3 提取所有的轮廓和建构完整的层次结构嵌套的轮廓。
//ChainApproxMethod表示轮廓的逼近方法
//ChainCode = 0 Freeman链码输出轮廓。所有其他方法输出多边形(顶点序列)。
//ChainApproxNone = 1 所有的点从链代码转化为点;
//ChainApproxSimple = 2 压缩水平、垂直和对角线部分,也就是说, 只剩下他们的终点;
//ChainApproxTc89L1 = 3 使用The - Chinl 链逼近算法的一个
//ChainApproxTc89Kcos = 4 使用The - Chinl 链逼近算法的一个
//LinkRuns = 5, 使用完全不同的轮廓检索算法通过链接的水平段的1s轨道。
//用这种方法只能使用列表检索模式。
CvInvoke.FindContours(dst, contours, null, Emgu.CV.CvEnum.RetrType.External,
Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
//获取一张背景为黑色的图像,大小与原图相同
Mat mask = src.ToImage<Bgr, byte>().CopyBlank().Mat;
//用红色画笔在mask图像中画出所有轮廓
//int contourIdx:绘画轮廓的序号。如果为负数表示绘画出全部轮廓。一般为-1。
//MCvScalar color:画笔的颜色。
//int thickness = 1:画笔的宽度。
//LineType lineType = LineType.EightConnected:Emgu.CV.Cvenum 枚举类型标识符,
//表示绘画线条的类型,默认 8 连通类型。
//FourConnected = 4 4连通类型
//eightConnected = 8 8连通类型
//AntiAlias = 16 消除锯齿
CvInvoke.DrawContours(mask, contours, -1, new MCvScalar(0, 0, 255));
ib_result.Image = mask;
}
}
EmguCv提取轮廓与绘制轮廓
猜你喜欢
转载自blog.csdn.net/xjjatdna/article/details/85416502
今日推荐
周排行