EmguCV学习笔记 VB.Net 11.5 目标检测

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客

 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客

 

11.5 目标检测

11.5.1 Yolo

YOLO(You Only Look Once)是一种流行的目标检测算法,它使用单个神经网络同时进行对象检测和对象分类。相比于传统的目标检测算法,YOLO在目标检测任务中表现优秀,有更快的速度和更高的准确性,被广泛应用于自动驾驶、安防监控等领域。

【代码位置:frmChapter11】Button3_Click

   '目标检测:yolo

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        '对象分类,coco.names文件提供了80类对象

        Dim classnames() As String

        classnames = File.ReadAllLines("C:\learnEmgucv\yolo\coco.names")

        '需要测试的图像文件

        Dim m As New Mat("C:\learnEmgucv\dnntest.jpg", ImreadModes.Color)

        Dim hm As Integer = m.Height

        Dim wm As Integer = m.Width

        Dim net As Dnn.Net

        '读取yolo的推理模型文件

        net = DnnInvoke.ReadNetFromDarknet("C:\learnEmgucv\yolo\yolov3.cfg", "C:\learnEmgucv\yolo\yolov3.weights")

        net.SetPreferableBackend(Dnn.Backend.OpenCV)

        net.SetPreferableTarget(Target.Cpu)

        Dim blob As Mat

        '注意:BlobFromImagesize参数

        '以前使用(416,416),现在是(608, 608),参看yolov3.cfg

        '如果继续使用(416,416),那么会有部分物体检测不出

        blob = DnnInvoke.BlobFromImage(m, 1.0 / 255.0, New Size(608, 608), New MCvScalar(0, 0, 0), True, False)

        net.SetInput(blob)

        '获取推理模型中未连接的输出层名称列表

        Dim names() As String = net.UnconnectedOutLayersNames

        '或者以下方法获得

        'Dim outLayers() As Integer = net.UnconnectedOutLayers        ''

        'Dim layerNames() As String = net.LayerNames

        'Dim names(outLayers.Length - 1) As String

        'For i As Integer = 0 To outLayers.Length - 1

        '    names(i) = layerNames(outLayers(i) - 1)

        'Next

        Dim mout As New VectorOfMat

        net.Forward(mout, names)

        '只有一张图片,只需要mout(0)即可

        Dim mout1 As New Mat

        mout1 = mout(0)

        '返回二维数组

        Dim detection(,) As Single

        detection = mout1.GetData()

        Dim rows As Integer = detection.GetLength(0)

        Dim cols As Integer = detection.GetLength(1)

        '置信度

        Dim lstYoloConf As New List(Of Single)

        '方框坐标

        Dim lstYoloRects As New List(Of Rectangle)

        '识别到的物体序号

        Dim lstYoloIndex As New List(Of Integer)

        '行数为检测出对象的数量

        '每列从 0 84,一共85个元素,

        '    0-1为矩形区域的中心坐标XY的百分比

        '    2-3为矩形的宽度和高度的百分比

        '    4为矩形区域的置信度

        '    5-84为对应的80类对象分别的置信度

        '存在两个置信度

        For i As Integer = 0 To rows - 1

            '第一个置信度是矩形区域的置信度

            Dim conf As Single = detection(i 4)

            '先判断矩形区域的置信度是否符合要求

            If conf > 0.5 Then

                Dim x As Single = detection(i 0) * wm  '百分比,需要乘以源图像的宽度

                Dim y As Single = detection(i 1) * hm  '百分比,需要乘以源图像的高度

                Dim w As Single = detection(i 2) * wm  '百分比,需要乘以源图像的宽度

                Dim h As Single = detection(i 3) * hm  '百分比,需要乘以源图像的高度

                For k As Integer = 5 To 84

                    '第二个置信度是检测出的对象分类的置信度

                    '判断对象分类的置信度是否符合要求

                    If detection(i, k) > 0.5 Then

                        lstYoloConf.Add(conf)

                        lstYoloRects.Add(New Rectangle(CInt(x - w / 2), CInt(y - h / 2), w, h))

                        '注意,是从第6个(索引为5)开始

                        lstYoloIndex.Add(k - 5)

                    End If

                Next

            End If

        Next

        '利用NMS把重复位置的rectangle去除

        Dim selectedObj() As Integer

        selectedObj = DnnInvoke.NMSBoxes(lstYoloRects.ToArray, lstYoloConf.ToArray, 0.2F, 0.3F)

        For i As Integer = 0 To lstYoloRects.Count - 1

            '只画出被保留下來的rectangle

            If (selectedObj.Contains(i)) Then

                '输出检测出的对象所在矩形区域

                CvInvoke.Rectangle(m, lstYoloRects(i), New MCvScalar(0, 255, 0), 1)

                '获得检测出的对象的种类名称

                Dim objName As String

                objName = classnames(lstYoloIndex(i))

                '输出检测出的对象名称

                CvInvoke.PutText(m, objName,

                                 New Point(lstYoloRects(i).X, lstYoloRects(i).Y - 5),

                                 FontFace.HersheyTriplex, 0.3, New MCvScalar(0, 0, 255))

                '输出检测出的置信度

                CvInvoke.PutText(m, lstYoloConf(i),

                                 New Point(lstYoloRects(i).X + 40, lstYoloRects(i).Y - 5),

                                 FontFace.HersheyComplex, 0.3, New MCvScalar(255, 0, 0))

            End If

        Next

        ImageBox1.Image = m

