三、Mat、Bitmap和Image数据类型之间的转换(OpenCvSharp)

OpenCV中可以通过ImRead方法读取照片,通过ImShow方法显示照片;但是无法在PictureBox控件中显示
PictureBox控件只能展示BitmapImage数据类型图片

为此查阅了网上很多篇博文,将三种数据类型之间的转换进行了归纳整理,感谢网上大佬们的博文分享,参考的内容过多就不再一一感谢了哈。

本篇博文以展示图片的效果进行演示,Mat数据类型通过OpenCV展示Bitmap数据类型和Image数据类型通过pictureBox控件进行展示

零、前期准备工作

1,页面布局

注意button的序号哈
在这里插入图片描述

2,命名空间

引入OpenCvSharp命名空间

using OpenCvSharp;
using OpenCvSharp.Extensions;

在这里插入图片描述
在这里插入图片描述
这仨必须有哈,没有的话就从旁边的浏览里面搜索下载

3,照片准备

为了更好的演示效果,每个功能对应的照片都进行了设计,一共九张
例如:
Bitmap.png,表示将来读入的是Bitmap数据类型,将来展示的也是Bitmap数据类型形式在控件中显示
Mat2Image.png,表示将来读入的是Mat数据类型,转换为Image数据类型之后在控件中显示
Bitmap2Mat.png,表示将来读入的是Bitmap数据类型,转换为Mat数据类型之后通过ImShow方法进行显示
Mat.png,表示通过ImRead方法读入Mat数据类型图片,之后通过ImShow方法进行显示
以此类推哈

在这里插入图片描述

3,图片路径对应说明

string SelfMat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat.png";
string Mat2Bitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat2Bitmap.png";
string Mat2Image = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat2Image.png";string SelfBitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap.png";
string Bitmap2Mat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap2Mat.png";
string Bitmap2Image = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap2Image.png";string SelfImage = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image.png";
string Image2Mat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image2Mat.png";
string Image2Bitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image2Bitmap.png";

SelfMat 这样的代表将来读入的是Mat数据类型
Bitmap2Mat 这样的代表将来读入的是Bitmap数据类型,转换为Mat数据类型之后通过ImShow方法进行显示
Mat2Image这样的代表将来通过ImRead方法读入Mat数据类型,转换为Image数据类型之后显示到控件中
以此类推

一、Mat数据类型

通过OpenCV的ImRead方法读取的都是Mat数据类型
通过ImShow方法进行显示照片即可

Mat mat = new Mat();new一个Mat对象,起名为mat
mat = Cv2.ImRead(SelfMat,ImreadModes.Color);读取SelfMat图片,显示三通道彩色图片ImreadModes.Color,此时mat为Mat数据类型的图片
Cv2.NamedWindow("Mat", WindowFlags.Normal);命名一个窗口,窗口左上角显示为Mat,窗口可调节大小WindowFlags.Normal
Cv2.ImShow("Mat", mat);显示Mat窗口,显示的内容为Mat数据类型对象mat
Cv2.WaitKey(0);等待用户响应
Cv2.DestroyWindow("Mat");摧毁Mat窗口

private void button1_Click(object sender, EventArgs e)
{Mat mat = new Mat();mat = Cv2.ImRead(SelfMat,ImreadModes.Color);Cv2.NamedWindow("Mat", WindowFlags.Normal);Cv2.ImShow("Mat", mat);Cv2.WaitKey(0);Cv2.DestroyWindow("Mat");
}

二、Bitmap数据类型

Bitmap数据类型和Image可以直接在控件中进行展示,将图片赋值给控件的Image属性即可

Bitmap bitmap = new Bitmap(SelfBitmap);以Bitmap数据类型读取SelfBitmap照片,此时bitmap为Bitmap数据类型的图片
pictureBox1.Image = bitmap;赋值给pictureBox1控件的Image属性,将Bitmap数据类型图片bitmap显示到控件中

private void button2_Click(object sender, EventArgs e)
{Bitmap bitmap = new Bitmap(SelfBitmap);pictureBox1.Image = bitmap;
}

三、Image数据类型

这里需要通过FromFile方法读入图片

