opencvsharp 轮廓绘制踩的坑1

轮廓绘制主要用到findcontours和drawcontours,在工程项目中这个功能应该会普遍作为后续功能的基础而被使用,想用opencvsharp做一个圆查找的功能,然后霍夫圆检测的精度貌似不高,在搜索资料后,尝试自己弄一下轮廓绘制,先弄下画轮廓的这部分

要点1:

拓扑结构想要获取全部轮廓用RetrievalModes.Tree, ContourApproximationModes.ApproxNone

要点2:

要在灰度图上显示有颜色的轮廓,要先将灰度图转化为RGB图

 

程序如下:

 

 

   Mat src = (Mat)userdata;
            Mat a = new Mat();

            src.CopyTo(a);
            Cv2.Threshold(a, a, 127, 255, ThresholdTypes.Binary);
            //Cv2.Canny(a, a, pos*10, 255);
            HierarchyIndex[] hierarchy ;
            OpenCvSharp.Point[][] coutours;

            // 形态学操作    
            Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3), new OpenCvSharp.Point(-1, -1));
            // 构建形态学操作的结构元    
            //morphologyEx(binary_img, binary_img, MORPH_CLOSE, kernel, Point(-1, -1));
            Cv2.MorphologyEx(a, a, MorphTypes.Close, kernel, new OpenCvSharp.Point(-1, -1));
            //闭操作    
            kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(3, 3), new OpenCvSharp.Point(-1, -1));
            // 构建形态学操作的结构元
            Cv2.MorphologyEx(a, a, MorphTypes.Open, kernel, new OpenCvSharp.Point(-1, -1));
            Cv2.FindContours(a, out coutours,  out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxNone);


            // int i= hierarchy;
            Mat img_rgb = new Mat();
            Cv2.CvtColor(a, img_rgb,ColorConversionCodes.GRAY2BGR);

           Cv2.DrawContours(img_rgb, coutours, -1,new Scalar(0,255,0),3);
           Cv2.ImShow("圆查找", img_rgb);

要判断轮廓是否对称,可以按照以下步骤进行: 1. 用 OpenCVSharp 读取图像并转换为灰度图像。 2. 使用 Canny 边缘检测算法提取图像的边缘。 3. 使用 findContours 函数找到轮廓。 4. 对于每个轮廓,计算其最小外接矩形(使用 minAreaRect 函数),并计算其中心点坐标和长宽。 5. 对于每个轮廓,从其中心点开始,根据其长宽计算出两个端点的坐标,然后计算两个端点之间的距离。如果两个端点之间的距离相等,则说明该轮廓是对称的。 6. 最后,将所有对称的轮廓绘制出来,以便观察和分析。 代码示例: ```csharp Mat src = new Mat("image.jpg", ImreadModes.Grayscale); Mat edges = new Mat(); Cv2.Canny(src, edges, 100, 200); Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(edges, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple); Mat result = new Mat(src.Size(), MatType.CV_8U, Scalar.Black); for (int i = 0; i < contours.Length; i++) { RotatedRect rect = Cv2.MinAreaRect(contours[i]); Point2f[] vertices = rect.Points(); float dist1 = Cv2.Norm(vertices[0] - vertices[1]); float dist2 = Cv2.Norm(vertices[1] - vertices[2]); if (Math.Abs(dist1 - dist2) < 1e-3) { Cv2.DrawContours(result, contours, i, Scalar.White, -1); } } Cv2.ImShow("Result", result); Cv2.WaitKey(); ``` 上述代码中,我们使用了 Canny 边缘检测算法和 findContours 函数来找到轮廓,然后对每个轮廓计算最小外接矩形,并根据其长宽计算出两个端点的坐标,最后判断两个端点之间的距离是否相等来确定轮廓是否对称。最后,我们将所有对称的轮廓绘制在一张新的图像上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值