End Sub

输出结果如下图所示:

图11-2 使用YOLO进行目标检测的结果

11.5.2 SSD

SSD(Single Shot MultiBox Detector)是一种流行的目标检测算法,它使用单个神经网络同时进行对象检测和对象分类。相比于传统的目标检测算法,SSD可以快速准确地检测出图像中的对象,被广泛应用于自动驾驶、安防监控等领域。

【代码位置:frmChapter11】Button4_Click

   'ssd

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click

        '对象分类,object_detection_classes_pascal_voc.txt文件提供了21类对象(含background

        Dim classnames() As String

        classnames = File.ReadAllLines("C:\learnEmgucv\ssd\object_detection_classes_pascal_voc.txt")

        '需要测试的图像文件

        Dim m As New Mat("C:\learnEmgucv\dnntest.jpg", ImreadModes.Color)

        Dim hm As Single = m.Height

        Dim wm As Single = m.Width

        Dim net As Dnn.Net

        '读取SSD的推理模型文件

        net = DnnInvoke.ReadNetFromCaffe("C:\learnEmgucv\ssd\MobileNetSSD_deploy.prototxt.txt",

                           "C:\learnEmgucv\ssd\MobileNetSSD_deploy.caffemodel")

        net.SetPreferableBackend(Dnn.Backend.OpenCV)

        net.SetPreferableTarget(Target.Cpu)

        '输入图像必须是(300,300),参看MobileNetSSD_deploy.prototxt.txtinput_shape

        Dim mCopy As New Mat

        CvInvoke.Resize(m, mCopy, New Drawing.Size(300, 300))

        Dim blob As Mat

        blob = DnnInvoke.BlobFromImage(mCopy, 0.007843, New Size(300, 300),

                                       New MCvScalar(127.5 127.5 127.5), False, False)

        net.SetInput(blob)

        '

        Dim mout As New Mat

        mout = net.Forward()

        '返回四维数组

        Dim fout(,,,) As Single

        fout = mout.GetData()

        '检测到的所有对象的数量

        Dim allObjCount As Integer = fout.GetLength(2)

        '识别到的对象序号

        Dim lstSsdIndex As New List(Of Integer)

        '置信度

        Dim lstSsdConf As New List(Of Single)

        '矩形

        Dim lstSsdRects As New List(Of Rectangle)

        For i As Integer = 0 To allObjCount - 1

            '置信度

            Dim conf As Single

            conf = fout(0, 0, i, 2)

            If conf > 0.5 Then

                lstSsdConf.Add(conf)

                '对应对象序号

                lstSsdIndex.Add(fout(0, 0, i, 1))

                '左上角X

                Dim lbx As Integer = CInt(fout(0, 0, i, 3) * wm)

                '左上角Y

                Dim lby As Integer = CInt(fout(0, 0, i, 4) * hm)

                '右下角X

                Dim rtx As Integer = CInt(fout(0, 0, i, 5) * wm)

                '右下角Y

                Dim rty As Integer = CInt(fout(0, 0, i, 6) * hm)

                '对应矩形

                lstSsdRects.Add(New Rectangle(lbx, lby, rtx - lbx, rty - lby))

            End If

        Next

        For i As Integer = 0 To lstSsdIndex.Count - 1

            '检测出的对象所在矩形区域

            CvInvoke.Rectangle(m, lstSsdRects(i), New MCvScalar(0, 255, 0), 1)

            Dim objName As String

            objName = classnames(lstSsdIndex(i))

            Console.WriteLine(objName & lstSsdConf(i))

            '输出检测出的对象名称

            CvInvoke.PutText(m, objName,

                                 New Point(lstSsdRects(i).X, lstSsdRects(i).Y - 5),

                                 FontFace.HersheyTriplex, 0.3, New MCvScalar(0, 0, 255))

            '输出检测出的置信度

            CvInvoke.PutText(m, lstSsdConf(i),

                                 New Point(lstSsdRects(i).X + 40, lstSsdRects(i).Y - 5),

                                 FontFace.HersheyComplex, 0.3, New MCvScalar(255, 0, 0))

        Next

        ImageBox1.Image = m