Image image = Image.FromFile(SelfImage);以Image数据类型读取SelfImage照片,此时image为Image数据类型的图片
pictureBox1.Image = image;赋值给pictureBox1控件的Image属性,将Image数据类型图片image显示到控件中

private void button3_Click(object sender, EventArgs e)
{Image image = Image.FromFile(SelfImage);pictureBox1.Image = image;
}

四、Mat数据类型转Bitmap数据类型

Mat数据类型可通过ToBitmap方法转换为Bitmap数据类型

Mat mat_mat2bitmap = new Mat();创建Mat数据类型对象mat_mat2bitmap
mat_mat2bitmap = Cv2.ImRead(Mat2Bitmap, ImreadModes.Color);读取Mat2Bitmap图片,显示三通道彩色图片ImreadModes.Color,此时mat_mat2bitmap为Mat数据类型的图片
Bitmap bitmap_mat2bitmap = mat_mat2bitmap.ToBitmap();通过ToBitmap方法,将Mat数据类型对象mat_mat2bitmap转换为Bitmap数据类型对象bitmap_mat2bitmap
pictureBox1.Image = bitmap_mat2bitmap;赋值给pictureBox1控件的Image属性,将Bitmap数据类型图片bitmap_mat2bitmap显示到控件中

 private void button4_Click(object sender, EventArgs e){Mat mat_mat2bitmap = new Mat();mat_mat2bitmap = Cv2.ImRead(Mat2Bitmap, ImreadModes.Color);Bitmap bitmap_mat2bitmap = mat_mat2bitmap.ToBitmap();pictureBox1.Image = bitmap_mat2bitmap;}

五、Mat数据类型转Image数据类型

Mat数据类型转Image数据类型我没找到直接转换的方法
使用的方法是:Mat转Bitmap再转Image

Mat mat_mat2image = new Mat();new一个Mat对象,起名为mat_mat2image
mat_mat2image = Cv2.ImRead(Mat2Image, ImreadModes.Color);读取Mat2Image图片,显示三通道彩色图片ImreadModes.Color,此时mat_mat2image为Mat数据类型的图片
Bitmap bitmap_mat2image = mat_mat2image.ToBitmap();通过ToBitmap方法,将Mat数据类型对象mat_mat2image转换为Bitmap数据类型对象bitmap_mat2image
Image image_mat2image = (Image)bitmap_mat2image;直接强转,将Bitmap数据类型对象bitmap_mat2image转换为Image数据类型对象image_mat2image
pictureBox1.Image = image_mat2image;赋值给pictureBox1控件的Image属性,将Image数据类型图片image_mat2image显示到控件中

private void button5_Click(object sender, EventArgs e)
{Mat mat_mat2image = new Mat();mat_mat2image = Cv2.ImRead(Mat2Image, ImreadModes.Color);Bitmap bitmap_mat2image = mat_mat2image.ToBitmap();Image image_mat2image = (Image)bitmap_mat2image;pictureBox1.Image = image_mat2image;
}

六、Bitmap数据类型转Mat数据类型

Bitmap数据类型可通过ToMat方法转换为Mat数据类型

Bitmap bitmap_bitmap2mat = new Bitmap(Bitmap2Mat);以Bitmap数据类型读取Bitmap2Mat照片
Mat mat_bitmap2map = new Mat();new一个Mat对象,起名为mat_bitmap2map,此时mat_bitmap2map为Mat数据类型的图片
mat_bitmap2map = bitmap_bitmap2mat.ToMat();通过ToMat方法,将Bitmap数据类型对象bitmap_bitmap2mat转换为Mat数据类型对象mat_bitmap2map
Cv2.NamedWindow("Bitmap2Mat", WindowFlags.Normal);命名一个窗口,窗口左上角显示为Bitmap2Mat,窗口可调节大小WindowFlags.Normal
Cv2.ImShow("Bitmap2Mat", mat_bitmap2map);显示Bitmap2Mat窗口,显示的内容为Mat数据类型对象mat_bitmap2map
Cv2.WaitKey(0);等待用户响应
Cv2.DestroyWindow("Bitmap2Mat");摧毁Bitmap2Mat窗口

