EmguCV学习笔记 VB.Net 2.5 Mat类、Matrix类和Image类的相互转换

news2024/9/23 9:32:31

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

EmguCV学习笔记目录 Vb.net

EmguCV学习笔记目录 C#

笔者的博客网址:VB.Net-CSDN博客

教程相关说明以及如何获得pdf教程和代码(博客上的教程内容会和pdf教程一致,教程中也会包含所有代码),请移步:EmguCV学习笔记

​​​​​​​

2.5 Mat类、Matrix类和Image类的相互转换

Mat类、Matrix类和Image类的联系:

1、Mat和Image都可以用于存储图像数据,但Image只能用于存储具有颜色和深度信息的图像数据。

2、Mat和Image都可以进行图像的基本操作,如剪裁、缩放、旋转等。

3、Matrix和Mat都可以用于存储矩阵数据,并可以进行矩阵的基本操作,如转置、逆运算、矩阵乘法等。

4、此外,Cvinvoke类提供的方法,既支持Mat也支持Image,例如Add方法。

Mat类、Matrix类和Image类的区别:

1、Mat可以存储任意类型的图像数据,包括单通道和多通道的数据;而Image只能用于存储具有颜色和深度信息的图像数据。

2、Matrix只能用于存储矩阵数据,不能用于存储图像数据。

在使用时,我们应该根据实际需求选择合适的类来处理图像和矩阵数据。如果只是简单的图像处理,可以使用Image类;如果需要进行更复杂的矩阵运算,可以使用Mat类;而如果需要更高效、更灵活的矩阵运算,可以使用Matrix类。

Mat类、Matrix类和Image类的相互转换

Mat、Image和Matrix都是表示图像和矩阵数据的类。它们之间可以通过一些方法相互转换。

下面的小节将说明如何在Mat、Image、Matrix以及.Net提供的Bitmap类之间相互转换。

2.5.1 Image到Mat的转换

直接使用Image类的Mat属性。

【代码位置:frmChapter2_4】Button1_Click、outputMatInfo、outputMatdata8U1CAfter

    'ImageMat

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click        '

        Dim img As New Image(Of Gray, Byte)(New Size(3, 4))

        img.SetValue(New MCvScalar(200))

        '注意,此时mIsContinuous属性是false,也就是数据不连续

        Dim m As Mat

        m = img.Mat

        Call outputMatInfo(m)

        Call outputMatdata8U1CAfter(m)

    End Sub

    '输出Mat信息

    Private Sub outputMatInfo(ByVal m As Mat)

        Console.WriteLine("Cols" & m.Cols)

        Console.WriteLine("Rows" & m.Rows)

        Console.WriteLine("Depth" & m.Depth)

        Console.WriteLine("ElementSize" & m.ElementSize)

        Console.WriteLine("Height" & m.Height)

        Console.WriteLine("Width" & m.Width)

        Console.WriteLine("NumberOfChannels" & m.NumberOfChannels)

        Console.WriteLine("Step" & m.Step)

        Console.WriteLine("Width*Height" & m.Size.Width & "*" & m.Size.Height)

        Console.WriteLine("IsContinuous" & m.IsContinuous)

        Console.WriteLine("=====================")

    End Sub

    '修改后的方法(考虑数据不连续的情况)

    '输出矩阵,为简化说明,这里参数为8U单通道Mat

    Private Sub outputMatdata8U1CAfter(ByVal m As Mat)

        Dim colcount As Integer = m.Cols

        Dim rowcount As Integer = m.Rows

        Dim matstep As Integer = m.Step

        '每次读取数据时候的指针位置

        Dim pos As IntPtr = IntPtr.Zero

        For i As Integer = 0 To rowcount 1

            '检查指针位置,

            '如果是第一次循环,即pos初始为0,那么指针位置为mat的指针位置

            '否则,应该将指针位置增加step

            If pos = IntPtr.Zero Then

                pos = m.DataPointer

            Else

                pos += matstep

            End If

            Dim bufferSize As Integer = colcount

            Dim buffer() As Byte

            ReDim buffer(bufferSize 1)

            '每次循环从新的指针位置拷贝数据,拷贝的数量为mat的列数。

            System.Runtime.InteropServices.Marshal.Copy(pos, buffer, 0, bufferSize)

            For col As Integer = 0 To colcount 1

                Console.Writebuffer(col) & " "

            Next

            Console.WriteLine()

        Next

