[C#]winform 使用opencvsharp实现玉米粒计数

【算法介绍】

这段代码是使用OpenCvSharp库(OpenCV的C#封装)对图像进行处理,主要流程包括图像的二值化、腐蚀操作、距离变换、轮廓检测,并在原图上标出检测到的轮廓位置及数量。下面是对代码的详细解读:

  1. 初始化
    • TotalCount 变量用于记录检测到的轮廓数量。
    • result_image 是原图的克隆,用于在后续步骤中在原图上绘制结果。
  2. 二值化操作
    • 首先,将原图像 image 转换为灰度图像 grayimg
    • 然后,使用阈值 240 将灰度图像二值化为 BinaryImg,高于阈值的像素点被设置为 255(白色),其余为 0(黑色)。
  3. 腐蚀操作(这里实际使用的是膨胀操作Cv2.Dilate,注释可能误导):
    • 创建一个结构元素 kernel(这里为矩形,大小为15x15)。
    • 使用这个结构元素对二值图像进行膨胀操作,结果存储在 morhImage 中。膨胀操作通常用于增大前景对象(白色区域),但这里的注释和变量名(morhImage)可能会引起混淆,因为它实际上执行的是膨胀而不是腐蚀。
  4. 距离变换
    • 首先,对膨胀后的图像 morhImage 进行位非操作(Cv2.BitwiseNot),将白色区域变为黑色,黑色区域变为白色。
    • 然后,尝试进行一些不常见的操作(可能是为了某种特殊效果),但代码中存在逻辑错误:dist.ConvertTo(MorphImg, MatType.CV_8U); 实际上并没有使用 dist 变量,而是直接对 MorphImg 进行了类型转换。
    • 接着,对 MorphImg 进行二值化操作和开操作(Cv2.MorphologyEx),但这一步的目的和效果可能不是很清晰,因为前面的操作(特别是距离变换的准备步骤)没有正确执行。
  5. 轮廓检测
    • 使用 Cv2.FindContours 查找 MorphImg 中的轮廓。
    • 创建一个全黑的 markers 图像,用于在原图上标记轮廓。
    • 遍历所有轮廓,计算每个轮廓的边界矩形,并在 result_image 上绘制绿色圆圈和轮廓编号。
  6. 统计和显示结果
    • 将检测到的轮廓数量(contours.Length)赋值给 TotalCount
    • 在 result_image 上绘制总轮廓数量的文本。
  7. 返回结果
    • 返回处理后的图像 result_image

注意

  • 代码中关于腐蚀的部分实际上执行的是膨胀操作,这可能是一个错误或误解。
  • 距离变换部分的实现似乎有误,特别是关于 dist 变量的使用。
  • 代码中的注释和变量命名(如 morhImage)可能不够准确,可能会引起理解上的困惑。

【效果展示】

【实现部分代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;namespace FIRC
{public partial class Form1 : Form{Mat src = new Mat();CornManager detector = new CornManager();public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp";openFileDialog.RestoreDirectory = true;openFileDialog.Multiselect = false;if (openFileDialog.ShowDialog() == DialogResult.OK){src = Cv2.ImRead(openFileDialog.FileName);pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);}}private void button2_Click(object sender, EventArgs e){if(pictureBox1.Image==null){return;}var resultMat = detector.GetCountImage(src);pictureBox2.Image= OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultMat); //Mat转Bitmap}private void Form1_Load(object sender, EventArgs e){}private void button3_Click(object sender, EventArgs e){VideoCapture capture = new VideoCapture("test.mp4");if (!capture.IsOpened()){Console.WriteLine("video not open!");return;}Mat frame = new Mat();var sw = new Stopwatch();int fps = 0;while (true){capture.Read(frame);if (frame.Empty()){Console.WriteLine("data is empty!");break;}sw.Start();var result = detector.GetCountImage(frame);sw.Stop();fps = Convert.ToInt32(1 / sw.Elapsed.TotalSeconds);sw.Reset();Cv2.PutText(result, "FPS=" + fps, new OpenCvSharp.Point(30, 30), HersheyFonts.HersheyComplex, 1.0, new Scalar(255, 0, 0), 3);//显示结果Cv2.ImShow("Result", result);int key = Cv2.WaitKey(10);if (key == 27)break;}capture.Release();}}
}

【测试环境】

vs2019

netframework4.7.2

opencvsharp=4.8.0

【源码下载地址】

https://download.csdn.net/download/FL1623863129/89774838

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/54631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04安装GNSS数据处理软件GAMIT/GLOBK

由于微信公众号改变了推送规则,为了每次新的推送可以在第一时间出现在您的订阅列表中,记得将本公众号设为星标或置顶喔~ 手把手带您安装gamit/globk软件~ 🌿前言 受朋友之托,出一期Ubuntu22.04安装GNSS数据处理软件——gamit软件…

【论文笔记】Are Large Kernels Better Teacheres than Transformers for ConvNets

Abstract 本文提出蒸馏中小核ConvNet做学生时,与Transformer相比,大核ConvNet因其高效的卷积操作和紧凑的权重共享,使得其做教师效果更好,更适合资源受限的应用。 用蒸馏从Transformers蒸到小核ConvNet的效果并不好,原…

MySQL篇(存储过程 触发器 存储函数)(持续更新迭代)

目录 一、存储过程 1. 简介 2. 特点 3. 语法 3.1. 创建 3.2. 调用 3.3. 查看 3.4. 删除 4. 示例 二、变量 1. 简介 2. 系统变量 2.1. 查看系统变量 2.2. 设置系统变量 2.3. 演示示例 3. 用户定义变量 3.1. 赋值 方式一 方式二 3.2. 使用 3.3. 演示示例 4.…

Rust - 字符串:str 与 String

在其他语言中,字符串通常都会比较简单,例如 “hello, world” 就是字符串章节的几乎全部内容了。 但是Rust中的字符串与其他语言有所不同,若带着其他语言的习惯来学习Rust字符串,将会波折不断。 所以最好先忘记脑中已有的关于字…

华为---代理ARP简介及示例配置

目录 1. 概念 2. 前提条件 3. 使用环境 4. 工作过程 5. 优点 6. 缺点 7. 示例配置 7.1 示例场景 7.2基本配置 7.3 配置端口隔离 7.4 开启代理ARP 7.4.1 VLAN内代理ARP 7.4.2 VLAN间代理ARP 7.4.3路由式ARP代理 1. 概念 代理ARP(Proxy ARP)&…

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

matlab恢复默认窗口布局

1.点击主页,选择布局 2.选择默认,即可恢复到默认的窗口布局

LIN总线CAPL函数—— 设置LIN报文字节间隔长度(linSetInterByteSpace)

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

利士策分享,如何培养良好的工作习惯?

利士策分享,如何培养良好的工作习惯? 在这个快节奏、高压力的职场环境中,培养良好的工作习惯不仅关乎个人职业发展的顺畅度, 更是提升工作效率、保持身心健康的关键。 以下是一些实用的建议,帮助你在日常工作中逐步构…

智慧水利采砂船在线监控平台:构建高效、智能的河道采砂监管体系

随着科技的不断发展,水利行业的智慧化转型也日益受到重视。智慧水利采砂船在线监控平台便是这一转型的重要成果之一。该平台主要服务于水政执法人员,针对取得河道采砂许可证的采砂公司及采砂船,实施在线自动监控,旨在提高监管效率…

iptables限制网速

1、使用hashlimit来限速 #从eth0网卡进入INPUT链数据,使用模块hashlimit 限制网速为100kb/s或2mb/s,超过限制的数据包会被DROP。OUTPUT链同理,mode为srcip,有4个mode选项: srcip(默认匹配每个源地址IP,配置指定源地址…

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【上篇】

【STM32开发笔记】移植AI框架TensorFlow【上篇】 一、TFLM是什么?二、TFLM开源项目2.1 下载TFLM源代码2.2 TFLM基准测试说明2.3 TFLM基准测试命令 三、TFLM初步体验3.1 PC上运行Keyword基准测试3.2 PC上运行Person detection基准测试3.3 No module named numpy问题解…

保障电气安全的电气火灾监控系统主要组成有哪些?

电气火灾是什么? 电气火灾一般是指由于电气线路、用电设备、器具以及供配电设备出现故障性释放的热能:如高温、电弧、电火花以及非故障性释放的能量;如电热器具的炽热表面,在具备燃烧条件下引燃本体或其他可燃物而造成的火灾&…

递归基础训练-路径总和

路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 我们可以把之前的…

计算机组成原理(笔记4)

定点加减法运算 补码加法&#xff1a; 补码减法&#xff1a; 求补公式&#xff1a; 溢出的概念 在定点小数机器中,数的表示范围为|&#xff58;|<1。在运算过程中如出现大于1的现象,称为 “溢出”。 上溢&#xff1a;两个正数相加&#xff0c;结果大于机器所能表示的最…

数据结构-线性表的单链式存储结构图解及C语言实现

概念 链式存储&#xff1a;结点在存储器中的位置是任意的&#xff0c;即逻辑相邻的数据元素在物理上不一定相邻 链式存储结构也称非顺序映像或链式映像 图解 链式存储结构中结点一般有两个部分组成&#xff0c;即数据域(data)和指针域&#xff0c;数据域是用于存放数据的&…

开源ids snort (windows版)

Snort-IPS-on-Windows-main资源-CSDN文库 GitHub - eldoktor1/Snort-IPS-on-Windows: A comprehensive guide to installing and configuring Snort IPS on Windows, ensuring robust network security 手动打造Snortbarnyard2BASE可视化告警平台 - FreeBuf网络安全行业门户 …

JavaWeb--小白笔记07:servlet对表单数据的简单处理

这里的servlet对表单数据的处理是指使用IDEA创建web工程&#xff0c;再创建html和class文件进行连接&#xff0c;实现html创建一个表单网页&#xff0c;我们对网页中的表单进行填充&#xff0c;可以通过class文件得到网页我们填充的内容进行打印到控制台。 一登录系统页面---h…

Linux网络之UDP与TCP协议详解

文章目录 UDP协议UDP协议数据报报头 TCP协议确认应答缓冲区 超时重传三次握手其他问题 四次挥手滑动窗口流量控制拥塞控制 UDP协议 前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理 毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情 我们首先知道计算机网…

怎么用gitee做一个图片仓库,在md文档中用这个图片网络地址,然后显示图片

痛因&#xff1a;我为什么要这样做&#xff0c;呃&#xff0c;我一开始图片都是存本地地址的&#xff0c;放在和这个md文档同级的assets文件夹下面&#xff0c;这样子确实当时很方便&#xff0c;复制粘贴什么也不用管&#xff0c;但是想把这个文档分享给别的人的时候&#xff0…