C#中OpenCVSharp实现轮廓检测
作者:IT_BOY__ 发布时间:2022-04-03 17:38:11
标签:C#,OpenCVSharp,轮廓检测
OpenCv提供了函数 findContours()用于对物体轮廓进行检测,该函数实现算法是由S.suzuki K.Abe于1985年发表的。OpenCVSharp封装了这个函数,有2个参数(contours,hierarchy)要做特别的说明。
public static void FindContours(InputOutputArray image, out Point[][] contours,
out HierarchyIndex[] hierarchy, RetrievalModes mode,
ContourApproximationModes method, Point? offset = null);
解析:contours 的类型是Point[][],它相当于OpenCV中的Vector<Vector<Point>> contours
,存储多个轮廓,每个轮廓是由若干个点组成,可以在该函数前声明Point[][] contours;
,在C#中没有赋值的变量在用的时候是不允许的,因为它是输出的结果,可以不需要给它new空间,但必须在函数的参数中声明是out;参数hierarchy为包含图像拓扑结构的信息,它是HierarchyIndex[]类型,这是输入的结果,同样要在函数的参数中声明为out。具体代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using OpenCvSharp.Extensions;
namespace OpenCvSharp_03
{
class Program
{
static void Main(string[] args)
{
Mat srcImage = Cv2.ImRead(@"D:\MyData\circle.jpg");
Mat dst_Image = MyFindContours(srcImage);
Cv2.ImShow("srcImage:", srcImage);
Cv2.ImShow("contours", dst_Image);
Cv2.WaitKey();
}
public static Mat MyFindContours(Mat srcImage)
{
//转化为灰度图
Mat src_gray = new Mat();
Cv2.CvtColor(srcImage, src_gray, ColorConversionCodes.RGB2GRAY);
//滤波
Cv2.Blur(src_gray, src_gray, new Size(3, 3));
//Canny边缘检测
Mat canny_Image = new Mat();
Cv2.Canny(src_gray, canny_Image, 100, 200);
//获得轮廓
Point[][] contours;
HierarchyIndex[] hierarchly;
Cv2.FindContours(canny_Image,out contours,out hierarchly, RetrievalModes.Tree,ContourApproximationModes.ApproxSimple,new Point(0,0));
//将结果画出并返回结果
Mat dst_Image = Mat.Zeros(canny_Image.Size(),srcImage.Type());
Random rnd = new Random();
for (int i = 0; i < contours.Length; i++)
{
Scalar color = new Scalar(rnd.Next(0,255),rnd.Next(0,255),rnd.Next(0,255));
Cv2.DrawContours(dst_Image, contours, i, color, 2,LineTypes.Link8, hierarchly);
}
return dst_Image;
}
}
}
我封装好了MyFindContours()这个函数,方便大家调用进行测试
测试结果如下:
来源:https://blog.csdn.net/IT_BOY__/article/details/91041004


猜你喜欢
- 本文实例讲述了Android实现为Notification加上一个进度条的方法。分享给大家供大家参考,具体如下:package com.no
- Java调用Linux系统命令有时候,我们在使用Java做一些操作时,可能性能上并不能达到我们满意的效果,就拿最近工作中的遇到的一个场景来说
- 1. 概述官方JavaDocsApi:javax.swing.JCheckBoxJCheckBox,复选框。JCheckBox 常用构造方法
- 初步的想法是用两个recordset,一个从SQL取数据,一个往Access里面插入数据 因为表的字段比较多,所以只好用一个循环while
- 从一个Stream中过滤null值复习一个Stream 包含 null 数据的例子.Java8Examples.javapackage co
- 本文涉及3个基本点:1、因为很多公司的内网都设有代理,浏览器通过ip与port上网,而java代码模拟http get方式同样需要外网代理;
- 简介因为目前做的项目查询提供的接口都使用GraphQL替代典型的REST API,所以有必要去对它进行了解和源码的阅读。本篇主要大致了解下G
- 题目:给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路
- Spring Data JPA查询方式及方法名查询规则Spring Data JPA通过解析方法名创建查询在执行查询时,Spring Dat
- package com.jjinfo.common.util; import java.util.Arrays; import java.u
- TextView加载字体包在 Android 中,若需要使得某个TextView加载字体包,使用以下方式即可: Typeface typeF
- 使用RecyclerView越来越多了,基本可以不用listview了,但是这个新的控件谷歌官方似乎设计的没有想listview那样方便快捷
- Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。Field 成员变量的介
- 判断某字符串是否为空,为空的标准是str==null或str.length()==01.下面是StringUtils判断是否为空的示例:St
- 1.准备工作首先实现识别数字等字符,我们要知道需要采用OCR (Optical Character Recognition,光学字符识别)来
- java 对象的克隆一、对象的浅克隆(1)需要克隆类需要重写Object类的clone方法,并且实现Cloneable接口(标识接口,无需实
- 装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。优点:装饰类和被装饰类可以独立发展,不会相互耦合,
- 1、Hello, KotlinBugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验
-   考虑到直接讲实现一个类Task库思维有点跳跃,所以本节主要讲解Async/Await的本质作用(解决
- 做Android开发的程序员必须知道android客户端应该如何与服务端进行交互,这里主要介绍的是使用json数据进行交互。服务端从数据库查