EmgnCv进行轮廓寻找和计算物体凸包

一、轮廓寻找 用的是FindContours函数,在CvInvoke中 不过需要用到这个VectorOfVectorOfPoint,来代替c++中的Vector 还有就是FindContours函数中的第三个参数hierarchy,,不知道作用是什么,填入的只要是符合IOutputArray类型的都可以运行 代码:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using Emgu.CV;using Emgu.CV.CvEnum;using Emgu.CV.Structure;using Emgu.CV.Util;using Emgu.Util;using Emgu.CV.UI;namespace EmguCVHist{Form1 : Form{public Form1(){InitializeComponent();Image<Bgr, byte> a = new Image<Bgr, byte>(“153_140703112619_1.jpg”);Image<Gray, byte> b = new Image<Gray, byte>(a.Width, a.Height);Image<Gray, byte> c = new Image<Gray, byte>(a.Width, a.Height);Image<Bgr, byte> d = new Image<Bgr, byte>(a.Width, a.Height);CvInvoke.Canny(a, b, 100, 60);VectorOfVectorOfPoint con = new VectorOfVectorOfPoint();CvInvoke.FindContours(b, con, c, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);for (int i = 0; i < con.Size; i++)CvInvoke.DrawContours(d, con, i, new MCvScalar(255, 0, 255, 255),2);imageBox1.Image = d;}}}

二、凸包的计算 凸包的计算需要用到上面所求得的轮廓寻找的数据 ConvexHull函数的参数之前的不太一样,换成了PointF类型的,但所求的数据为VectorOfVectorOfPoint类型,所以就需要个转换,先把VectorOfVectorOfPoint转为Point的二维数组,在把二维数组转成PointF的二维数组,然后再挨个调用, 代码如下:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using Emgu.CV;using Emgu.CV.CvEnum;using Emgu.CV.Structure;using Emgu.CV.Util;using Emgu.Util;using Emgu.CV.UI;namespace EmguCVHist{Form1 : Form{public Form1(){InitializeComponent();Image<Bgr, byte> a = new Image<Bgr, byte>(“9660416_102608612175_2.jpg”);Image <Gray, byte> b = new Image<Gray, byte>(a.Width, a.Height);Image<Gray, byte> c = new Image<Gray, byte>(a.Width, a.Height);Image<Bgr, byte> d = new Image<Bgr, byte>(a.Width, a.Height);CvInvoke.Canny(a, b, 100, 60);VectorOfVectorOfPoint con = new VectorOfVectorOfPoint();CvInvoke.FindContours(b, con, c, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);Point[][] con1 = con.ToArrayOfArray();PointF[][] con2 = Array.ConvertAll<Point[], PointF[]>(con1, new Converter<Point[], PointF[]>(PointToPointF));for (int i = 0; i < con.Size; i++){PointF[] hull = CvInvoke.ConvexHull(con2[i], true);for (int j = 0; j < hull.Length; j++){Point p1 = new Point((int)(hull[j].X + 0.5), (int)(hull[j].Y + 0.5));Point p2;if (j == hull.Length – 1)p2 = new Point((int)(hull[0].X + 0.5), (int)(hull[0].Y + 0.5));elsep2 = new Point((int)(hull[j + 1].X + 0.5), (int)(hull[j + 1].Y + 0.5));CvInvoke.Circle(d, p1, 3, new MCvScalar(0, 255, 255, 255), 6);CvInvoke.Line(d, p1, p2, new MCvScalar(255, 255, 0, 255), 3);}}for (int i = 0; i < con.Size; i++)CvInvoke.DrawContours(d, con, i, new MCvScalar(255, 0, 255, 255), 2);imageBox1.Image = a.ConcateVertical(d);}public static PointF[] PointToPointF(Point[] pf){PointF[] aaa = new PointF[pf.Length];int num = 0;foreach(var point in pf){aaa[num].X = (int)point.X;aaa[num++].Y = (int)point.Y;}return aaa;}}}

运行图:(之前那个图片由于会被分为好多块,所以换了张图片)

只是需要垮上后座的勇气和一颗想走即走的心,

EmgnCv进行轮廓寻找和计算物体凸包

相关文章:

你感兴趣的文章:

标签云: