优化轮廓:通过轮廓优化,找到自己相要的轮廓,一般采用面积,周长等大小来确认。
1.计算轮廓面积
public static double ContourArea( IInputArray contour, //轮廓 bool oriented = false )
2.计算轮廓周长
public static double ArcLength( IInputArray curve,//轮廓 bool isClosed )
3.修正轮廓
public static void ApproxPolyDP( IInputArray curve, //输入轮廓 IOutputArray approxCurve, //输出轮廓 double epsilon, //逼近精度 bool closed )
本例采用面积大小进行筛选轮廓,由于在机器视觉来确认。
Mat spic = new Mat("ko.jpg", Emgu.CV.CvEnum.ImreadModes.Grayscale);
Mat mds = new Mat();
CvInvoke.Canny(spic, mds, 100, 180); //
VectorOfVectorOfPoint cwaikuo = new VectorOfVectorOfPoint();//优化前轮廓
VectorOfVectorOfPoint cwaikuo_you = new VectorOfVectorOfPoint();//优化后
CvInvoke.FindContours(mds,cwaikuo,null,Emgu.CV.CvEnum.RetrType.ListEmgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);//提取轮廓
///通过面积大小进行筛选for(int i=0;i< cwaikuo.Size;i++)
{
VectorOfPoint mian_poit = cwaikuo[i];
Double ar = CvInvoke.ContourArea(mian_poit);//计算面积
///如果采用周长,直接 Double ar = CvInvoke.ArcLength(mian_poit, true);其他都是一样的。
if(ar> (int)numericUpDown1.Value){
cwaikuo_you.Push(mian_poit); //放进优化后轮廓
}
}
Mat mas = spic.ToImage<Bgr, Byte>().CopyBlank().Mat;
CvInvoke.DrawContours(mas, cwaikuo_you, -1, new MCvScalar(0,0,255)); //画轮廓
pictureBox4.Image = mds.Bitmap; //CvInvoke.Canny(spic, mds, 100, 180);后的图片
pictureBox5.Image = mas.Bitmap;//优化后绘图。