开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 30619|回复: 0
收起左侧

[C#图文教程] OpenCvSharp的学习之旅 lesson07----TheOthers

[复制链接]
发表于 2019-9-3 20:31:53 | 显示全部楼层 |阅读模式   重庆市重庆市


前六lesson已经包含了常规手段....所以lesson07就选择三个案例作为结束
本套学习心得,虽不是什么高瞻远瞩,但依旧禁止任何形式的转载or复制(含非商业),如需任何形式的转载or复制,还请论坛留言通知我一下下....

一/提取文字


  1. /// <summary>
  2.         /// 得到文字
  3.         /// </summary>
  4.         public static void GetText(string path)
  5.         {
  6.             using (Mat zx61 = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
  7.             using (Mat zx6161 = new Mat())
  8.             using (Mat binImage = new Mat())
  9.             using (Mat result = new Mat())
  10.             {
  11.                 Cv2.CvtColor(zx61, zx6161, ColorConversionCodes.BGR2GRAY);
  12.                 //对数组应用自适应阈值。包含二值图像等多种操作
  13.                 Cv2.AdaptiveThreshold(~zx6161, binImage, 255, AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, 15, -2);
  14.                 InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(6,6), new Point(-1, -1));
  15.                 Cv2.MorphologyEx(binImage, result, MorphTypes.Open, kernel, new Point(-1, -1));
  16.                 Cv2.BitwiseNot(result, result);
  17.                 using (new Window("Result", WindowMode.AutoSize, result))
  18.                 using (new Window("zx61", WindowMode.AutoSize, zx61))
  19.                 {
  20.                     Cv2.WaitKey();
  21.                 }
  22.             }
  23.         }
复制代码

704.jpg


二/利用Canny算子进行边缘提取----这段抄的...


Canny算法步骤:
1.高斯模糊 — GaussianBlur
2.灰度转化 —CvtColor
3.计算梯度 — Sobel / Scharr
4.非最大信号抑制:边缘信号很强,但只能有一个信号(边缘只能是一条线,而不能是一个有宽度的面),对其他的非边缘信号进行压制(在梯度方向上,如果不是最大信号就剔除)。
5.高低阈值输出二值图像。


  1. //Canny算子 边缘提取----这段抄的...
  2.         static Mat src = new Mat();
  3.         static Mat dst = new Mat();
  4.         static Mat gray = new Mat();
  5.         static Mat output = new Mat();
  6.         static int minVal = 50;
  7.         static int maxVal = 255;
  8.         const string outputName = "Canny Result";
  9.         public static void Canny(string path)
  10.         {
  11.             src = new Mat(path, ImreadModes.AnyColor);
  12.             dst = new Mat(src.Size(), src.Type());
  13.             new Window("SRC", WindowMode.AutoSize, src);
  14.             src.CopyTo(dst);

  15.             Cv2.CvtColor(dst, gray, ColorConversionCodes.RGB2GRAY); //转为灰度图(必须转)
  16.             new Window(outputName, WindowMode.AutoSize);
  17.             Cv2.Blur(gray, gray, new Size(3, 3), new Point(-1, -1), BorderTypes.Default);//模糊处理(降低噪点)

  18.             CvTrackbarCallback2 CannyDome = new CvTrackbarCallback2(CallBarck_CannyDome);
  19.             CvTrackbar cvt = new CvTrackbar("Bar :", outputName, minVal, maxVal, CallBarck_CannyDome, gray);
  20.             //Cv2.Canny(gray, dst, 100, 255, 3,true);

  21.             //using (new Window("DST", WindowMode.AutoSize, dst))
  22.             //using (new Window("SRC", WindowMode.AutoSize, src))
  23.             //{
  24.             Cv2.WaitKey();
  25.         }


  26.         /// <summary>
  27.         /// 委托函数
  28.         /// </summary>
  29.         /// <param name="pos">变化的量</param>
  30.         /// <param name="userdata">传入的数据对象</param>
  31.         private static void CallBarck_CannyDome(int pos, object userdata)
  32.         {
  33.             Mat m = (Mat)userdata;
  34.             Cv2.Canny(m, output, pos, pos * 2, 3, true);
  35.             dst = new Mat(src.Size(), src.Type());
  36.             src.CopyTo(dst, output); //拷贝:
  37.             Cv2.ImShow(outputName, dst);
  38.         }
复制代码
703.jpg 702.jpg

三/霍夫变换圆检测


步骤
1:因为霍夫变换对噪声比较敏感,所以首先要对图像做中值滤波。
2:基于效率考虑,OpenCv中实现霍夫变换圆检测时基于图像梯度的实现,分为两步:
a ;检测边缘发现可能的圆心。
b ;基于第一步的基础上从候选圆心开始计算最佳半径大小。


  1. /// <summary>
  2.         /// 圆检测
  3.         /// </summary>
  4.         /// <param name="path"></param>
  5.         public static void HoughCircles(string path)
  6.         {
  7.             using (Mat zx61 = new Mat(path, ImreadModes.AnyColor ))
  8.             using (Mat zx6161 = new Mat())
  9.             {      
  10.                 Mat m1 = new Mat();
  11.                 Cv2.MedianBlur(zx61, m1, 3); //  ksize必须大于1且是奇数
  12.                 Mat m2 = new Mat();
  13.                 Cv2.CvtColor(m1, m2, ColorConversionCodes.BGR2GRAY);
  14.                 //霍夫圆检测:使用霍夫变换查找灰度图像中的圆。
  15.                 /*
  16.                  * 参数:
  17.                  *      1:输入参数: 8位、单通道、灰度输入图像
  18.                  *      2:实现方法:目前,唯一的实现方法是HoughCirclesMethod.Gradient
  19.                  *      3: dp      :累加器分辨率与图像分辨率的反比。默认=1
  20.                  *      4:minDist: 检测到的圆的中心之间的最小距离。(最短距离-可以分辨是两个圆的,否则认为是同心圆-                            src_gray.rows/8)
  21.                  *      5:param1:   第一个方法特定的参数。[默认值是100] canny边缘检测阈值低
  22.                  *      6:param2:   第二个方法特定于参数。[默认值是100] 中心点累加器阈值 – 候选圆心
  23.                  *      7:minRadius: 最小半径
  24.                  *      8:maxRadius: 最大半径
  25.                  *
  26.                  */
  27.                 CircleSegment[] cs = Cv2.HoughCircles(m2, HoughMethods.Gradient, 1, 80, 70, 30, 10, 60);
  28.                 zx61.CopyTo(zx6161);
  29.                 // Vec3d vec = new Vec3d();
  30.                 for (int i = 0; i < cs.Count(); i++)
  31.                 {
  32.                     //画圆
  33.                     Cv2.Circle(zx6161, (int)cs[i].Center.X, (int)cs[i].Center.Y, (int)cs[i].Radius, new Scalar(0, 0, 255), 2, LineTypes.AntiAlias);
  34.                     //加强圆心显示
  35.                     Cv2.Circle(zx6161, (int)cs[i].Center.X, (int)cs[i].Center.Y, 3, new Scalar(0, 0, 255), 2, LineTypes.AntiAlias);
  36.                 }
  37.                 using (new Window("OutputImage", WindowMode.AutoSize, zx6161))
  38.                 using (new Window("InputImage", WindowMode.AutoSize, zx61))
  39.                 {
  40.                     Cv2.WaitKey();
  41.                 }
  42.             }
  43.         }
复制代码
701.jpg

lesson4-7汇总: zxocs.rar (3.38 KB, 下载次数: 12)

评分

参与人数 2好评 +2 精币 +68 收起 理由
翰墨 + 1 + 2 共同努力,共同进步
老郭 + 1 + 66 感谢发布原创作品,精易因你更精彩!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表