前六lesson已经包含了常规手段....所以lesson07就选择三个案例作为结束
本套学习心得,虽不是什么高瞻远瞩,但依旧禁止任何形式的转载or复制(含非商业),如需任何形式的转载or复制,还请论坛留言通知我一下下....
一/提取文字
- /// <summary>
- /// 得到文字
- /// </summary>
- public static void GetText(string path)
- {
- using (Mat zx61 = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
- using (Mat zx6161 = new Mat())
- using (Mat binImage = new Mat())
- using (Mat result = new Mat())
- {
- Cv2.CvtColor(zx61, zx6161, ColorConversionCodes.BGR2GRAY);
- //对数组应用自适应阈值。包含二值图像等多种操作
- Cv2.AdaptiveThreshold(~zx6161, binImage, 255, AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, 15, -2);
- InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(6,6), new Point(-1, -1));
- Cv2.MorphologyEx(binImage, result, MorphTypes.Open, kernel, new Point(-1, -1));
- Cv2.BitwiseNot(result, result);
- using (new Window("Result", WindowMode.AutoSize, result))
- using (new Window("zx61", WindowMode.AutoSize, zx61))
- {
- Cv2.WaitKey();
- }
- }
- }
复制代码
二/利用Canny算子进行边缘提取----这段抄的...
Canny算法步骤:
1.高斯模糊 — GaussianBlur
2.灰度转化 —CvtColor
3.计算梯度 — Sobel / Scharr
4.非最大信号抑制:边缘信号很强,但只能有一个信号(边缘只能是一条线,而不能是一个有宽度的面),对其他的非边缘信号进行压制(在梯度方向上,如果不是最大信号就剔除)。
5.高低阈值输出二值图像。
- //Canny算子 边缘提取----这段抄的...
- static Mat src = new Mat();
- static Mat dst = new Mat();
- static Mat gray = new Mat();
- static Mat output = new Mat();
- static int minVal = 50;
- static int maxVal = 255;
- const string outputName = "Canny Result";
- public static void Canny(string path)
- {
- src = new Mat(path, ImreadModes.AnyColor);
- dst = new Mat(src.Size(), src.Type());
- new Window("SRC", WindowMode.AutoSize, src);
- src.CopyTo(dst);
- Cv2.CvtColor(dst, gray, ColorConversionCodes.RGB2GRAY); //转为灰度图(必须转)
- new Window(outputName, WindowMode.AutoSize);
- Cv2.Blur(gray, gray, new Size(3, 3), new Point(-1, -1), BorderTypes.Default);//模糊处理(降低噪点)
- CvTrackbarCallback2 CannyDome = new CvTrackbarCallback2(CallBarck_CannyDome);
- CvTrackbar cvt = new CvTrackbar("Bar :", outputName, minVal, maxVal, CallBarck_CannyDome, gray);
- //Cv2.Canny(gray, dst, 100, 255, 3,true);
- //using (new Window("DST", WindowMode.AutoSize, dst))
- //using (new Window("SRC", WindowMode.AutoSize, src))
- //{
- Cv2.WaitKey();
- }
- /// <summary>
- /// 委托函数
- /// </summary>
- /// <param name="pos">变化的量</param>
- /// <param name="userdata">传入的数据对象</param>
- private static void CallBarck_CannyDome(int pos, object userdata)
- {
- Mat m = (Mat)userdata;
- Cv2.Canny(m, output, pos, pos * 2, 3, true);
- dst = new Mat(src.Size(), src.Type());
- src.CopyTo(dst, output); //拷贝:
- Cv2.ImShow(outputName, dst);
- }
复制代码
三/霍夫变换圆检测
步骤
1:因为霍夫变换对噪声比较敏感,所以首先要对图像做中值滤波。
2:基于效率考虑,OpenCv中实现霍夫变换圆检测时基于图像梯度的实现,分为两步:
a ;检测边缘发现可能的圆心。
b ;基于第一步的基础上从候选圆心开始计算最佳半径大小。
- /// <summary>
- /// 圆检测
- /// </summary>
- /// <param name="path"></param>
- public static void HoughCircles(string path)
- {
- using (Mat zx61 = new Mat(path, ImreadModes.AnyColor ))
- using (Mat zx6161 = new Mat())
- {
- Mat m1 = new Mat();
- Cv2.MedianBlur(zx61, m1, 3); // ksize必须大于1且是奇数
- Mat m2 = new Mat();
- Cv2.CvtColor(m1, m2, ColorConversionCodes.BGR2GRAY);
- //霍夫圆检测:使用霍夫变换查找灰度图像中的圆。
- /*
- * 参数:
- * 1:输入参数: 8位、单通道、灰度输入图像
- * 2:实现方法:目前,唯一的实现方法是HoughCirclesMethod.Gradient
- * 3: dp :累加器分辨率与图像分辨率的反比。默认=1
- * 4:minDist: 检测到的圆的中心之间的最小距离。(最短距离-可以分辨是两个圆的,否则认为是同心圆- src_gray.rows/8)
- * 5:param1: 第一个方法特定的参数。[默认值是100] canny边缘检测阈值低
- * 6:param2: 第二个方法特定于参数。[默认值是100] 中心点累加器阈值 – 候选圆心
- * 7:minRadius: 最小半径
- * 8:maxRadius: 最大半径
- *
- */
- CircleSegment[] cs = Cv2.HoughCircles(m2, HoughMethods.Gradient, 1, 80, 70, 30, 10, 60);
- zx61.CopyTo(zx6161);
- // Vec3d vec = new Vec3d();
- for (int i = 0; i < cs.Count(); i++)
- {
- //画圆
- 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);
- //加强圆心显示
- Cv2.Circle(zx6161, (int)cs[i].Center.X, (int)cs[i].Center.Y, 3, new Scalar(0, 0, 255), 2, LineTypes.AntiAlias);
- }
- using (new Window("OutputImage", WindowMode.AutoSize, zx6161))
- using (new Window("InputImage", WindowMode.AutoSize, zx61))
- {
- Cv2.WaitKey();
- }
- }
- }
复制代码
lesson4-7汇总:
zxocs.rar
(3.38 KB, 下载次数: 12)
|