End Sub

输出结果如下图所示:

图11-3使用SSD进行目标检测的结果

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

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

相关文章

初识时序数据库InfluxDB

最近项目开发中,需要记录时间序列的日志信息,InfluxDB 刚好契合。于是准备研究一下,发现已经有整理很好的文档,以下两篇觉得很好,入门开发可以参考一下。 因为项目是用C#开发的,因此,简单介绍一下C#开发中,InfluxDB的API使用。 1.简介 InfluxDB是一个由InfluxData开发…

《食品安全导刊》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问:《食品安全导刊》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《食品安全导刊》级别? 答:国家级。主管单位: 中国商业联合会 主办单…

ONLYOFFICE8.0部署集成(vue+java)并配置存储为minio

文章目录 前言一、使用docker安装onlyoffice8安装使用DockerDesktop方式命令行方式使用 HTTPS 运行展示 二、项目集成前端集成-vue3html方式后端集成-java 三、onlyoffice基础原理四、配置存储为minio1.onlyoffice配置文件挂载问题2.配置存储为minio3.验证切换minio存储是否生效…

生成式AI介绍

生成式AI介绍 生成式AI(Generative AI)是人工智能领域的一种技术,能够通过学习现有数据来生成新的内容。不同于传统的人工智能模型只进行分类、回归等分析任务,生成式AI具备创作能力,能够生成文本、图像、音频甚至视频…

基于spring拦截器实现博客项目的强制登录功能(四)

6. 强制登录 当⽤⼾访问 博客列表和博客详情⻚ 时, 如果⽤⼾当前尚未登陆, 就⾃动跳转到登陆⻚⾯. 我们可以采⽤拦截器来完成, token通常由前端放在header中, 我们从header中获取token, 并校验 token是否合法 6.1 添加拦截器 package com.example.spring_blog_24_9_8.config;…

性能测试-jmeter的控制器(十六)

一、if控制器 需求:使用“用户自定义变量”定义name变量,值可以是“baidu”或“itcast”,使用变量值,控制是否访问对应网站。 1、步骤: 在测试计划中添加用户定义的变量name,取值可为baidu或itcast添加两个http请求&#xff1a…

misc音频隐写

一、MP3隐写 (1)题解:下载附件之后是一个mp3的音频文件;并且题目提示keysyclovergeek;所以直接使用MP3stego对音频文件进行解密;mp3stego工具是音频数据分析与隐写工具 (2)mp3stego工具的使用:…

CSS实现前端布局更巧妙的方案!在 flex 布局中通过使用 margin 实现水平垂直居中以及其他常见的前端布局

在前端开发中,实现水平垂直居中一直是个热门话题。随着 CSS Flexbox 布局的普及,开发者们开始更多地使用 justify-content 和 align-items 这两个属性来解决这个问题。 然而,还有一种更加简洁、灵活的方式——使用 margin: auto; 来实现居中以…

