在opencv中可以通过imread方法读取照片,通过imshow方法显示照片;但是无法在picturebox控件中显示
 picturebox控件只能展示bitmap和image数据类型图片
为此查阅了网上很多篇博文,将三种数据类型之间的转换进行了归纳整理,感谢网上大佬们的博文分享,参考的内容过多就不再一一感谢了哈。
本篇博文以展示图片的效果进行演示,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

            
                                            
                                            
                                            
发表评论