c# OpenCvSharp 轮廓绘制六步骤你学会了吗(六)

news/2024/7/21 7:12:48 标签: opencv, 计算机视觉, 图像处理

轮廓绘制通过下面6个步骤得出轮廓

  1. 读取图像 Cv2.ImRead();
  2. 将图像转换为灰度图像 Cv2.CvtColor();
  3. 对图像进行模糊处理 滤波Cv2.Blur();
  4. 边缘检测Canny();
  5. 查找轮廓Cv2.FindContours();
  6. 绘制轮廓Cv2.DrawContours();

图例(自娱自乐一下上个扑克牌玩一下)

 // 1、读取图像
 Mat image = Cv2.ImRead("0.jpg", ImreadModes.Color);

 // 2、 将图像转换为灰度图像
 Mat src_gray = new Mat();
 Cv2.CvtColor(image, src_gray, ColorConversionCodes.BGR2GRAY);

 // 3、 滤波
 Cv2.Blur(src_gray, src_gray, new OpenCvSharp.Size(3, 3));
 // 4、Canny边缘检测
 Mat canny_Image = new Mat();
 // 输入、输出、最小阀值、最大阀值
 Cv2.Canny(src_gray, canny_Image, 100, 200);

 //5、查找轮廓
 // 寻找轮廓
 OpenCvSharp.Point[][] contours;
 HierarchyIndex[] hierarchy;

 Cv2.FindContours(canny_Image, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxNone, new OpenCvSharp.Point(0, 0));
 // 将结果画出并返回结果
 Mat dst_Image = Mat.Zeros(canny_Image.Size(), image.Type());
 for (int i = 0; i < contours.Length; i++)
 {
     // 轮廓的颜色为绿色
     Scalar color = new Scalar(0, 255, 0);
     Cv2.DrawContours(dst_Image, contours, i, color, 2, LineTypes.Link8, hierarchy);
     
 }
 Cv2.ImShow("dst_Image", dst_Image); // 显示图像
 Cv2.WaitKey(0);

一、读取图像 Cv2.ImRead();不介绍了

二、将图像转换为灰度图像 Cv2.CvtColor();不介绍了

三、滤波 Cv2.Blur()

用于对图像进行模糊处理。

Cv2.Blur(src, dst, ksize, anchor,borderType,borderValue)

参数解释
src输入图像,可以是单通道或多通道图像。
dst输出图像,与输入图像具有相同的尺寸和深度。
ksize模糊核的大小。它是一个2D的Size结构,指定了水平和垂直方向上的核大小。它的宽度和高度必须是正奇数,例如(3,3),(5,5)等。
anchor模糊核的锚点位置,默认为(-1,-1),表示核的中心点。
borderType界模式,默认为BorderType.Default,表示使用默认边界模式
borderValue边界值,当边界模式为BorderType.Constant时使用,默认为Scalar(0)。


 new OpenCvSharp.Size(3, 3)效果

四、边缘检测cv2.Canny()

Canny边缘检测算法的原理是:首先对图像进行高斯滤波,然后通过Sobel算子计算图像的梯度,再通过非极大值抑制来提取局部最大值作为边缘点,最后通过双阈值检测来连接边缘点。

 cv2.Canny(image,edges,threshold1,threshold2,apertureSize,L2gradient)

参数解释
image输入图像,可以是单通道灰度图像或者是3通道彩色图像。
edges输出的边缘图像,是一个单通道二值图像。
threshold1第一个阈值,用于边缘强度的低阈值过滤。
threshold2第二个阈值,用于边缘强度的高阈值过滤。
apertureSizeSobel算子的孔径大小,默认为3。
L2gradient一个布尔值,指定计算梯度幅值时是否使用L2范数,默认为false。

 Cv2.Blur(src_gray, src_gray, new OpenCvSharp.Size(3, 3)) 效果

五、查找轮廓 Cv2.FindContours() 

用于检测图像中的轮廓,即找到图像中所有的连续的点的集合。该函数需要输入二值化图像,并且图像中的背景色为黑色,前景色为白色。函数会返回一个包含所有轮廓的列表,每个轮廓都是一个由点组成的数组。

Cv2.FindContours(image, mode, method[, contours[, hierarchy[, offset]]])

 FindContours(InputArray image, out Point[][] contours, out HierarchyIndex[] hierarchy, RetrievalModes mode, ContourApproximationModes method, Point? offset = null) 