End Sub

运行后如下图所示:

 

图2-75 Image转Mat后的信息

注意:上述代码运行后返回的信息:

Step:4

IsContinuous:False

这是因为在EmguCV中,Image类的Data属性表示图像数据的指针。对于一个M*N的单通道图像,其Data属性的大小本应该是M*N个字节。但是,由于内存对齐的原因(通常是按照4个字节来对齐),实际上分配给图像数据的内存大小可能会大于M*N个字节。

针对上述代码,其中创建了一个3*4的单通道图像img,该图像的深度为Byte,每个像素占用1个字节。因此,该图像的总共应该占用3*4=12个字节。但是,由于内存对齐的原因,这里总共分配了16个字节给该图像数据。

2.5.2 Matrix转Mat

直接使用Matrix类的Mat属性。

在【2.3.1 构造函数】中已经讲解过,这里不再赘述。

2.5.3 Image转Matrix

使用Image类的CopyTo方法。

【代码位置:frmChapter2_4】Button2_Click

    '灰度Imagematrix

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim img As New Image(Of Gray, Byte)("C:\learnEmgucv\lena.jpg")

        '分配Matrix大小

        Dim matr As New Matrix(Of Byte)(img.Size)

        img.CopyTo(matr)

        'matrix不能直接转图片

        Dim mDst As Mat

        mDst = matr.Mat

        '这里使用.NetPictureBox,使用Mat转为了Bitmap

        PictureBox1.Image = mDst.ToBitmap

End Sub

运行后如下图所示:

 

图2-76 灰度图像转matrix后的显示

【代码位置:frmChapter2_4】Button3_Click

    '彩色Imagematrix

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

        '由于使用Image(Of Bgr, Byte),后面的matr必须指明通道数(3

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        '分配Matrix大小,注意,这里指明了3通道

        Dim matr As New Matrix(Of Byte)(img.Rows, img.Cols, 3)

        img.CopyTo(matr)

        'matrix不能直接转图片

        Dim mDst As Mat

        mDst = matr.Mat

        '这里使用.NetPictureBox,使用Mat转为了Bitmap

        PictureBox1.Image = mDst.ToBitmap

End Sub

运行后如下图所示:

 

图2-77 彩色图像转matrix后的显示

2.5.4 Mat转Matrix

使用Mat类的CopyTo方法。

【代码位置:frmChapter2_4】Button4_Click

    'MatMatrix

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

        Dim m As New Mat("C:\learnEmgucv\lena.jpg", CvEnum.ImreadModes.Grayscale)

        '需要注意通道数

        Dim matr As New Matrix(Of Byte)(m.Size)

        'MatCopyTo方法

        m.CopyTo(matr)

        Dim mDst As Mat

        mDst = matr.Mat

        PictureBox1.Image = mDst.ToBitmap

End Sub

运行后如下图所示:

 

图2-78 Mat转matrix后的显示

2.5.5 Image转Bitmap

使用Image类的ToBitmap方法。

【代码位置:frmChapter2_4】Button5_Click

    'ImageBitmap

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

        Dim img As New Image(Of Bgr, Byte)("C:\learnEmgucv\lena.jpg")

        Dim bmp As Bitmap = img.ToBitmap()

        PictureBox1.Image = bmp

End Sub

运行后如下图所示:

 

图2-79 Image转Bitmap后的显示

2.5.6 Bitmap转Image

使用BitmapExtension类的ToImage方法进行转换。

【代码位置:frmChapter2_4】Button6_Click

    'BitmapImage

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

        Dim bmp As New Bitmap("C:\learnEmgucv\lena.jpg")

        Dim img As Image(Of Bgr, Byte)

        img = BitmapExtension.ToImage(Of Bgr, Byte)(bmp)

        '如果转灰度,应将Bgr修改为Gray,如下代码:

        'Dim img As Image(Of Gray, Byte)

        'img = BitmapExtension.ToImage(Of Gray, Byte)(bmp)

        PictureBox1.Image = img.ToBitmap

End Sub

运行后如下图所示:

 

图2-80 Bitmap转Image后的显示

2.5.7 Mat转Bitmap

使用Mat类的ToBitmap方法。

