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

news2024/9/23 17:00:10

【算法介绍】

这段代码是使用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.coloradmin.cn/o/2158030.html

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

相关文章

网络通信——路由器、交换机、集线器(HUB)

注意:传输层,应用层没有网路设备 一.路由器(网络层设备) 1.分割广播域 2.一个接口就是一个广播域 3.一般接口位4,8,12。 4.数据转发 (由路由表转发数据) 5.根据路由表来进行路径选…

基于微信小程序的美食外卖管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

面试速通宝典——1

1. 内存有哪几种类型? ‌‌‌‌  内存分为五个区,堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量&#…

米壳AI:自媒体如何获取高清原画质!真8K视频是这样下载的!

作为一名新手自媒体博主,你是不是也在各种短视频平台上疯狂搜索保存外网视频的方法和软件呢?😃然而,真正能下载真 4K 视频的却寥寥无几。 别苦恼啦!今天我就来给大家分享一个小编亲测过后真实好用的工具 —— 米壳 AI。…

网页通知设计灵感:CSS 和 JS 的 8 大创意实现

文章目录 前言正文1.霓虹灯风格的通知系统2.垂直时间轴通知3.动画徽章通知4.项目式通知5.多种状态通知:成功、错误、警告6.信息、警告、提示组件7.扁平化风格通知8.社交媒体风格弹出通知 总结 前言 网页通知如今已成为电商、社交平台等网站的常见功能,它…

Pandas -----------------------基础知识(二)

dataframe读写数据操作 import pandas as pd# 准备数据(字典) data [[1, 张三, 1999-3-10, 18],[2, 李四, 2002-3-10, 15],[3, 王五, 1990-3-10, 33],[4, 隔壁老王, 1983-3-10, 40] ]df pd.DataFrame(data, columns[id, name, birthday, age]) df写到csv文件中 ,…

SOLIDWORKS 2025 重点新功能大放送(壹)

SOLIDWORKS 2025涵盖全新以用户为中心的增强功能,致力实现更智能、更快速地与团队和外部合作伙伴协同工作。 小索是设计部负责人,SOLIDWORKS资深使用者,使用SOLIDWORKS软件多年,喜欢分享,正在体验SOLIDWORKS 2025版本…

tensorboard展示不同运行的曲线结果

运行tensorboard曲线如下: tensorboard --logdir .有时候,曲线图会展示多条曲线,以至于我们想分辨哪条线来自哪次训练都做不到了。如下图是设置smoothing-0.6的结果: smoothing可以在页面找到设置按钮,呼出设置侧边…

【算法笔记】二分查找 红蓝染色法

目录 二分查找 红蓝染色法(感谢灵神)闭区间[left, right]左闭右开区间[left, right)开区间(left, right)变式 二分查找 红蓝染色法(感谢灵神) 这里是灵神的教学视频:二分查找 红蓝染色法_哔哩哔哩_ bilibili 学了二分…

玩转RabbitMQ声明队列交换机、消息转换器

♥️作者:小宋1021 🤵‍♂️个人主页:小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油&#xff01…

中兴交换机三层配置

中兴交换机三层配置 目的:将1-10端口划分到3001vlan,11-20端口划分到3002vlan中去 客户端客户端IPvlan网关主机A88.88.1.1203001192.168.1.254主机B192.168.100.1303002192.168.100.254 1、通过Console线登录设备 **********************************…

导出导入Oracle数据库使用黑框命令方式exp、imp【亲测】

下载工具 根据自己数据库的版本下载,以v19为例: 下载基础包Basic Package和工具包Tools Package 两个压缩包中的文件夹一样,但内容不一样,将两个压缩包中的文件解压合并到一起 https://www.oracle.com/database/technologies/inst…

TLV解码 - 华为OD统一考试(E卷)

2024华为OD机试(E卷D卷C卷)最新题库【超值优惠】Java/Python/C合集 题目描述 TLV编码是按 [Tag Length Value] 格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度&#xff…

Zotero(7.0.5)+123云盘同步空间+Z-library=无限存储文献pdf/epub电子书等资料

选择123云盘作为存储介质的原因 原因1: zotero个人免费空间大小:300M,如果zotero云端也保存文献pdf资料则远远不够 原因2: 百度网盘同步文件空间大小:1G123云盘同步文件空间大小:10G 第一台电脑实施步骤…

微服务--Gateway网关

在微服务架构中,Gateway(网关)是一个至关重要的组件,它扮演着多种关键角色,包括路由、负载均衡、安全控制、监控和日志记录等。 Gateway网关的作用 统一访问入口: Gateway作为微服务的统一入口&#xff0c…

DNF Decouple and Feedback Network for Seeing in the Dark

DNF: Decouple and Feedback Network for Seeing in the Dark 在深度学习领域,尤其是在低光照图像增强的应用中,RAW数据的独特属性展现出了巨大的潜力。然而,现有架构在单阶段和多阶段方法中都存在性能瓶颈。单阶段方法由于域歧义&#xff0c…

计算机网络 --- Socket 编程

序言 在上一篇文章中,我们介绍了 协议,协议就是一种约定,规范了双方通信需要遵循的规则、格式和流程,以确保信息能够被准确地传递、接收和理解。  在这篇文章中我们将介绍怎么进行跨网络数据传输,在这一过程中相信大家…

常⻅中间件漏洞(WebLogic)靶场

1.后台弱⼝令GetShell 启动环境 默认账号密码:weblogic/Oracle123 weblogic常⽤弱⼝令:https://cirt.net/passwords?criteriaweblogic 这⾥注意, 单个账号错误密码5次之后就会⾃动锁定。 172.16.1.51:7001/console/login/LoginForm.jsp …

视频剪辑软件排行榜前十名推荐!从入门到专业领域都有!

随着短视频的流行,视频剪辑已成为表达创意、分享故事、获取流量的重要工具。无论是专业视频制作人还是业余爱好者,选择一款合适的视频剪辑软件都至关重要。今天,我们就来盘点一下视频剪辑软件排行榜前十名,帮助你找到最适合自己的…

JavaScript是如何来的~~

文章目录 前言一、网络的诞生 ( The birth of the Web )二、Mosaic 浏览器三、Netscape 浏览器四、JavaScript的诞生 ~ 千呼万唤始出来总结 前言 例如:想要了解一门语言的发展历程,首先你得知道它是怎么来的,所以本文开篇介绍了网络的基本发…