EmguCV使用中常用函數總結


 1 //EmguCV常用函數總結:  2 //讀取圖片  3 Mat SCr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.AnyColor);  4 //根據路徑創建指定的灰度圖片
 5 Mat scr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.Grayscale);  6 獲取灰度    //圖像類型轉換, bgr 轉成 gray 類型。MAT Bw = New MAT
 7 CvInvoke.CvtColor(SCr, bw, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);  8 //相當於二值化圖 --黑白 根據大小10判斷為0還是255
 9 CvInvoke.Threshold(bw,bw,10,255,Emgu.CV.CvEnum.ThresholdType.BinaryInv);  10 //獲取指定區域圖片 SCr為mat類型
 11 Rectangle rectangle = new Rectangle(10,10,10,10);  12 SCr = SCr.ToImage<Bgr, byte>().GetSubRect(rectangle).Mat;  13 //將Mat類型轉換為Image類型
 14 Image<Bgr, byte> Su = SCr.ToImage<Bgr, byte>();  15 Image<Bgr, byte> Img = new Image<Bgr, byte>(new Bitmap(""));//路徑聲明
 16 Image<Bgr, byte> Sub = SCr.ToImage<Bgr, byte>().GetSubRect(rectangle);//指定范圍  17 //指定參數獲得結構元素
 18 Mat Struct_element = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Cross, new Size(3, 3), new Point(-1, -1));  19 //膨脹
 20 CvInvoke.Dilate(bw, bw, Struct_element, new Point(1,1),3,Emgu.CV.CvEnum.BorderType.Default, new MCvScalar(0, 0, 0));  21 //腐蝕 當Struct_element模型創建不合理或者膨脹腐蝕次數較大時可能圖像會發生偏移
 22 CvInvoke.Erode(bw, bw, Struct_element, new Point(-1, -1), 3,Emgu.CV.CvEnum.BorderType.Default, new MCvScalar(0, 0, 0));  23 //輪廓提取
 24 VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();  25 //篩選后
 26 CvInvoke.FindContours(bw, contours, null, Emgu.CV.CvEnum.RetrType.List, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);  27 int ksize = contours.Size;//獲取連通區域的個數。 
 28 VectorOfPoint contour = contours[i];//獲取獨立的連通輪廓 
 29 Rectangle rect = CvInvoke.BoundingRectangle(contour);//提取最外部矩形。
 30 double Length = CvInvoke.ArcLength(contour, false);//計算連通輪廓的周長。  31 //畫出輪廓
 32 Mat mask = bw.ToImage<Bgr, byte>().CopyBlank().Mat;  33 //獲取一張背景為黑色的圖像, 大小與 scr 的大小一樣, 類型為 Bgr。
 34 CvInvoke.DrawContours(mask, contours, -1, new MCvScalar(0, 0, 255));  35 Image<Ycc, byte> ycc_img = bgr_img.Convert<Ycc, byte>();//把 bgr顏色圖片轉成ycbcr類型。
 36 Ycc min = new Ycc(152, 38, 118);//最小值的顏色。
 37 Ycc max = new Ycc(94, 43, 118);//最大值得顏色。
 38 Image<Gray, byte> result = ycc_img.InRange(min, max);//進行顏色提取。
 39 Image<Bgr, byte> bgr_img = Ma.ToImage<Bgr, byte>();//載入一張 Bgr 類型的圖片。
 40 Bgr min = new Bgr(255, 255, 255);//白色的最小值, 允許一定154的誤差。
 41 Bgr max = new Bgr(255, 255, 255);//白色的最大值, 允許一定的誤差。
 42 Image<Gray, byte> result = bgr_img.InRange(min, max);//進行顏色提取。
 43 Image<Bgr, Byte> imageSource = new Image<Bgr, Byte>(SCr.Bitmap);  44 Image<Hsv, Byte> imageHsv = imageSource.Convert<Hsv, Byte>();//將色彩空間從BGR轉換到HSV
 45 Image<Gray, Byte>[] imagesHsv = imageHsv.Split();//分解成H、S、V三部分
 46 CvInvoke.AbsDiff(Ma1, Ma2, Ma); // 返回兩幅圖片或此圖與某個yanse像素的差的絕對值的圖片
 47 CvInvoke.Add(Ma1, Ma2, Ma); // 返回這張圖片與圖片或顏色直接相加的圖片(矩陣加法) (適應兩種效果)  48 //CvInvoke.HConcat(Ma1, Ma2, Ma); //返回與另一張圖片橫向鏈接的圖片  49 //CvInvoke.VConcat(Ma1, Ma2, Ma);//返回與另一張圖片縱向鏈接的圖片  50 
 51 //清除小於平均頂點10的二值圖
 52 Point[] po = { new Point(0, 0), new Point(res.Width, 0), new Point(res.Width, minAvg - Gets.Fges[1] + 52), new Point(0, minAvg - Gets.Fges[1] + 52) };  53 VectorOfPoint vp = new VectorOfPoint(po);  54 //CvInvoke.DrawContours(res, vp, -1, new MCvScalar(0, 0, 255));
 55 CvInvoke.FillConvexPoly(res,vp,new MCvScalar(0),LineType.EightConnected);//填充指定區域
 56 
 57 /// <summary>
 58 /// 灰度直方圖計算 手動計算、/獲取百分比的閥值 0.95  59 /// </summary>
 60 public static void GetDenseHistogram95(ref int huidu, Mat ma)  61 {  62             DenseHistogram dense = new DenseHistogram(256, new RangeF(0, 255));  63             dense.Calculate(new Image<Gray, Byte>[] { ma.ToImage<Gray, byte>() }, true, null);  64             //計算直方圖數據。
 65             float[] data = dense.GetBinValues();  66             float[] data2 = dense.GetBinValues();  67             //獲得直方圖數據。
 68             /*** 進行數據歸一化到[0,256]區域內並且繪制直方圖***/
 69             float max = data[0]; //最大值
 70             for (int j = 1; j < data.Length; j++)  71  {  72                 if (data[j] > max)  73  {  74                     max = data[j];  75  }  76  }  77             float Sum = data2.ToList().Sum();  78             float FloCount = 0;  79             for (int k = 0; k < data.Length; k++)  80  {  81                 data[k] = data[k] * 256 / max;  82                 FloCount += data2[k];  83                 if (FloCount / Sum >= 0.95)  84  {  85                     huidu = k;  86                     break;  87  }  88  }  89 }  90 
 91 //各種顏色空間 Hsv/Rgb/Hls/Xyz/Ycc/Gray
 92 public static Image<Hsv, Byte> imageHsv=new Image<Hsv, byte>(mat.Bitmap);  93 public static Image<Rgb, Byte> Rgbimg = new Image<Rgb, byte>(mat.Bitmap);  94 public static Image<Hls, Byte> Hlsimg = new Image<Hls, byte>(mat.Bitmap);  95 public static Image<Xyz, Byte> Xyzimg = new Image<Xyz, byte>(mat.Bitmap);  96 public static Image<Ycc, Byte> Yccimg = new Image<Ycc, byte>(mat.Bitmap);  97 public static Image<Gray, Byte> Grayimg = new Image<Gray, byte>(mat.Bitmap);  98 Image<Gray, Byte>[] imagesHsvs = imageHsv.Split();//分解成H、S、V三部分其他相同  99 //高斯濾波實現