注意事项:

  • 输入图像必须是二值图像,即只包含黑白两种像素值。
  • 轮廓检测只能应用于二值图像,因此在应用函数之前,通常需要先进行图像阈值化或其他图像处理操作。

六、绘制轮廓Cv2.DrawContours()

在图像上绘制检测到的轮廓,通过指定的颜色和线宽度来显示图像中的边界。

  public static void DrawContours(InputOutputArray image, IEnumerable<IEnumerable<Point>> contours, int contourIdx, Scalar color, int thickness = 1, LineTypes lineType = LineTypes.Link8, IEnumerable<HierarchyIndex>? hierarchy = null, int maxLevel = int.MaxValue, Point? offset = null)

 扑克打完了看看最终效果如下:

通过掌握这六个步骤,你可以在C#中使用OpenCvSharp实现轮廓绘制。祝你成功!

 c# OpenCV文章目录

c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)

c# OpenCV 基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)
c# OpenCV 图像裁剪、调整大小、旋转、透视(三)

c#OpenCV 读取、显示和写入图像(二)

c# OpenCV安装(一)


http://www.niftyadmin.cn/n/5283750.html

相关文章

【哲学 学习笔记01】哲学家及其思想汇总

文章目录 一、声明二、认知论领域休谟著作休谟问题 三、人生的意义&#xff08;暂时不知道属于哲学哪个领域&#xff09;加缪著作 叔本华陀思妥耶夫斯基 一、声明 本帖持续更新&#xff01;本帖重在汇总&#xff0c;大部分具体内容都是东拼西凑复制来的&#xff0c;后续会进行…

Linux普通玩家,熟悉这些高频命令就行了

回想当时入门Linux时抱着鸟叔的私房菜啃&#xff0c;看了没几页就放弃了 如果主要从事算法相关工作&#xff0c;其实高频使用的命令就那么些&#xff0c;一起看看吧 用户相关 id – 显示用户的详细信息&#xff08;uid、gid和group&#xff09;last – 列出有关最近登录的信…

51单片机分支程序实验

一、实验内容 1.基本要求 掌握51汇编语言调试技巧&#xff1b;实现三个数(R5,R6,R7)&#xff08;初值为本人班级学号后六位&#xff0c;每两位以HEX格式填入一个寄存器&#xff09;中找出最大和最小值,最大值存到R3,最小值存到R4&#xff1b; 2.扩展要求 将数据从R5,R6,R7改…

说说对React refs 的理解?应用场景?

先了解&#xff0c;是什么&#xff1f; React 中的 Refs提供了一种方式&#xff0c;允许我们访问 DOM节点或在 render方法中创建的 React元素。 本质为ReactDOM.render()返回的组件实例&#xff0c;如果是渲染组件则返回的是组件实例&#xff0c;如果渲染dom则返回的是具体的do…

7-1 递归二路归并排序

7-1 递归二路归并排序 本题目要求读入N个整数&#xff0c;采用递归的二路归并排序法进行排序&#xff0c;输出前3轮排序后的结果。 输入格式: 输入不超过100的正整数N和N个整数&#xff08;空格分隔&#xff09;。 输出格式: 输出三行&#xff0c;第一行为第一轮排序结果&…

Led驱动框架代码编译与运行

一. 简介 上一篇文章实现了 Led驱动框架&#xff0c;文章地址如下&#xff1a; LED驱动框架代码的实现-CSDN博客 这里对上一篇实现的 Led驱动框架进行编译&#xff0c;然后在开发板上加载 Led驱动模块。 二. Led驱动框架代码编译与运行 1. 编译Led驱动框架代码 前面编写…

Github 2023-12-23 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-23统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目6C项目2C项目1Jupyter Notebook项目1HTML项目1Go项目1非开发语言项目1 免费API集体清单 创建周期…

facebook广告企业户对账户有什么要求

Facebook广告企业户对账户的要求如下&#xff1a; 企业账户只能通过代理商开户&#xff0c;需提供营业执照&#xff0c;个人FB账号&#xff0c;FB主页。广告充值&#xff0c;要通过代理商充值。企业广告账户操作要通过Facebook BM平台授权&#xff0c;开户前需自己先创建BM平台…