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));
enum函数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);
27int ksize = contours.Size;//获取连通区域的个数。
28 VectorOfPoint contour = contours[i];//获取独⽴的连通轮廓
29 Rectangle rect = CvInvoke.BoundingRectangle(contour);//提取最外部矩形。
30double 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>
60public 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//计算直⽅图数据。
65float[] data = dense.GetBinValues();
66float[] data2 = dense.GetBinValues();
67//获得直⽅图数据。
68/*** 进⾏数据归⼀化到[0,256]区域内并且绘制直⽅图***/
69float max = data[0]; //最⼤值
70for (int j = 1; j < data.Length; j++)
71            {
72if (data[j] > max)
73                {
74                    max = data[j];
75                }
76            }
77float Sum = data2.ToList().Sum();
78float FloCount = 0;
79for (int k = 0; k < data.Length; k++)
80            {
81                data[k] = data[k] * 256 / max;
82                FloCount += data2[k];
83if (FloCount / Sum >= 0.95)
84                {
85                    huidu = k;
86break;
87                }
88            }
89}
90//各种颜⾊空间 Hsv/Rgb/Hls/Xyz/Ycc/Gray
91public static Image<Hsv, Byte> imageHsv=new Image<Hsv, byte>(mat.Bitmap);
92public static Image<Rgb, Byte> Rgbimg = new Image<Rgb, byte>(mat.Bitmap);
93public static Image<Hls, Byte> Hlsimg = new Image<Hls, byte>(mat.Bitmap);
94public static Image<Xyz, Byte> Xyzimg = new Image<Xyz, byte>(mat.Bitmap);
95public static Image<Ycc, Byte> Yccimg = new Image<Ycc, byte>(mat.Bitmap);
96public static Image<Gray, Byte> Grayimg = new Image<Gray, byte>(mat.Bitmap);
97 Image<Gray, Byte>[] imagesHsvs = imageHsv.Split();//分解成H、S、V三部分其他相同
98//⾼斯滤波实现
99 CvInvoke.GaussianBlur(ma, ma, new Size(5, 5), 4);
100//形态学闭运算,先膨胀后腐蚀  Others.matWithPhi(by)⾃定义模型
101 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)); 102 CvInvoke.MedianBlur(ma, ma, 5);//中值滤波实现
103 CvInvoke.PutText(ma05, "G num: 1", new Point(10, 100), FontFace.HersheyComplex, 0.5, new MCvScalar(255)); //指定坐标(10, 100)显⽰⽂字,中⽂乱码,
104 VectorOfPoint vp = new VectorOfPoint();
105 CvInvoke.ConvexHull(pointof, vp);////查最⼩外接矩形cvInpaint
106double dou = CvInvoke.ContourArea(vp, false);  //计算⾯积
107 VectorOfPoint vect = new VectorOfPoint();
108 CvInvoke.FindNonZero(ma, vect); //获取⾮0的点
109 Mat maSave1 = ma5.Clone();//备份保留原有图⽚
110 CvInvoke.AdaptiveThreshold(ma, mas, 255, AdaptiveThresholdType.GaussianC, Emgu.CV.CvEnum.ThresholdType.Binary, 3, 0);//查最适合⼆值图