当前位置:   article > 正文

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

mat转image

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

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

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

零、前期准备工作

1,页面布局

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

2,命名空间

引入OpenCvSharp命名空间

using OpenCvSharp;
using OpenCvSharp.Extensions;
  • 1
  • 2

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

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";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

一、Mat数据类型

通过OpenCVImRead方法读取的都是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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二、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;
}
  • 1
  • 2
  • 3
  • 4
  • 5

三、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;
}
  • 1
  • 2
  • 3
  • 4
  • 5

四、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;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

五、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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

六、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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

七、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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

八、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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

九、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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

十、完整项目代码

项目名称: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;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155

十一、效果展示

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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/752172
推荐阅读
相关标签
  

闽ICP备14008679号