c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)
在C#中使用OpenCV进行图像处理时,可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。
- 斑点检测
- 边缘检测
- 轮廓检测
一、斑点检测(Blob)
斑点检测是指在图像中找到明亮或暗的小区域(通常表示为斑点),并标记它们的位置。可以使用OpenCV中的函数SimpleBlobDetector来实现斑点检测。该函数将图像转换为二进制图像,然后找到所有的轮廓,通过设置阈值来确定斑点的亮度范围。
SimpleBlobDetector.Params
//函数原型
public Params()
{Data = new WParams{thresholdStep = 10f,minThreshold = 50f,maxThreshold = 220f,minRepeatability = 2u,minDistBetweenBlobs = 10f,filterByColor = 1,blobColor = 0,filterByArea = 1,minArea = 25f,maxArea = 5000f,filterByCircularity = 0,minCircularity = 0.8f,maxCircularity = float.MaxValue,filterByInertia = 1,minInertiaRatio = 0.1f,maxInertiaRatio = float.MaxValue,filterByConvexity = 1,minConvexity = 0.95f,maxConvexity = float.MaxValue};
}
SimpleBlobDetector是OpenCV中用于检测二值图像中的斑点的类,以下是它的参数说明:
1. thresholdStep:二值化阈值步长,用于在二值化过程中逐步增加或减小阈值,默认为10。
2. minThreshold:最小的二值化阈值,默认为50。
3. maxThreshold:最大的二值化阈值,默认为220。
4. minRepeatability:最小的斑点重复次数,默认为2,表示只有当一个斑点至少在两个不同位置被检测到时才会被认为是有效的。
5. blobColor:斑点的亮度值,取值为0或255,默认为0,表示只检测黑色斑点。
6. filterByArea:是否根据斑点的面积进行过滤,默认为true,表示进行过滤。
7. minArea:最小的斑点面积,默认为25,表示只检测面积大于25的斑点。
8. maxArea:最大的斑点面积,默认为5000,表示只检测面积小于5000的斑点。
9. filterByCircularity:是否根据斑点的圆形度进行过滤,默认为false,表示不进行过滤。
10. minCircularity:最小的斑点圆形度,默认为0.8,表示只检测圆形度大于0.8的斑点。
11. maxCircularity:最大的斑点圆形度,默认为1,表示只检测圆形度小于1的斑点。
12. filterByInertia:是否根据斑点的惯性比进行过滤,默认为true,表示进行过滤。
13. minInertiaRatio:最小的斑点惯性比,默认为0.1,表示只检测惯性比大于0.1的斑点。
14. maxInertiaRatio:最大的斑点惯性比,默认为1,表示只检测惯性比小于1的斑点。
15. filterByConvexity:是否根据斑点的凸度进行过滤,默认为true,表示进行过滤。
16. minConvexity:最小的斑点凸度,默认为0.95,表示只检测凸度大于0.95的斑点。
17. maxConvexity:最大的斑点凸度,默认为1,表示只检测凸度小于1的斑点。
这些参数可以根据具体应用场景进行调整,以得到符合要求的斑点检测结果。
所使用图例
// 读取原始图像
Mat image = new Mat("1.jpg", ImreadModes.Color);// 创建SimpleBlobDetector参数
SimpleBlobDetector.Params parameters = new SimpleBlobDetector.Params();// 设置参数
parameters.FilterByArea = true;
parameters.MinArea = 100;
parameters.MaxArea = 10000;// 创建SimpleBlobDetector
SimpleBlobDetector detector = SimpleBlobDetector.Create(parameters);// 检测斑点
KeyPoint[] keypoints = detector.Detect(image);// 在图像上绘制斑点
Mat result = new Mat();
Cv2.DrawKeypoints(image, keypoints, result, Scalar.All(-1), DrawMatchesFlags.Default);// 显示结果
Cv2.ImShow("Result", result);
Cv2.WaitKey(0);
二、边缘检测
边缘检测是一种图像处理技术,可以找到图像中的边缘或边界。penCV 中提供的两种重要边缘检测算法:Sobel边缘检测和 canny边缘检测。
1、cv2.Sobel()
//函数原型
public static void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize = 3, double scale = 1,double delta = 0, BorderType borderType = BorderType.Default
)
参数说明:
- src:输入图像。
- dst:输出图像,是一个与输入图像相同大小和类型的图像。
- ddepth:输出图像的深度,通常使用-1表示与输入图像相同深度。
- dx:表示在水平方向上进行边缘检测的阶数。
- dy:表示在垂直方向上进行边缘检测的阶数。
- ksize:表示卷积核的大小,默认为3。
- scale:可选参数,用于缩放结果,默认为1。
- delta:可选参数,用于调整结果的偏移,默认为0。
- borderType:可选参数,用于指定边界的处理方式,默认为BorderType.Default。
使用cv2.Sobel函数可以进行边缘检测,通过调整dx和dy的值可以获得不同方向的边缘信息。输出图像的像素值表示了对应位置的边缘强度。
cv2.Sobel函数进行边缘检测的示例
using OpenCvSharp;Mat srcImage = new Mat("input.jpg", ImreadModes.Color);
Mat grayImage = new Mat();
Cv2.CvtColor(srcImage, grayImage, ColorConversionCodes.BGR2GRAY);Mat edges = new Mat();
Cv2.Sobel(grayImage, edges, MatType.CV_8U, 1, 0, 3);Cv2.ImShow("Edges", edges);
Cv2.WaitKey(0);
这个示例将输入图像转换为灰度图像,并使用Sobel算子在水平方向上进行边缘检测,然后显示结果图像。
总之,cv2.Sobel函数是OpenCVSharp库中的一个函数,用于在图像上应用Sobel算子进行边缘检测。通过调整参数可以获得不同方向的边缘信息。
2、cv2.Canny()
public static void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)
参数说明:
- image:要进行边缘检测的输入图像。
- edges:输出的边缘图像。
- threshold1:第一个阈值,用于边缘链接。
- threshold2:第二个阈值,用于边缘链接。
- apertureSize:Sobel算子的孔径大小,默认为3。
- L2gradient:一个布尔值,指定求梯度大小的方法,默认为false。
Canny边缘检测算法的原理是:首先对图像进行高斯滤波,然后通过Sobel算子计算图像的梯度,再通过非极大值抑制来提取局部最大值作为边缘点,最后通过双阈值检测来连接边缘点。
cv2.Canny函数的示例代码:
using OpenCvSharp;class Program
{static void Main(string[] args){// 读取图像Mat image = Cv2.ImRead("image.jpg", ImreadModes.Color);// 将图像转换为灰度图像Mat grayImage = new Mat();Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY);// 使用Canny边缘检测算法检测边缘Mat edges = new Mat();Cv2.Canny(grayImage, edges, 100, 200);// 显示原始图像和边缘图像Cv2.ImShow("Original Image", image);Cv2.ImShow("Edges", edges);Cv2.WaitKey(0);// 释放内存Cv2.DestroyAllWindows();image.Dispose();grayImage.Dispose();edges.Dispose();}
}
这个示例代码从文件中读取图像,然后将其转换为灰度图像。然后,它使用Canny边缘检测算法检测图像中的边缘,并将结果显示出来。最后,释放内存并关闭窗口。
注意:在运行此代码之前,确保已在项目中添加对OpenCVSharp库的引用,并将图像文件与示例代码放在同一目录下,并将图像文件名替换为实际的图像文件名
三、 轮廓检测
轮廓检测是一种从图像中提取物体形状的技术。OpenCV中的cvFindContours
函数可以实现轮廓检测。该函数将图像转换为二进制图像,然后找到所有的轮廓。
轮廓检测步骤
- Cv2.CvtColor彩色图像转换为灰度图像
- cv2.threshold函数用于将图像进行二值化处理
- Cv2.FindContours在图像中查找轮廓
- Cv2.DrawContours在图像上绘制轮廓
示例代码
// 读取图像Mat image = Cv2.ImRead("1.png", ImreadModes.Color);// 将图像转换为灰度图像Mat grayImage = new Mat();Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY); // 进行BGR2GRAY转换Mat ThresholdImage = new Mat();Cv2.Threshold(grayImage, ThresholdImage, 150, 255, ThresholdTypes.Binary); // 对图像进行二值化处理Cv2.ImShow("ThresholdImage", ThresholdImage);Cv2.WaitKey(0);OpenCvSharp.Point[][] contours;HierarchyIndex[] hierarchy;Cv2.FindContours(ThresholdImage, out contours, out hierarchy, RetrievalModes.List, ContourApproximationModes.ApproxSimple);Scalar color = new Scalar(0, 255, 0); // 轮廓颜色为绿色int thickness = 2; // 轮廓线粗细为2for (int i = 0; i < contours.Length; i++){Cv2.DrawContours(ThresholdImage, contours, i, color, thickness); // 绘制轮廓}Cv2.ImShow("Contours", ThresholdImage); // 显示图像Cv2.WaitKey(0);
c# OpenCV文章目录
c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)
c# OpenCV 基本绘画(直线、椭圆、矩形、圆、多边形、文本)(四)
c# OpenCV 图像裁剪、调整大小、旋转、透视(三)
c#OpenCV 读取、显示和写入图像(二)
c# OpenCV安装(一)
相关文章:
c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)
在C#中使用OpenCV进行图像处理时,可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测(Blob) 斑点检测是指在图像中找到明亮或暗的小区域(通常表示为斑点)&#…...
PHP下载安装以及基本配置
目录 引言 官网 下载 配置 1. 鼠标右键“此电脑”>“属性” 2. 打开高级系统设置 3. 打开环境变量 4. 双击系统变量中的path 5. 新建新的path 6. 将刚刚安装的位置加入环境变量 7. 检查是否安装成功 引言 PHP("PHP: Hypertext Preprocessor"…...
黑苹果安装经验总结2023-12
最近2个月安装了3台黑苹果 B85,I3-4330,HD7750,最容易安装,MacOS12一次成功山寨X99,E5-2650V4,RX470,难度高惠普Z840,X99平台,2颗E5-2630,128G内存ÿ…...
基于深度学习的森林火焰烟雾检测系统(含UI界面,yolov8、Python代码,数据集)
项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型: yolov8 yolov8主要包含以下几种创新: 1. 添加注意力机制(SE、CBAM等) 2. 修改可变形卷积(DySnake-主干c…...
测试开发体系介绍——测试体系介绍-L1
目录: 软件测试基础概念 软件测试:软件测试作用:软件缺陷:软件测试原则:软件测试对象:测试用例软件开发流程 软件:软件生命周期:软件开发流程:瀑布模型:瀑布模型优缺点敏捷开发模型: XP - 极限编程:SCRUM:DevOps:DevOps 生命周期:DevOps 对发…...
Linux中的链接运算符详解 - 提高编程效率与性能
Linux 命令的链接意味着,组合多个命令并根据它们之间使用的操作符的行为使它们执行。 Linux 中的命令链就像您在 shell 本身编写简短的 shell 脚本,然后直接从终端执行它们。链接使得流程自动化成为可能。 此外,无人值守的机器可以在链接操作…...
JS模块化规范之ES6及UMD
JS模块化规范之ES6及总结 前言ES6模块化概念基本使用ES6实现 UMD(Universal Module Definition)总结 前言 ESM在模块之间的依赖关系是高度确定的,与运行状态无关,编译工具只需要对ESM模块做静态分析,就可以从代码字面中推断出哪些模块值未曾被…...
XM平台官网开户注册流程图解
注册前准备 在进行XM外汇官网注册之前,首先需要准备必要的信息,包括个人身份信息、联系方式以及相关财务信息。确保这些信息的准确性是保证注册流程顺利进行的关键。 一、要访问XM外汇官方网站,首先打开您的浏览器。在浏览器的地址栏中输入…...
【Linux进阶之路】线程
文章目录 一、初始线程1.概念2.执行3.调度4.切换 二、线程控制1.创建2.等待3.分离4.退出5.取消 三、线程安全1.互斥1.1初始1.2理解1.3锁1.3.1概念1.3.2原理1.3.4死锁 2.同步2.1概念2.2原理 3.生产消费者模型 总结尾序 一、初始线程 1.概念 简单的概念: 线程就是一…...
个性化TikTok外贸工具定制!突破营销新境界!
随着全球化的加速发展,外贸行业正面临着前所未有的机遇和挑战,在这个竞争激烈的市场环境中,如何脱颖而出,吸引更多的潜在客户,成为每个外贸企业亟待解决的问题,而个性化TikTok外贸工具的定制,正…...
设计模式-门面模式
设计模式专栏 模式介绍模式特点应用场景门面模式和代理模式的区别代码示例Java实现门面模式Python实现门面模式 门面模式在spring中的应用 模式介绍 门面模式是一种常用的软件设计模式,也称为外观模式。它提供了一个高层次的接口,将一个子系统的外部与内…...
搭建接口自动化测试框架python+requests+pytest
安装python(最好是比较新比较稳定的版本),然后是python的解释器或者叫编译器pycharm安装后新建一个项目,以此项目为基础,安装依赖搭建框架。打开pycharm,点击左上角的File->New project->弹出如下界面…...
一套rk3588 rtsp服务器推流的 github 方案及记录 -02
整体方案参考上一篇博文 https://blog.csdn.net/qq_31764341/article/details/134810566 本篇博文主要介绍基于RK3588进行硬解码 还是之前的套路,我不生产代码,我只是代码的搬运工,今天我们搬运瑞芯微的官方代码,并记录下来整个调…...
docker运行java程序的Dockerfile
1,docker运行java程序的Dockerfile # 使用基础镜像 FROM alpine:latest # 暴露容器的端口 不会自动将容器的端口映射到宿主机上 docker run -d -p <宿主机端口>:7080 <镜像名称> EXPOSE 9202 EXPOSE 19202 #下载jdk8 RUN apk update && apk a…...
docker数据卷数据卷容器
前言 今天调休在家,随便玩玩,简单做下学习记录 1. 数据卷特点 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会被拷贝到新初始化的数据卷中数据卷可以在容器之间共享和重用可以对数据卷里的内容直接…...
使用HTTP协议有哪些风险?HTTP与HTTPS的区别是什么
作为两种常见的网络协议,HTTP和HTTPS都是用于在浏览器和服务器之间传输数据的。然而在保障数据安全性方面,HTTPS远远优于HTTP。在网络安全愈发重要的当下,HTTP协议的不安全性使得其逐渐被淘汰弃用。那么使用HTTP协议有哪些风险呢?…...
【jvm从入门到实战】(十) 实战篇-内存调优
内存溢出和内存泄漏:在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。内存泄漏绝大多数情况都是由堆内存泄漏引起的。少量的内存泄漏可以容忍&#x…...
设计模式分类
不同设计模式的复杂程度、 细节层次以及在整个系统中的应用范围等方面各不相同。 我喜欢将其类比于道路的建造: 如果你希望让十字路口更加安全, 那么可以安装一些交通信号灯, 或者修建包含行人地下通道在内的多层互通式立交桥。 最基础的、 底…...
【前缀和】【单调栈】LeetCode2281:巫师的总力量和
作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 作为国王的统治者,你有一支巫师军队听你指挥。 给你一个下标从 0 开始的整数数组 strength &…...
力扣面试经典题之二叉树
104. 二叉树的最大深度 简单 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入…...
图灵日记之java奇妙历险记--数据类型与变量运算符
目录 数据类型与变量字面常量数据类型变量语法格式整型变量浮点型变量字符型变量希尔型变量类型转换自动类型转换(隐式)强制类型转换(显式) 类型提升不同数据类型的运算小于4字节数据类型的运算 字符串类型 运算符算术运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非…...
PhysX——源码编译
从git下载源码 git主页 https://github.com/NVIDIA-Omniverse/PhysXclone地址 https://github.com/NVIDIA-Omniverse/PhysX.git源码编译 运行PhysX需要两个编译器的支持,CMake 3.12 或以上版本以及Python 2.7.6 版本 进入工程的 physx 目录,运行generate…...
小鹅通基于 TSE 云原生 API 网关的落地实践
导语 2023腾讯全球数字生态大会已于9月7-8日完美落幕,40专场活动展示了腾讯最新的前沿技术、核心产品、解决方案。 微服务与消息队列专场,我们邀请到了小鹅通的基础架构组负责人黄徐震为我们带来了《小鹅通基于 TSE 云原生网关的落地实践》的精彩演讲。…...
Postgresql处理JSON类型中替换某个属性值问题
一、问题描述 使用postgresql对json的特性使用sql批量处理json中某个属性的值 结构如下: {"id": 1,"parentId": 123,"globalParameters": [{"value": "date","boardId": 123,"canReName":…...
@德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
德人合科技 | 天锐绿盾加密软件是一款全面保障企业电脑数据和安全使用的加密软件 PC端访问地址:www.drhchina.com 它的功能包括但不限于: 实时操作日志:可以实时详细地记录所有终端的操作日志,包括终端上窗口标题的变换、程序的…...
android 使用GSON 序列化对象出现字段被优化问题解决方案
一、问题描述 有以下结构: public class NativeParam<T> {private T data;public NativeParam(T data) {this.data data;}public T getData() {return data;}public void setData(T data) {this.data data;} };NativeParam<String> data "1.0…...
进入不了Bios?进入Bios的方法都在这了,肯定能进!
前言 有些小伙伴可能在重装系统的第一步就卡住了,接着就放弃了。哇哈哈哈啊,先让小白笑会~ 根据小白十二年的装机经验,不同主板进入Bios的时候有不同的姿势。也许要蹲着大喊Bios才能进入呢?要不试试? 好了…...
手把手教你基于 FastGPT 搭建个人知识库
前言 大家好,我是潇潇雨声。我发现在使用 GPT 时,尽管它能够生成一些小红书文案和日志,但内容常常显得空洞缺乏深度。今天我想分享一个解决这个问题的方法,那就是基于开源项目 FastGPT[1]。 我们可以通过向 GPT 提供一些有针对性的…...
gitee 怎么添加SSH密钥
要在Gitee上添加SSH密钥,请按照以下步骤操作: 登录到Gitee账户并导航到您要添加SSH密钥的存储库页面。点击页面右上方的“设置”按钮。在设置页面中,选择“SSH公钥”选项卡。点击“添加密钥”按钮。在弹出的对话框中,输入密钥标题…...
万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码
一、系统概述: 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数据大屏、功能齐全开源mes. 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理,车间基础数据管理&…...
优速网站建设工作室/短网址在线生成
在上集中,我们已经构建了一个简单的待办列表应用(to-do list app),这个应用可以在待办项过期时通过本地通知提醒用户。现在,我们要在之前的基础上添加以下功能:应用图标角标上显示过期待办项的数量、通知动…...
个人网站需要买服务器吗/个人网站制作源代码
最近使用mediaelementjs做一个iPad上的Html5的video标签的播放器包装. 首先感谢一下mediaelementjs这样的开源项目, 可用度极高, 代码质量明显比我自己写要好多了, 模块化清晰, 许可证很开放(MIT). 开发的过程中遇到了些浏览器兼容问题, 也涉及到一下iPad这样的平板平板设备上…...
深圳做营销网站设计/如何网络推广
一、基础知识1、一个主机的端口号为所有进程所共享,但普通用户进程绑定bind不了一些特殊端口号如20、80等。多个进程不能同时监听listen同一个端口,会失败。当然父进程可以先listen然后fork多个子进程,多个子进程都可以accept这个sock&#x…...
盐城市规划建设局网站/百度爱采购优化
公众号关注 「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !据BleepingComputer 2月10日消息,Clop 勒索软件组织最近利用 GoAnywhere MFT 安全文件传输工具中的零日漏洞,从 130 多个企业组织中窃取了数据。该安全漏洞被追…...
企业信息管理系统源码/廊坊百度seo公司
在index.aspx<head></head>中加入如下代码,这3个文件可以在网上直接收索名字下载 [javascript] view plaincopy <mce:script type"text/javascript" src"jquery-1.2.6.pack.js" mce_src"jquery-1.2.6.pack.js">&l…...
手机社区网站模板/手机推广app
Linux程序包管理器(rpm,yum,源码安装)一.RPM程序包管理器debian的软件包管理器为deb,软件包后缀为.dpt。而红帽的程序包管理器为rpm,包后缀为.rpmRPM是redhat发行版专门用来管理Linux软件包的,最早由Red Hat开发出来,后…...