前面已經簡單學習基本圖檔處理用法,很多功能同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; }
找到輪廓後需畫出輪廓以便顯示是否正常。
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();