在OpenCV 中可以通过ImRead
方法读取照片,通过ImShow
方法显示照片;但是无法在PictureBox 控件中显示
PictureBox 控件只能展示Bitmap
和Image
数据类型图片
为此查阅了网上很多篇博文,将三种数据类型之间的转换进行了归纳整理,感谢网上大佬们的博文分享,参考的内容过多就不再一一感谢了哈。
本篇博文以展示图片的效果进行演示,Mat数据类型通过OpenCV展示
,Bitmap数据类型和Image数据类型通过pictureBox控件进行展示
零、前期准备工作
1,页面布局
注意button的序号哈
2,命名空间
引入OpenCvSharp命名空间
csharp
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,图片路径对应说明
csharp
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窗口
csharp
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显示到控件中
csharp
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显示到控件中
csharp
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显示到控件中
csharp
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显示到控件中
csharp
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窗口
csharp
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显示到控件中
csharp
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窗口
csharp
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显示到控件中
csharp
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
csharp
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;
}
}
}