【代码位置:frmChapter2_4】Button7_Click

    'MatBitmap

    Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click

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

        Dim bmp As Bitmap = m.ToBitmap()

        PictureBox1.Image = bmp

End Sub

运行后如下图所示:

 

图2-81 Mat转Bitmap后的显示

2.5.8 Bitmap转Mat

1、使用BitmapExtension的ToMat方法

【代码位置:frmChapter2_4】Button8_Click

    'BitmapMat1

    Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click

        Dim bmp As New Bitmap("C:\learnEmgucv\lena.jpg")

        Dim m As New Mat

        m = BitmapExtension.ToMat(bmp)

        PictureBox1.Image = m.ToBitmap

End Sub

运行后如下图所示:

 

图2-82 Bitmap转Mat后的显示

2、使用BitmapData

【代码位置:frmChapter2_4】Button9_Click

      'BitmapMat2

    Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click

        Dim bmp As New Bitmap("C:\learnEmgucv\lena.jpg")

        Dim bmpdata As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb)

        '需要计划好Mat的大小、深度、通道数、步长

        Dim m As New Mat(bmp.Height, bmp.Width, CvEnum.DepthType.Cv8U, 3, bmpdata.Scan0, bmpdata.Stride)

        bmp.UnlockBits(bmpdata)

        PictureBox1.Image = m.ToBitmap

End Sub

运行后如下图所示:

 

图2-83 Bitmap转Mat后的显示

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

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

相关文章

基于Vue的MES生产制造执行系统

TOC springboot307基于Vue的MES生产制造执行系统 第1章 绪论 1.1 选题动因 到现在为止,互联网已经进入了千家万户,最普通的平民百姓也有属于自己的智能设备,计算机各种技术的储备也是相当的丰富,并且实现也是没有难度&#xf…

VSCode配置ssh免密连接远程服务器

我配置了免密设置(Windows利用ssh免密码登录Linux),git bash已经能够正常连接了,但是vscode还是不行,很奇怪。 VSCode报错信息: [17:55:50.360] SSH Resolver called for "ssh-remote106.52.2.19", attempt 5, (Recon…

《机器学习》——运用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法的简单介绍下载OpenCV库实验内容实验结果完整代码自己手写数字传入模型中测试 KNN算法的简单介绍 一、KNN算法的基本要素 K值的选择:K值代表选择与新测试样本距离最近的前K个训练样本数,通常K是不大于20的整数。K值的选择对算法结果有重…

电压检测之比较电路

设计这款电路主要是本人在锂电池充电电路中挖了一个坑,对电源显示芯片的数据手册内容撰写不够详细的不好感受,所以自己根据比较电路的思想设计出了电压检测并反馈的电路,亦在提供一种电压检测的思想不需要借助ADC采集,在电路硬件上…

基于hive的海鲜交易数据分析系统设计与实现【hadoop、Flask、某东爬虫、sqoop、flume、mysql、hdfs】商品可换

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍研究背景国内外研究现状研究目的研究意义 关键技术理论介绍数据采集及预处理数据采集字段介绍数据预处理hadoop集群搭建及实现过程hive建表hive大数据分析 可视化展示店铺维度画像分…

AR 眼镜之-开关机定制-实现方案

目录 📂 前言 AR 眼镜系统版本 开关机定制 1. 🔱 技术方案 1.1 技术方案概述 1.2 实现方案 1)开机 Logo 2)开机音效 3)开机动画 4)关机动画 5)关机弹窗 2. 💠 开机 Logo…

C++笔试题汇总

C笔试题汇总记录 一、概述二、概念分类1. 结构体1. C 和 C 中 struct 有什么区别?2. C中的 struct 和 class 有什么区别? 2. 类相关1. 类的大小1. 空类的大小2. 一般非空类大小3. 有虚函数类4. 有虚函数类的继承5. 只有虚函数6. 静态数据成员 2. C的三大…

【分享】格力手机色界G0245D 刷REC、root、 救砖、第三方rom教程和资源

开门见山 帮别人弄了一台 格力G0245D,把找到的资源和教程分享一下 教程 这个写的很详细了格力手机色界G0245D-Root-最简指南 不过教程里刷rec这一步漏了加上电源键,加上就行了。 附加参考:格力手机2刷机 格力手机二代刷机 GREE G0215D刷机…

C++ 特殊类设计以及单例模式