private void button6_Click(object sender, EventArgs e)
{Bitmap bitmap_bitmap2mat = new Bitmap(Bitmap2Mat);Mat mat_bitmap2map = new Mat();mat_bitmap2map = bitmap_bitmap2mat.ToMat();Cv2.NamedWindow("Bitmap2Mat", WindowFlags.Normal);Cv2.ImShow("Bitmap2Mat", mat_bitmap2map);Cv2.WaitKey(0);Cv2.DestroyWindow("Bitmap2Mat");
}

七、Bitmap数据类型转Image数据类型

Bitmap数据类型和Image数据类型可以直接强转,并且都可以在pictureBox控件中显示

Bitmap bitmap_bitmap2image = new Bitmap(Bitmap2Image);以Bitmap数据类型读取Bitmap2Image照片,此时bitmap_bitmap2image为Bitmap数据类型的图片
Image image_bitmap2image = (Image)bitmap_bitmap2image;直接强转,将Bitmap数据类型对象bitmap_bitmap2image转换为Image数据类型对象image_bitmap2image
pictureBox1.Image = image_bitmap2image;赋值给pictureBox1控件的Image属性,将Image数据类型图片image_bitmap2image显示到控件中

private void button7_Click(object sender, EventArgs e)
{Bitmap bitmap_bitmap2image = new Bitmap(Bitmap2Image);Image image_bitmap2image = (Image)bitmap_bitmap2image;pictureBox1.Image = image_bitmap2image;
}

八、Image数据类型转Mat数据类型

Mat数据类型转Image数据类型我也没找到直接转换的方法
使用的方法是:Image转Bitmap再转Mat
Image image_image2mat = Image.FromFile(Image2Mat);通过FromFile方法以Image数据类型读取Image2Mat照片,此时image_image2mat为Image数据类型的图片
Bitmap bitmap_image2mat = (Bitmap)image_image2mat;直接强转,将Image数据类型对象image_image2mat转换为Bitmap数据类型对象bitmap_image2mat
Mat mat_image2mat = new Mat();new一个Mat对象,起名为mat_image2mat
mat_image2mat = bitmap_image2mat.ToMat();通过ToMat方法,将Bitmap数据类型对象bitmap_image2mat转换为Mat数据类型对象mat_image2mat
Cv2.NamedWindow("Image2Mat", WindowFlags.Normal);命名一个窗口,窗口左上角显示为Image2Mat,窗口可调节大小WindowFlags.Normal
Cv2.ImShow("Image2Mat", mat_image2mat);显示Image2Mat窗口,显示的内容为Mat数据类型对象mat_image2mat
Cv2.WaitKey(0);等待用户响应
Cv2.DestroyWindow("Image2Mat");摧毁Image2Mat窗口

private void button8_Click(object sender, EventArgs e)
{Image image_image2mat = Image.FromFile(Image2Mat);Bitmap bitmap_image2mat = (Bitmap)image_image2mat;Mat mat_image2mat = new Mat();mat_image2mat = bitmap_image2mat.ToMat();Cv2.NamedWindow("Image2Mat", WindowFlags.Normal);Cv2.ImShow("Image2Mat", mat_image2mat);Cv2.WaitKey(0);Cv2.DestroyWindow("Image2Mat");
}

九、Image数据类型转Bitmap数据类型

Image数据类型和Bitmap数据类型可以直接强转,并且都可以在pictureBox控件中显示

Image image_image2bitmap = Image.FromFile(Image2Bitmap);通过FromFile方法以Image数据类型读取Image2Bitmap照片,此时image_image2bitmap为Image数据类型的图片
Bitmap bitmap_image2bitmap = (Bitmap)image_image2bitmap;直接强转,将Image数据类型对象image_image2bitmap转换为Bitmap数据类型对象bitmap_image2bitmap
pictureBox1.Image = bitmap_image2bitmap;赋值给pictureBox1控件的Image属性,将Bitmap数据类型图片bitmap_image2bitmap显示到控件中

private void button9_Click(object sender, EventArgs e)
{Image image_image2bitmap = Image.FromFile(Image2Bitmap);Bitmap bitmap_image2bitmap = (Bitmap)image_image2bitmap;pictureBox1.Image = bitmap_image2bitmap;
}

十、完整项目代码

项目名称:Mat_Bitmap_Image

