C# OpenCvSharp Yolov8 Detect 目标检测

news2025/2/23 10:31:51

效果

项目

代码

using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace OpenCvSharp_Yolov8_Demo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
        string startupPath;
        string classer_path;

        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
        string model_path;
        Mat image;

        DetectionResult result_pro;
        Mat result_mat;
        Mat result_image;
        Mat result_mat_to_float;

        Net opencv_net;
        Mat BN_image;

        float[] result_array;
        float[] factors;

        int max_image_length;
        Mat max_image;
        Rect roi;

        Result result;
        StringBuilder sb = new StringBuilder();

        private void Form1_Load(object sender, EventArgs e)
        {
            startupPath = System.Windows.Forms.Application.StartupPath;
            model_path = startupPath + "\\yolov8n.onnx";
            classer_path = startupPath + "\\yolov8-detect-lable.txt";

            //初始化网络类,读取本地模型
            opencv_net = CvDnn.ReadNetFromOnnx(model_path);

            result_array = new float[8400 * 84];
            factors = new float[2];
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            pictureBox1.Image = null;
            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            textBox1.Text = "";
            image = new Mat(image_path);
            pictureBox2.Image = null;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (image_path == "")
            {
                return;
            }

            //缩放图片
            max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;
            max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);
            roi = new Rect(0, 0, image.Cols, image.Rows);
            image.CopyTo(new Mat(max_image, roi));

            factors[0] = factors[1] = (float)(max_image_length / 640.0);

            //数据归一化处理
            BN_image = CvDnn.BlobFromImage(max_image, 1 / 255.0, new OpenCvSharp.Size(640, 640), new Scalar(0, 0, 0), true, false);

            //配置图片输入数据
            opencv_net.SetInput(BN_image);

            dt1 = DateTime.Now;
            //模型推理,读取推理结果
            result_mat = opencv_net.Forward();
            dt2 = DateTime.Now;

            //将推理结果转为float数据类型
            result_mat_to_float = new Mat(8400, 84, MatType.CV_32F, result_mat.Data);

            //将数据读取到数组中
            result_mat_to_float.GetArray<float>(out result_array);

            result_pro = new DetectionResult(classer_path, factors);

            result = result_pro.process_result(result_array);

            result_image = result_pro.draw_result(result, image.Clone());

            if (!result_image.Empty())
            {
                pictureBox2.Image = new Bitmap(result_image.ToMemoryStream());
                sb.Clear();
                sb.AppendLine("推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms");
                sb.AppendLine("------------------------------");
                for (int i = 0; i < result.length; i++)
                {
                    sb.AppendLine(string.Format("{0}:{1},({2},{3},{4},{5})"
                        , result.classes[i]
                        , result.scores[i].ToString("0.00")
                        , result.rects[i].TopLeft.X
                        , result.rects[i].TopLeft.Y
                        , result.rects[i].BottomRight.X
                        , result.rects[i].BottomRight.Y
                        ));
                }
                textBox1.Text = sb.ToString();
            }
            else
            {
                textBox1.Text = "无信息";
            }

        }
    }
}

Demo下载 

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

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

相关文章

全球南方《乡村振兴战略下传统村落文化旅游设计》八一新枝——2023学生开学季许少辉瑞博士生辉少许

全球南方《乡村振兴战略下传统村落文化旅游设计》八一新枝——2023学生开学季许少辉瑞博士生辉少许

全能电子地图下载器3.0-下载离线地图瓦片

前言 vue项目要部署到局域网内&#xff0c;不使用在线地图&#xff0c;而是离线地图&#xff0c;寻求了很多的解决方案&#xff0c;最终决定使用离线地图瓦片leaflet.js实现效果&#xff01; 正文 首先需要下载正版的软件&#xff0c;目前我实用的是V3.0版本的&#xff0c;可能…

gateway之断言的使用详解

文章目录 gateway产生的背景&#xff0c;为什么要是用gateway什么是网关gateway 带来的好处功能特征gateway在项目中使用的依赖 什么是断言断言分类内置自定义示例 断言和过滤器的不同 gateway产生的背景&#xff0c;为什么要是用gateway 一个系统会被拆分为多个微服务&#x…

Android OpenGL 做了一个修图(P 图)功能,对标 PS

P 图功能与 OpenGL 玩过 P 图软件的朋友一定对这个功能有所了解,P 图我们可以简单地看做把一个区域的像素按照某一方向进行移动,产生一定形变效果,基于这个原理,我们可以手动实现瘦脸、长腿、瘦腰、大眼、丰胸等等一系列效果,从而达到美颜、美型的目的。 我们将一个区域的…

四轴无人机-飞行控制原理(PID)

控制目标&#xff1a; 1、稳定/平衡 【最核心】&#xff1a;四旋翼微型飞行器的控制就是以地理坐标系为参考&#xff0c;做三维飞行姿态控制。控制目标是使其在 无动作指令时保持稳定悬停状态&#xff0c;有动作指令 时有效完成指定动作。 2、准确 3、快速 4、鲁棒 控制方法…

