优化轮廓:通过轮廓优化,找到自己相要的轮廓,一般采用面积,周长等大小来确认。

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;//优化后绘图。


        
    

学习图像处理知识---Emgu3.4 CvInvoke Class类学习(三)

学习图像处理知识---Emgu3.4 CvInvoke Class类学习(三)



相关文章:

  • 2021-08-25
  • 2021-09-28
  • 2021-11-02
  • 2022-01-11
  • 2022-01-01
  • 2021-08-09
  • 2021-10-21
  • 2021-07-09
猜你喜欢
  • 2021-12-07
  • 2021-04-01
  • 2021-11-08
  • 2021-06-20
  • 2021-06-26
  • 2021-11-12
  • 2021-05-08
相关资源
相似解决方案