EmguCV学习笔记 VB.Net 11.6 图像分割

news2024/11/17 1:48:08

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

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.6 图像分割

11.6.1 语义分割Fcn

FCN(Fully Convolutional Network)是一种流行的语义分割算法,它通过将传统的卷积神经网络转化为全卷积网络来实现像素级别的语义分割,将输入图像传入网络中,得到每个像素的标签,并根据标签来分割出不同的物体。FCN在语义分割任务中表现优秀,可以实现像素级别的精细分割,被广泛应用于自动驾驶、智能监控等领域。

【代码位置:frmChapter11】Button5_Click、getColorTable、showColorTable

    '语义分割fcn

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click

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

        Dim classnames() As String

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

        '获得输出颜色表

        Dim colorTable() As Bgr = getColorTable()

        '显示颜色表及对应对象名称

        Call showColorTable(classnames, colorTable)

        '需要测试的图像文件

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

        Dim hm As Single = m.Height

        Dim wm As Single = m.Width

        Dim net As Dnn.Net

        net = DnnInvoke.ReadNetFromCaffe("C:\learnEmgucv\fcn\fcn8s-heavy-pascal.prototxt",

                                         "C:\learnEmgucv\fcn\fcn8s-heavy-pascal.caffemodel"

                                        )

        Dim mcopy As New Mat

        CvInvoke.Resize(m, mcopy, New Drawing.Size(500, 500))

        Dim blob As Mat

        blob = DnnInvoke.BlobFromImage(mcopy, 1, New Size(500, 500),

                                       New MCvScalar(0 0 0), False, False)

        net.SetInput(blob)

        '

        Dim mout As New Mat

        mout = net.Forward()

        Dim fout(,,,) As Single

        fout = mout.GetData()

        '通道数=21,即21类对象

        Dim chan As Integer = fout.GetLength(1)

        '高度=500

        Dim row As Integer = fout.GetLength(2)

        '宽度=500

        Dim col As Integer = fout.GetLength(3)

        '记录21个通道对应坐标点的最大值

        Dim matrMaxValue As New Matrix(Of Single)(New Size(row, col))

        matrMaxValue.SetZero()

        ''记录对应通道号

        'Dim matrMaxChan As New Matrix(Of Single)(New Size(row, col))

        'matrMaxChan.SetZero()

        '记录对应颜色

        Dim imgOut As New Image(Of Bgr, Byte)(col, row)

        imgOut.SetZero()

        '遍历21个通道

        For c As Integer = 0 To chan - 1

            For h As Integer = 0 To row - 1

                '遍历高度和宽度,获得对应坐标的值

                For w As Integer = 0 To col - 1

                    '比较最大值

                    If fout(0, c, h, w) > matrMaxValue(h, w) Then

                        '取得最大值

                        matrMaxValue(h, w) = fout(0, c, h, w)

                        ''取得通道号

                        'matrMaxChan(h, w) = c

                        '最重要的是获取通道对应颜色表的值

                        imgOut(h, w) = colorTable(c)

                    End If

                Next

            Next

        Next

        '显示输出的图像

        'ImageBox1.Image = imgOut.Mat

        '设置掩膜

        Dim mask As New Mat

        mask = imgOut.Mat

        '掩膜大小必须和源图像一致

        CvInvoke.Resize(mask, mask, m.Size)

        '将上面的输出图像和源图像叠加

        Dim mFinalOut As New Mat

        CvInvoke.AddWeighted(m, 0.3, mask, 0.7, 0, mFinalOut)

        ImageBox1.Image = mFinalOut

    End Sub

    '为了更好地观察,这里没有使用随机颜色

    Private Function getColorTable() As Bgr()

        Dim newColors(20) As Bgr

        newColors(0) = New Bgr(0, 0, 0)        'background

        newColors(1) = New Bgr(128, 0, 0)      'aeroplane

        newColors(2) = New Bgr(0, 128, 0)      'bicycle

        newColors(3) = New Bgr(128, 128, 0)    'bird

        newColors(4) = New Bgr(0, 0, 128)      'boat

        newColors(5) = New Bgr(128, 0, 128)    'bottle

        newColors(6) = New Bgr(0, 128, 128)    'bus

        newColors(7) = New Bgr(128, 128, 128)  'car

        newColors(8) = New Bgr(255, 0, 0)      'cat

        newColors(9) = New Bgr(0, 255, 0)      'chair

        newColors(10) = New Bgr(0, 0, 255)     'cow

        newColors(11) = New Bgr(255, 255, 0)   'diningtable

        newColors(12) = New Bgr(64, 0, 128)    'dog

        newColors(13) = New Bgr(192, 0, 128)   'horse

        newColors(14) = New Bgr(64, 128, 128)  'motorbike

        newColors(15) = New Bgr(192, 128, 128) 'person

        newColors(16) = New Bgr(0, 64, 0)      'pottedplant

        newColors(17) = New Bgr(128, 64, 64)   'sheep

        newColors(18) = New Bgr(0, 192, 0)     'sofa

        newColors(19) = New Bgr(128, 192, 0)   'train

        newColors(20) = New Bgr(0, 64, 128)    'tvmonitor

        Return newColors

    End Function

    '显示颜色表及对象名称

    '参数1:对象名称的字符串数组

    '参数2bgr颜色数组

    Private Sub showColorTable(ByVal names() As String, ByVal colors() As Bgr)

        Dim lstmoutV As New List(Of Mat)

        For i As Integer = 0 To 20

            Dim moutV As New Mat(40, 200, DepthType.Cv8U, 3)

            moutV.SetTo(New MCvScalar(colors(i).Blue, colors(i).Green, colors(i).Red))

            CvInvoke.PutText(moutV, names(i), New Point(20, 25), FontFace.HersheyTriplex, 0.4, New MCvScalar(255, 255, 255))

            lstmoutV.Add(moutV)

        Next

        Dim mout As New Mat

        '垂直方向拼接

        CvInvoke.VConcat(lstmoutV.ToArray, mout)

        CvInvoke.Imshow("colortable", mout)