【李沐深度学习笔记】线性代数实现

课程地址和说明 线性代数实现p2 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 这节就算之前内容的复习&#xff0c;后面以截图形式呈现 标量由只有一个元素的张量表示 import torch x torch.tensor([3.0]) y …

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 1.分解效果图 &#xff0…

hive3.X的HiveServer2 内存泄漏问题定位与优化方案(bug)

参考文档&#xff1a; https://juejin.cn/post/7141331245627080735?searchId20230920140418F85636A0735C03971F71 官网社区&#xff1a; https://issues.apache.org/jira/browse/HIVE-22275 In the case that multiple statements are run by a single Session before bein…

金蝶云星空与旺店通·旗舰奇门对接集成收料通知单查询连通新增采购订单(金蝶收料通知单-旺店通采购订单开单)

金蝶云星空与旺店通旗舰奇门对接集成收料通知单查询连通新增采购订单(金蝶收料通知单-旺店通采购订单开单) 数据源平台:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司…

Linux学习-HIS系统部署(2)

GitLab服务器搭建 使用rpm包本地部署GitLab服务器 # 确认GitLab主机硬件配置&#xff0c;注GitLab服务器至少要有4G内存&#xff0c;关闭SWAP分区 [rootgitlab ~]# free -mtotal used free shared buff/cache available Mem: 4021 1…

“高级前端开发技术探索路由的使用及Node安装使用“

目录 引言1. Vue路由的使用2. VueNode.js的安装使用总结 引言 在当今互联网时代&#xff0c;前端开发技术日新月异&#xff0c;不断涌现出各种新的框架和工具。作为一名前端开发者&#xff0c;我们需要不断学习和探索新的技术&#xff0c;以提升自己的开发能力。本文将深入探讨…

Windows AD域使用Linux Samba

Windows AD域使用Linux Samba 1. 初始化配置 1.1 初始化配置 配置服务器名 hostnamectl set-hostname samba.sh.pana.cnhosts文件配置,确保正常解析到本机和域控 [rootcentos7 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.loc…

微信小程序商城怎么弄

微信小程序商城怎么弄&#xff1f;这是一个常见的问题&#xff0c;对于那些想要在微信上创建一个自己的商城的人来说。下面为您介绍一些基本的步骤和注意事项&#xff0c;帮助您轻松地创建一个微信小程序商城。 首先&#xff0c;要创建一个微信小程序商城&#xff0c;您需要注册…

java面向对象(七)

文章目录 一、单例设计模式是什么&#xff1f;1.概念2.如何实现1.饿汉式2.懒汉式 3.区分饿汉式和懒汉式 二、main()方法的使用1.使用说明 三、类的成员之四&#xff1a;代码块&#xff08;或初始化块&#xff09;1.概念2.静态代码块3.非静态代码块 四、final关键字五、多态性的…

element树形组件使用之数据授权

<template><div><el-card class"tree-card"><p class"title">数据授权</p><div class"box"><div class"tree"><div class"member">选择授权人员</div><div class…

电压放大电路的作用有哪些(电压放大器)

电压放大电路是电子电路中常见且重要的组件&#xff0c;其主要作用是将输入信号的电压放大到所需的输出电压级别&#xff0c;并保持输入信号的形状和准确度。电压放大电路广泛应用于各种电子设备和系统中&#xff0c;具有以下几个重要的作用&#xff1a; 信号放大&#xff1a;电…

算法通关村第14关【白银】| 堆的经典问题

1.数组中的第k个最大元素 思路&#xff1a; 最直观的就是选择法&#xff0c;遍历一k次找到第k大的数之前使用快速排序的思想每次找出一个位置&#xff0c;会超时这里使用堆&#xff08;优先队列&#xff09;&#xff0c;找最大用小堆&#xff0c;找最小用大堆。 例如找第k大的…

Mysql——压缩包方式安装教程

一.Mysql压缩包下载方式 zip版&#xff08;5.7及8.0&#xff09;的下载需到官方网站下载&#xff0c;不同版本对应能安装在不同的操作系统下&#xff0c;本次介绍的是mysql-8.0.30-winx64在win10下的安装方式。 下载网址&#xff1a;MySQL :: Download MySQL Community Server …

java版网页代码生成器系统myeclipse定制开发mysql数据库网页模式java编程jdbc生成无框架java web网页

一、源码特点 java版网页代码生成器系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

D. Boris and His Amazing Haircut

Problem - D - Codeforces 问题描述&#xff1a;剪发&#xff0c;将数组a减为数组b&#xff0c;有m个剪刀&#xff0c;每个剪刀只可以用一次且可以在任意区间内剪发&#xff0c;将长度大于mi的减为mi。现在有m数组&#xff0c;数组元素是第i个剪刀可以剪到mi&#xff0c;问能否…