天天看點

學習圖像處理知識---Emgu3.4 CvInvoke Class類學習(二)

前面已經簡單學習基本圖檔處理用法,很多功能同Emgu3.4 image類,相同部分就不學習了,隻做了解,

其實Emgu3.4 image類底層代碼就是用CvInvoke Class的。

圖檔進行二值化後找出輪廓:

public static void FindContours(
	IInputOutputArray image,//輸入圖檔必須為灰圖圖像
	IOutputArray contours, //輸出輪廓
	IOutputArray hierarchy,//輸出相量
	RetrType mode, //輪廓類型
	ChainApproxMethod method, //點連接配接模式
	Point offset = null
)      

在輪廓處理時,我們使用到VectorOfVectorOfPoint類用于存取點陣。先進性學習:

Namespace:  Emgu.CV.Util,檔案在in Emgu.CV.World.dll中調用

同時它具有很多接口,在CvInvoke Class中很多地方用得到。

public class VectorOfVectorOfPoint : UnmanagedObject, 
	IInputOutputArray, IInputArrayOfArrays, IOutputArrayOfArrays, IOutputArray, IInputArray      

構造函數:

public VectorOfVectorOfPoint()  //建立空對象      
public VectorOfVectorOfPoint(   //建立對象點陣數組執行個體
	Point[][] values
)      
public VectorOfVectorOfPoint(   //建立建立一個特定大小的VectorOfPoint的标準向量
	int size   
)      
public VectorOfVectorOfPoint(     //建立一個帶有初始值的VectorOfPoint的标準向量
	params VectorOfPoint[] values
)      

其中常用的函數:

public void Clear()  //清理數組      
Push(VectorOfPoint) 有三種
      
Push(VectorOfVectorOfPoint) //此種用得多。
      

常見屬性用得多為其

public int Size { get; } //多用于找到輪廓個數。如果沒有的話為零。

public VectorOfPoint this[
	int index
] { get; }      

找到輪廓後需畫出輪廓以便顯示是否正常。

學習圖像處理知識---Emgu3.4 CvInvoke Class類學習(二)

 Emgu.CV.Image<Gray,byte> GAY1 = new Image<Gray, byte>((Bitmap)pictureBox3.Image);

           // pictureBox5.Image = GAY1.ThresholdBinaryInv(new Gray((int)numericUpDown1.Value), new Gray(250)).Bitmap;

            // pictureBox5.Image = GAY1.ThresholdTrunc(new Gray((int)numericUpDown1.Value)).Bitmap;

            VectorOfVectorOfPoint cwaikuo = new VectorOfVectorOfPoint();

            GAY1 = GAY1.ThresholdAdaptive(new Gray(120), Emgu.CV.CvEnum.AdaptiveThresholdType.MeanC, Emgu.CV.CvEnum.ThresholdType.Binary, 3, new Gray((int)numericUpDown1.Value));

            GAY1= GAY1.Canny(100, 180);

            pictureBox4.Image = GAY1.ToBitmap();

            CvInvoke.FindContours(GAY1, cwaikuo, null, Emgu.CV.CvEnum.RetrType.List, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);

            Emgu.CV.Image<bgr, byte> ditu = new Image<Bgr, byte>(GAY1.Size);//注意這裡一定為非灰圖圖檔,否則無法繪制顔色。

                CvInvoke.DrawContours(ditu, cwaikuo, -1, new MCvScalar(0, 0, 255));

              //  ditu.Draw(new Rectangle(new Point(20,20),new Size(100,150)),)

                pictureBox5.Image = ditu.ToBitmap();