using System;
using System.Drawing;
using System.Windows.Forms;using OpenCvSharp;
using OpenCvSharp.Extensions;namespace Mat_Bitmap_Image
{public partial class Form1 : Form{string SelfMat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat.png";string Mat2Bitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat2Bitmap.png";string Mat2Image = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Mat2Image.png";string SelfBitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap.png";string Bitmap2Mat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap2Mat.png";string Bitmap2Image = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Bitmap2Image.png";string SelfImage = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image.png";string Image2Mat = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image2Mat.png";string Image2Bitmap = "E:\\CSharp_workspace\\Mat_Bitmap_Image\\picture\\Image2Bitmap.png";public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}/// <summary>/// Mat数据类型图像显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){Mat mat = new Mat();mat = Cv2.ImRead(SelfMat,ImreadModes.Color);Cv2.NamedWindow("Mat", WindowFlags.Normal);Cv2.ImShow("Mat", mat);Cv2.WaitKey(0);Cv2.DestroyWindow("Mat");}/// <summary>/// Bitmap数据类型图像显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button2_Click(object sender, EventArgs e){Bitmap bitmap = new Bitmap(SelfBitmap);pictureBox1.Image = bitmap;}/// <summary>/// Image数据类型图像显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){Image image = Image.FromFile(SelfImage);pictureBox1.Image = image;}/// <summary>/// Mat数据类型转换为Bitmap数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button4_Click(object sender, EventArgs e){Mat mat_mat2bitmap = new Mat();mat_mat2bitmap = Cv2.ImRead(Mat2Bitmap, ImreadModes.Color);Bitmap bitmap_mat2bitmap = mat_mat2bitmap.ToBitmap();pictureBox1.Image = bitmap_mat2bitmap;}/// <summary>/// Mat数据类型转换为Image数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button5_Click(object sender, EventArgs e){Mat mat_mat2image = new Mat();mat_mat2image = Cv2.ImRead(Mat2Image, ImreadModes.Color);Bitmap bitmap_mat2image = mat_mat2image.ToBitmap();Image image_mat2image = (Image)bitmap_mat2image;pictureBox1.Image = image_mat2image;}/// <summary>/// Bitmap数据类型转化为Mat数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button6_Click(object sender, EventArgs e){Bitmap bitmap_bitmap2mat = new Bitmap(Bitmap2Mat);Mat mat_bitmap2map = new Mat();mat_bitmap2map = bitmap_bitmap2mat.ToMat();Cv2.NamedWindow("Bitmap2Mat", WindowFlags.Normal);Cv2.ImShow("Bitmap2Mat", mat_bitmap2map);Cv2.WaitKey(0);Cv2.DestroyWindow("Bitmap2Mat");}/// <summary>/// Bitmap数据类型转换为Image数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button7_Click(object sender, EventArgs e){Bitmap bitmap_bitmap2image = new Bitmap(Bitmap2Image);Image image_bitmap2image = (Image)bitmap_bitmap2image;pictureBox1.Image = image_bitmap2image;}/// <summary>/// Image数据类型转换为Mat数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button8_Click(object sender, EventArgs e){Image image_image2mat = Image.FromFile(Image2Mat);Bitmap bitmap_image2mat = (Bitmap)image_image2mat;Mat mat_image2mat = new Mat();mat_image2mat = bitmap_image2mat.ToMat();Cv2.NamedWindow("Image2Mat", WindowFlags.Normal);Cv2.ImShow("Image2Mat", mat_image2mat);Cv2.WaitKey(0);Cv2.DestroyWindow("Image2Mat");}/// <summary>/// Image数据类型转化为Bitmap数据类型显示/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button9_Click(object sender, EventArgs e){Image image_image2bitmap = Image.FromFile(Image2Bitmap);Bitmap bitmap_image2bitmap = (Bitmap)image_image2bitmap;pictureBox1.Image = bitmap_image2bitmap;}}
}

十一、效果展示

0,主界面

在这里插入图片描述

1,Mat数据类型

在这里插入图片描述

2,Bitmap数据类型

在这里插入图片描述

3,Image数据类型

在这里插入图片描述

4,Mat转Bitmap数据类型

在这里插入图片描述

5,Mat转Image

在这里插入图片描述

6,Bitmap转Mat

在这里插入图片描述

7,Bitmap转Image

在这里插入图片描述

8,Image转Mat

在这里插入图片描述

9,Image转Bitmap

在这里插入图片描述

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

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

相关文章

Canal的使用场景!!!

1、保持redis和mysql连接的一致性&#xff1a;通常使用延迟双删功能&#xff08;具有弊端&#xff09; 解决方案&#xff1a;可以使用canal监听数据库的变化&#xff08;删改&#xff09;&#xff0c;一旦出现此类操作&#xff0c;立即删除redis中的对应数据&#xff0c;直至下…

Vuforia AR篇(一)— 开启AR之门

目录 前言一、 Vuforia Engine简介二、主要功能与特点2.1 图像识别2.2 VuMarks技术2.3 多目标识别2.4 圆柱体目标识别2.5 平面跟踪技术2.6 云服务支持2.7 模型目标识别2.8 区域目标识别 三、平台兼容性四、技术实现结语 前言 随着科技的不断发展&#xff0c;增强现实&#xff…

2024年黑苹果Sonoma安装教程,小白专用

前言&#xff0c;前两天搞了个黑苹果&#xff0c;发现版本有点低&#xff0c;用不了软件啥的&#xff0c;就准备升级苹果的Sonoma系统。 一、EFI 用的是国外大神etechbox的EFI 链接: https://bit.ly/3MuyERk&#xff0c;往下翻&#xff0c;就可以看到对应的机型。我的CPU是Br…

AI大模型引领未来智慧科研暨ChatGPT自然科学高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

ModStartCMS(支持Laravel 9)v8.3.0

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

AcWing 1027. 方格取数

解题思路 如果使用了先走和后走的方式&#xff0c;这种方式利用了贪心的思想&#xff0c;会产生局部最优解&#xff0c; 但局部最优解毕竟不是全局最优解。所以要采用同时走的方式。 相关代码 import java.util.Scanner;public class Main {static int w[][] new int[15][15]…

逆向案例十八——webpack逆向红人点集登录密码

网址链接&#xff1a;红人点集 密码登录&#xff0c;获取数据包&#xff1a; 发现pwd和sig两个加密参数&#xff0c;开始跟栈调试 点击第一个&#xff0c;在send处打上断点&#xff0c;再点击登录。 进入异步栈&#xff0c;r.requests 释放之前的断点&#xff0c;打上断点 &a…

洪水预警:如何通过数据可视化提前应对灾害

数据可视化在应对洪涝灾害问题中发挥着重要作用。洪涝灾害是一种常见而严重的自然灾害&#xff0c;给人们的生命、财产和生活带来了巨大的威胁和损失。而数据可视化技术通过将海量的数据转化为直观、易懂的图表、图像或地图等形式&#xff0c;帮助人们更好地理解洪涝灾害的发生…

电商技术揭秘十八:电商平台的云计算与大数据应用小结

电商技术揭秘相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xf…

2024年 前端JavaScript 进阶 第4天 End 笔记

4.1-内容和浅拷贝 4.2-递归函数 4.3-深拷贝实现 4.4-利用lodash和JSON实现深 4.5-异常处理-throw和try、catch 4.6-普通函数和箭头函数的this 4.7-call方法改变this指向 4.8-apply方法 4.9-bind方法以及总结 4.10-什么是防抖以及底层实现 4.11-什么是节流以及底层实现 4.12-节流…

anaconda常用命令

anaconda常用命令 tensorflow为新建的虚拟环境name 新建虚拟环境 conda create --name tensorflow python3.6激活虚拟环境 conda activate tensorflow停止虚拟环境 conda deactivate删除虚拟环境 删除之前得停止当前虚拟环境 conda env remove -n tensorflow查看当前所有…

从入门到弃坑:一个后端开发到鸿蒙开发的简单尝试

【摘要】 笔者说&#xff1a;因为本人也从未接触 Android 开发&#xff0c;所以本文也是从小白入门的角度学习 HarmonyOS开发&#xff0c;文中大量的内容和观点其实都可以从官方文档查阅到。写这篇文章大概也是从中精简内容&#xff0c;记录学习 HarmonyOS 的过程。 鸿蒙操作系…