目录 1 不能被拷贝 2 只能在堆上创建对象 3 只能在栈上创建对象 4 禁止在堆上创建对象 5 不能被继承的类 6 单例类 特殊类就是一些有特殊需求的类。 1 不能被拷贝 要设计一个防拷贝的类,C98之前我们只需要将拷贝构造以及拷贝赋值设为私有,同时只声明…

在HFSS中对曲线等结构进行分割(Split)

在HFSS中对曲线进行分割 我们往往需要把DXF等其他类型文件导入HFSS进行分析,但是有时需要对某一个曲线单独进行分割成两段修改。 如果是使用HFSS绘制的曲线,我们修改起来非常方便,修改参数即可。但是如果是导入的曲线,则需要使用…

代码随想录训练营 Day31打卡 贪心算法 part05 56. 合并区间 738. 单调递增的数字 968. 监控二叉树

代码随想录训练营 Day31打卡 贪心算法 part05 一、 力扣56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中…

【JavaEE】JVM 内存区域划分,以及 Java 垃圾回收机制引用计数器,可达性分析等

目录 1. JVM执行流程 2. JVM运行时数据区 2.1 堆 2.2 Java虚拟机栈(线程私有) 2.3本地方法栈(线程私有) 2.4 程序计数器 2.5 元数据区 3. JVM的类加载机制 1) 加载 2) 验证 3) 准备 4) 解析 5) 初始化 双亲委派模型 4. java垃圾回收 4.1 死亡对象判断方法 a) …

超精细CG杰作:8K壁纸级官方艺术插画,展现极致美丽与细节的汉服女孩

极致精美的数字艺术杰作:8K壁纸级别的官方插画,展现超高清细节与和谐统一的美感,女孩的精致面容与眼神在光影下熠熠生辉,汉服主题下的超高分辨率作品,文件巨大,细节丰富,令人惊叹。 正向提示词…

内存泄漏之如何使用Visual Studio的调试工具跟踪内存泄漏?

使用Visual Studio的调试工具跟踪内存泄漏是一个系统性的过程,主要包括启用内存泄漏检测、运行程序、分析内存使用情况以及定位泄漏源等步骤。 Visual Studio提供了多种方式来检测内存泄漏,你可以根据自己的需求选择合适的方法。 注意:下面…

父页面选项式api,子页面组合式api,子页面如何获取父页面的方法以及传值到将子页面的值传给父页面

开发的项目中是vue3的项目,但是有些同事用vue2中的选项式api写法,有些同事使用的是vue3组合式api的写法,此时子页面需要获取父页面的方法把数据传入父页面的方法中 父页面: 在父页面中order-item组件中创建自定义方法navigation和…

Leetcode每日刷题之剑指offer 57.和为s的两个数字(C++)

1.题目解析 现在题目改名为LCR.查找总价值为目标值的两个商品,虽然题目改变但是核心并未变化,都是需要寻找出和为指定数字的两数 2.算法原理 我们由题目知道给出的数组是递增的,所以在数组的首尾固定两个指针,判断其和是否为指定数…

Ceph篇之利用shell脚本实现批量创建bucket桶

Ceph创建bucket桶 在 Ceph 中创建桶(bucket)需要使用 Ceph 对象网关(RGW)。 注:如果查看shell批量创建脚本请直接参见目录3 1. 利用radosgw-admin工具创建桶 确保 Ceph 集群和对象网关已正确配置 确保你的 Ceph 集群…

快速了解Vi 和 Vim 编辑器三种模式及快捷键使用

😀前言 本篇博文是关于Vi 和 Vim 编辑器的三种模式及快捷键使用,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意…

大数据产业链图谱_产业链全景图_大数据行业市场分析

数据作为新型生产要素,是数字化、网络化、智能化的基础,已快速融入生产、分配、流通、消费和社会服务管理等各环节,影响着千行百业,推动着我国数字经济的蓬勃发展。 大数据又称巨量数据、海量数据,是由数量巨大、结构…

C语言 | Leetcode C语言题解之第341题扁平化嵌套列表迭代器

题目&#xff1a; 题解&#xff1a; struct NestedIterator {int *vals;int size;int cur; };void dfs(struct NestedIterator *iter, struct NestedInteger **nestedList, int nestedListSize) {for (int i 0; i < nestedListSize; i) {if (NestedIntegerIsInteger(neste…