100 CvInvoke.GaussianBlur(ma, ma, new Size(5, 5), 4); 101 //形態學閉運算,先膨脹后腐蝕 Others.matWithPhi(by)自定義模型
102 CvInvoke.MorphologyEx(ma, ma, Emgu.CV.CvEnum.MorphOp.Close, Others.matWithPhi(by), new Point(-1, -1), 3, Emgu.CV.CvEnum.BorderType.Default, new MCvScalar(0, 0, 0)); 103 CvInvoke.MedianBlur(ma, ma, 5);//中值濾波實現
104 CvInvoke.PutText(ma05, "G num: 1", new Point(10, 100), FontFace.HersheyComplex, 0.5, new MCvScalar(255)); //指定坐標(10, 100)顯示文字,中文亂碼,
105 VectorOfPoint vp = new VectorOfPoint(); 106 CvInvoke.ConvexHull(pointof, vp);////查找最小外接矩形cvInpaint
107 double dou = CvInvoke.ContourArea(vp, false);  //計算面積
108 VectorOfPoint vect = new VectorOfPoint(); 109 CvInvoke.FindNonZero(ma, vect); //獲取非0的點
110 Mat maSave1 = ma5.Clone();//備份 保留原有圖片
111 CvInvoke.AdaptiveThreshold(ma, mas, 255, AdaptiveThresholdType.GaussianC, Emgu.CV.CvEnum.ThresholdType.Binary, 3, 0);//查找最適合二值圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM