当前位置: 代码网 > it编程>游戏开发>ar > 三、Mat、Bitmap和Image数据类型之间的转换(OpenCvSharp)

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

2024年08月06日 ar 我要评论
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

在这里插入图片描述

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com