End Sub

输出结果如下图所示:

 

图11-4 FCN分割获得不同对象区域

11.6.2 实例分割 MASK RCNN

Mask RCNN是一种基于Faster R-CNN的实例分割算法,它是一种联合目标检测和语义分割的方法,能够同时检测图像中的对象并得到每个对象的位置、类别和像素级别的分割结果。Mask RCNN在实例分割任务中表现优秀,是目前最先进的实例分割算法之一,被广泛应用于自动驾驶、智能监控等领域。

【代码位置:frmChapter11】Button6_Click、getRadomColor

   '实例分割 mask rcnn

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click

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

        Dim classnames() As String

        classnames = File.ReadAllLines("C:\learnEmgucv\maskrcnn\object_detection_classes_coco.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

        net = DnnInvoke.ReadNetFromTensorflow("C:\learnEmgucv\maskrcnn\frozen_inference_graph.pb",

                             "C:\learnEmgucv\maskrcnn\mask_rcnn_inception_v2_coco_2018_01_28.pbtxt"

                              )

        Dim mcopy As New Mat

        mcopy = m.Clone

        Dim blob As Mat

        blob = DnnInvoke.BlobFromImage(mcopy, 1, New Size(500, 500),

                                       New MCvScalar(0 0 0), False, False)

        net.SetInput(blob)

        Dim names(1) As String

        names0 = "detection_out_final"

        names1 = "detection_masks"

        '返回的mout包含两个mat

        Dim mout As New VectorOfMat

        net.Forward(mout, names)

        '第一个mat标识返回的置信度候选框,是一个四维数组

        Dim moutBox As New Mat

        moutBox = mout(0)

        '返回维度:

        '1维:1

        '2维:1

        '3维:100100个候选置信矩形框

        '4维:70?;1:对应类别;2:置信度;3-6:候选框位置(源图像百分比)

        Dim foutBox(,,,) As Single

        foutBox = moutBox.GetData()

        '第二个mat标识返回的掩膜,是一个四维数组   

        Dim moutMask As New Mat

        moutMask = mout(1)

        '返回维度:

        '1维:100100个对象对应的100个掩膜

        '2维:90,对象的置信度

        '3维:15,掩膜高度

        '4维:15,掩膜宽度

        Dim foutMask(,,,) As Single

        foutMask = moutMask.GetData()

        Dim maskH As Integer = 15   'foutMask.GetLength(2)

        Dim maskW As Integer = 15   'foutMask.GetLength(3)

        '新建Mat,用来在这上面绘制掩膜

        Dim mbg As New Mat(New Size(m.Width, m.Height), DepthType.Cv8U, 3)

        mbg.SetTo(New MCvScalar(0, 0, 0))

        For i As Integer = 0 To 100 - 1

            '置信度

            Dim conf As Single = foutBox(0, 0, i, 2)

            '当置信度满足时

            If conf > 0.53 Then

                '对应检测对象的序号

                Dim objID As Integer = foutBox(0, 0, i, 1)

                Dim ltX As Single = foutBox(0, 0, i, 3) * wm '左上角X

                Dim ltY As Single = foutBox(0, 0, i, 4) * hm '左上角Y

                Dim rbX As Single = foutBox(0, 0, i, 5) * wm '右下角X

                Dim rbY As Single = foutBox(0, 0, i, 6) * hm '右下角Y

                Dim w As Single = rbX - ltX '宽度

                Dim h As Single = rbY - ltY '高度

                '绘制包围矩形框

                CvInvoke.Rectangle(m, New Rectangle(ltX, ltY, w, h), New MCvScalar(0, 0, 255), 1)

                '绘制对象名称

                CvInvoke.PutText(m, classnames(objID), New Point(ltX, ltY - 10), FontFace.HersheyTriplex, 0.3, New MCvScalar(255, 0, 0))

                '开始处理掩膜

                Dim mmask As New Mat()

                '掩膜大小为15*15,对应foutMask最后两个维度

                Dim bmask(14, 14) As Single

                For j As Integer = 0 To 14

                    For k As Integer = 0 To 14

                        bmask(j, k) = foutMask(i, objID, j, k)

                    Next

                Next

                '将数组转为Mat

                Dim matrmask As New Matrix(Of Single)(bmask)

                mmask = matrmask.Mat

                '大小放大与对应包围矩形框一致

                CvInvoke.Resize(mmask, mmask, New Drawing.Size(w, h))

                '二值化

                CvInvoke.Threshold(mmask, mmask, 0.3, 255, ThresholdType.Binary)

                '由于本身是CV32F,需要处理为CV8U,才能使用FindContours

                mmask.ConvertTo(mmask, DepthType.Cv8U)

                '定义关注区域,当修改关注区域时,也就修改了源图像

                Dim mRoi As New Mat(mbg, New Rectangle(ltX, ltY, w, h))

                '查找轮廓

                Dim contours As New VectorOfVectorOfPoint

                CvInvoke.FindContours(mmask, contours, Nothing, RetrType.External, ChainApproxMethod.ChainApproxSimple)

                '填充轮廓

                CvInvoke.DrawContours(mRoi, contours, -1, getRadomColor(), -1)

            End If

        Next

        Dim mresult As New Mat

        '加法

        CvInvoke.AddWeighted(m, 1, mbg, 0.4, 0, mresult)

        ImageBox1.Image = mresult

    End Sub

    '获得随机颜色

    Private Function getRadomColor() As MCvScalar

        Dim rd As New Random(Now.Millisecond)

        Dim r, g, b As Byte

        b = rd.Next(256)

        g = rd.Next(256)

        r = rd.Next(256)

        Return New MCvScalar(b, g, r)

End Function

输出结果如下图所示:

 

图11-5 Mask RCNN 分割得到对象区域和类别

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

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

相关文章

如何升级用 Helm 安装的极狐GitLab Runner?

本分分享如何对 Helm 安装的 Runner 进行升级。整个过程分为三步:1、确定 Runner 最新版本或者想要升级的版本是否存在;2、用 Helm upgrade 命令进行升级;3、升级确认。 极狐GitLab 为 GitLab 的中国发行版,中文版本对中国用户更…

【西电电装实习】6. 手装无人机的蓝牙断连debug

文章目录 前言零、闪灯状态零零、翻滚角,俯仰角,偏航角一、问题描述二、现象解释三、解决方案参考文献 前言 在 西电无人机电装实习 时遇到的问题使用蓝牙芯片 CH582F。沁恒的蓝牙芯片CH582F是一款集成了BLE(Bluetooth Low Energy&#xff0…

华为初级认证HCIA怎么样?

想在网络技术领域实现职业突破吗?华为HCIA初级认证是专为网络领域的新手与初学者设计的一项入门级认证。它旨在评估并确认个人对网络基本原理和技术知识的扎实掌握,是步入华为认证体系大门的基石。 一、华为HCIA 初级认证概述 华为初级认证网络工程师&am…

分类预测|基于黑翅鸢优化核极限学习机的数据分类预测Matlab程序BKA-KELM 多特征输入多类别输出 含基础KELM

分类预测|基于黑翅鸢优化核极限学习机的数据分类预测Matlab程序BKA-KELM 多特征输入多类别输出 含基础KELM 文章目录 一、基本原理BKA-HKELM 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 BKA-HKELM 分类预测原理和流程 1. 黑翅鸢优化…

最好用的翻译器:什么是DeepL?如何订阅支付DeepL,订阅DeepL Pro以及申请DeepL API?

DeepL目前最好用的翻译软件,如果是学习翻译的同学或者海外客户翻译,一定不能错过,用它来处理文件,论文等翻译是最好不过了的!!! AI翻译技术的飞速发展正在颠覆我们的沟通方式,打破语…

6年前倒闭的机器人独角兽,再次杀入AGV市场

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 在科技创新的浪潮中,一个曾经辉煌又迅速陨落的企业正悄然重生,引发业界广泛关注。 曾经的协作机器人鼻祖Rethink Robotic…

机器学习周报(9.9-9.15)-Pytorch学习(三)

文章目录 摘要Abstract1 损失函数与反向传播1.1 L1Loss损失函数1.2 MSELoss损失函数1.3 交叉熵损失函数(CrossEntropyLoss)1.4 反向传播 2 优化器3 现有网络模型的使用及修改4 网络模型的保存与读取4.1 保存模型4.2 读取 总结 摘要 本次学习对Pytorch中…

8.3Sobel算子边缘检测

实验原理 Sobel算子是一种广泛使用的一阶导数边缘检测算子,它通过计算图像在水平和垂直方向上的梯度来检测边缘。Sobel算子使用一对3x3的掩模来实现这一功能。相比于其他边缘检测算子,Sobel算子在检测边缘的同时还能提供一定的抗噪能力。 在OpenCV中&a…

【射频通信电子线路基础第四讲】LC匹配网络、史密斯圆图、噪声与噪声系数

一、LC匹配网络 1、L-I型(负载与电抗并联) 2、L-II型(负载与电抗串联) 3、T型网络和π型网络例子 二、Smith圆图 这里先附上知乎大神的讲解链接,推荐直接去看非常适合入门理解,看完之后茅塞顿开 https://…

MySQL 安全机制全面解析

‍ 在如今的数字化时代,数据库安全 变得越来越重要。为了防止对数据库进行非法操作,MySQL 定义了一套完整的安全机制,包括用户管理、权限管理 和 角色管理。本文将为你深入浅出地介绍这三大安全机制,帮助你轻松掌握MySQL的安全管…

MPP数据库之SelectDB

SelectDB 是一个高性能、云原生的 MPP(大规模并行处理)数据库,旨在为分析型数据处理场景提供快速、弹性和高效的解决方案。它专为处理大规模结构化和半结构化数据设计,常用于企业级业务分析、实时分析和决策支持。 SelectDB 是在…

Vue2时间轴组件(TimeLine/分页、自动顺序播放、暂停、换肤功能、时间选择,鼠标快速滑动)

目录 1介绍背景 2实现原理 3组件介绍 4代码 5其他说明 1介绍背景 项目背景是 一天的时间轴 10分钟为一间隔 一天被划分成144个节点 一页面12个节点 代码介绍的很详细 可参考或者借鉴 2实现原理 对Element-plus滑块组件的二次封装 基于Vue2(2.6.14&#x…

数字孪生引领智慧医院革新:未来医疗的智能化之路

数字孪生(Digital Twin) 是指将物理实体或系统的数字化模型与其实时运行数据相结合,以反映实体的状态、行为和性能,并通过数据分析和仿真来优化决策和管理。在智慧医院建设中,数字孪生技术扮演着关键角色。 1. 数字孪生…

基于SpringBoot+Vue的瑜伽体验课预约管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

国内按月/季/年使用GPT4.0及OpenAI最新的模型

其实gpt官方版本不仅对于网络要求很高,且订阅用户对高级模型的使用也是有次数限制的, 国内想要稳定且最快同步官网的最新模型,我推荐一个地址,可以方便的不限次数的使用GPT4.0等模型, 今天早上刚出的OpenAI全新的草莓模型&#xf…

uniapp 发布苹果IOS详细流程,包括苹果开发者公司账号申请、IOS证书、.p12证书文件等

记录一下uniapp发布苹果IOS的流程。 一、苹果开发者公司账号申请 1、邓白氏编码申请(先申请公司邓白氏编码,这一步需要1-2周,没有这个编码苹果开发者没法申请,已有编码的跳过此步骤): 1)联系苹…

【C++ Primer Plus习题】16.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> usin…

Linux通配符*、man 、cp、mv、echo、cat、more、less、head、tail、等指令、管道 | 、指令的本质 等的介绍

文章目录 前言一、Linux通配符*二、man 指令三、 cp 指令四、mv指令五、 echo 指令六、cat 指令七、more 指令八、 less 指令九、 head 指令十、 tail指令十一、 管道 |十二、指令的本质总结 前言 Linux通配符*、man 、cp、mv、echo、cat、more、less、head、tail、等指令、管…

[Unity Demo]重启项目之从零开始制作空洞骑士Hollow Knight第一集:导入素材以及建立并远程连接git仓库

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、导入素材二、使用步骤 1.建立并远程连接git2.github和仓库连接总结 前言 好久没来CSDN看看&#xff0c;突然看到前两年自己写的文章从零开始制作空洞骑士只…

【计算机网络 - 基础问题】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…