大数据之Flink(二)

4、部署模式 flink部署模式: 会话模式(Session Mode)单作业模式(Per-Job Mode)应用模式(Application Mode) 区别在于集群的生命周期以及资源的分配方式;以及应用的main方法到底在…

Vue3使用vue-qrcode-reader实现扫码绑定设备功能

需求描述 移动端进入网站后,登录网站进入设备管理界面。点击添加设备,可以选择直接添加或者扫一扫。点击扫一扫进行扫描二维码获取设备序列号自动填充到添加设备界面的序列号输入框中。然后点击完成进行设备绑定。 安装vue-qrcode-reader 这里使用的版…

2024.9.11 作业

绘制组件制作时钟 代码&#xff1a; /*******************************************/ 文件名&#xff1a;widget.h /*******************************************/ #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include &l…

MAX3483ESA+T具有±15kV ESD保护的+3.3V、低功耗收发器,适用于RS-485和RS-422通信

MAX3483ESAT具有15kV ESD保护的3.3V、低功耗收发器&#xff0c;适用于RS-485和RS-422通信。每个器件包含一个驱动器和一个接收器。MAX3483ESAT具有限摆率驱动器&#xff0c;可充分降低EMI并减少因电缆端接不当引起的反射&#xff0c;从而实现数据速率高达250kbps的无误差数据传…

【中间件】-容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么&#xff1f; K8s的架构原理 控制平面(Control plane) kube-apiserver etcd kube-scheduler kube-controller-manager cloud-controller-manager 小结 节点组件(Node) container runtime Pod kubelet ku…

AnyChart 数据可视化框架

AnyChart 数据可视化框架 AnyChart 是一个灵活的 JavaScript&#xff08;HTML5、SVG、VML&#xff09;图表框架&#xff0c;适合任何需要数据可视化的解决方案。 目录 下载并安装开始插件将 AnyChart 与 TypeScript 结合使用将 AnyChart 与 ECMAScript 6 结合使用技术集成贡献…

Anolis OS 7.9(龙蜥操作系统)上Oracle12C Release 2 (12.2)打补丁

本文的oracle使用的是单实例环境 一、打补丁前环境准备 1、确保make, ar, ld,和 nm四个可执行命令在$PATH中 export PATH$PATH:/bin2、查看已装的Oracle的OPatch版本 #切换到oracle用户 su - oracle#进入到数据库的安装目录下的opatch目录 cd /ora01/app/oracle/product/12…

JS_函数声明

JS中的方法,多称为函数,函数的声明语法和JAVA中有较大区别 函数说明 函数没有权限控制符不用声明函数的返回值类型,需要返回在函数体中直接return即可,也无需void关键字参数列表中,无需数据类型调用函数时,实参和形参的个数可以不一致声明函数时需要用function关键字函数没有…

github actions CICD简单使用案例

参考&#xff1a; https://developer.aliyun.com/article/1540773 https://github.com/ViggoZ/producthunt-daily-hot/blob/main/.github/workflows/generate_markdown.yml 1、创建github项目 目录&#xff1a; .github/workflows/fetch-news.yml actions执行yaml&#xff08;…

C语言 | Leetcode C语言题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; //第一种动态规划:超时 // class Solution { // public: // int integerReplacement(int n) { // vector<int>dp(n1,0); // dp[1]0; // for(int i2;i<n;i){ // if(i%20){ // …

Vue接入高德地图并实现基本的路线规划功能

目录 一、申请密钥 二、安装依赖 三、代码实现 四、运行截图 五、官方文档 一、申请密钥 登录高德开放平台&#xff0c;点击我的应用&#xff0c;先添加新应用&#xff0c;然后再添加Key。 如图所示填写对应的信息&#xff0c;系统就会自动生成。 二、安装依赖 npm i am…

学生签到系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;签到信息管理&#xff0c;学生签到管理&#xff0c;班课信息管理&#xff0c;加入班课管理&#xff0c;课程信息管理 微信端账号功能包括&#xff1a;系统首…