C# OpenCVSharp 记录 之三 边缘(Canny)检测、直线、圆检测

1、OpencvSharp边缘检测 Cv2.Canny()

Canny()法最明显的创新,就是将单个的边缘候选像素加入轮廓。边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法。

 private void Canny()
        {
            int hole = 0;
            if (!int.TryParse(txtBoxCannyHole.Text, out hole))
            {
                return;
            }
            try
            {
                Cv2.Canny(src_img, dst, tkBarCannyMin.Value, tkBarCannyMax.Value, hole, rbBtnTrue.Checked);  
                //cannny。参数:1:src_img:8 bit 输入图像;2:dst输出边缘图像,一般是二值图像,背景是黑色;3:tkBarCannyMin.Value低阈值。值越大,找到的边缘越少;4:tkBarCannyMax.Value高阈值;5:hole表示应用Sobel算子的孔径大小,其有默认值3;6:rbBtnTrue.Checked计算图像梯度幅值的标识,有默认值false。
                //低于阈值1的像素点会被认为不是边缘;
                //高于阈值2的像素点会被认为是边缘;
                //在阈值1和阈值2之间的像素点,若与一阶偏导算子计算梯度得到的边缘像素点相邻,则被认为是边缘,否则被认为不是边缘。
                picBoxShowDel.Image = dst.ToBitmap();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

C# OpenCVSharp 记录 之三 边缘(Canny)检测、直线、圆检测_第1张图片C# OpenCVSharp 记录 之三 边缘(Canny)检测、直线、圆检测_第2张图片

2、OpencvSharp直线检测 Cv2.HoughLinesP()圆检测Cv2.HoughCircles()

霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析(image analysis)、计算机视觉(computer vision)以及数位影像处理(digital image processing)。霍夫变换是用来辨别找出物件中的特征,例如:线条。他的算法流程大致如下,给定一个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执行投票来决定物体的形状,而这是由累加空间(accumulator space)里的局部最大值(local maximum)来决定。

霍夫变换-直线检测

   private void HoughLinesP()
        {
            try
            {
                LineSegmentPoint[] lineSegmentPoint;
                src_img.CopyTo(dst);
                lineSegmentPoint = Cv2.HoughLinesP(dst, tkBarFBL.Value, Cv2.PI / 180, tkBarThreshold.Value, tkBarMinLength.Value, tkBarMaxGap.Value);
                /*使用概率霍夫变换查找二进制图像中的线段。最终输出的是直线的两个点坐标,返回值类型:LineSegmentPoint[]
                参数:1:dst输入图像,8位、单通道、二进制源图像。
                  2:tkBarFBL.Value累加器的距离分辨率(以像素为单位),(生成极坐标时的像素扫描的步长)
                  3  累加器的角度分辨率(以弧度为单位) (生成极坐标的角度步长,一般为 1°)
                  4:tkBarThreshold.Value阈值参数,只有获取足够交点的极坐标才能看作直线
                  5:tkBarMinLength.Value,最小线长度。比这短的线段将被拒绝。[默认值为0]
                  6 :tkBarMaxGap.Value同一条线上的点之间连接它们的最大允许间隙。[默认值为0] */             
                Mat ndst = new Mat();
                reList[0].CopyTo(ndst);
                for (int i = 0; i < lineSegmentPoint.Length; i++)
                {
                    Cv2.Line(ndst, lineSegmentPoint[i].P1, lineSegmentPoint[i].P2, Scalar.Red, 6);   //依据点集画线
                }
                picBoxShowDel.Image = ndst.ToBitmap();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
           
        }

C# OpenCVSharp 记录 之三 边缘(Canny)检测、直线、圆检测_第3张图片


        //霍夫变换之 圆检测      
        private void HoughCircle()
        {
            try
            {
                src_img.CopyTo(dst);
                CircleSegment[] circleSegment;
                circleSegment = Cv2.HoughCircles(dst, HoughModes.Gradient, tkBarDP.Value, tkBarMinDist.Value, tkBarParam1.Value, tkBarParam2.Value, tkBarMinRadius.Value, tkBarMaxRadius.Value);
                //霍夫圆检测:使用霍夫变换查找灰度图像中的圆。
                /*
                * 参数:
                *      1:输入参数:8位、单通道、灰度输入图像
                *      2:实现方法
                *      3: dp     :累加器分辨率与图像分辨率的反比。默认=1
                *      4:minDist: 检测到的圆的中心之间的最小距离。
                *      5:param1:   第一个方法特定的参数。[默认值是100]canny边缘检测阈值低
                *      6:param2:   第二个方法特定于参数。[默认值是100]中心点累加器阈值 – 候选圆心
                *      7:minRadius: 最小半径
                *      8:maxRadius: 最大半径  */
                Mat ndst = new Mat();
                reList[0].CopyTo(ndst);
                for (int i = 0; i < circleSegment.Count(); i++)
                {
                    //画圆、圆心
                    Cv2.Circle(ndst, (int)circleSegment[i].Center.X, (int)circleSegment[i].Center.Y, (int)circleSegment[i].Radius, Scalar.Red, 2, LineTypes.AntiAlias);
                    Cv2.Circle(ndst, (int)circleSegment[i].Center.X, (int)circleSegment[i].Center.Y, 3, Scalar.Red, 2, LineTypes.AntiAlias);
                }
                picBoxShowDel.Image = ndst.ToBitmap();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);               
            }           
        }

C# OpenCVSharp 记录 之三 边缘(Canny)检测、直线、圆检测_第4张图片

源程序链接:https://download.csdn.net/download/xaiqpl/20097067

你可能感兴趣的:(opencv,c#,.net)