• 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);//查找最适合二值图
  • 相关阅读:
    System.Text.Json 自定义Converter实现时间转换
    WeihanLi.Npoi 根据模板导出Excel
    用 F# 手写 TypeScript 转 C# 类型绑定生成器
    【C#】写文件时如何去掉编码前缀
    一个支持 CodeFirst/DbFirst/ModelFirst 的数据库小工具
    C#设计模式学习笔记:(15)迭代器模式
    【WPF学习】第四十六章 效果
    C# 如何实现完整的INI文件读写类
    Blend 修改TreeViewItem样式
    C#设计模式学习笔记:(16)观察者模式
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12170848.html
Copyright © 2020-2023  润新知