在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;
}
}
}
发表评论