⒈目的
通过本案例,掌握在winform框架下基于OpenCvSharp读取、显示和写入图像的方法。
⒉软件
Visual Studio 2022
⒊界面设计
控件包括:button。
⒋安装NuGet程序包
⑴OpenCvSharp4
⑵OpenCvSharp4.runtime.win
⑶OpenCvSharp4.Extensions
⒌imread()读取图像
cv.imread(filename[,flags])
ImreadModes.Color:始终将图像转换为 3 通道BGR彩色图像,默认方式
ImreadModes.Grayscale:始终将图像转换为单通道灰度图像
ImreadModes.Unchanged:按原样返回加载的图像(使用Alpha通道)
ImreadModes.AnyDepth:在输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位
ImreadModes.AnyColor:以任何可能的颜色格式读取图像
⒍imshow()在窗口中显示图像
语法:imshow(winname,img);其中winname:字符串,显示窗口的名称;img:所显示的OpenCV图像,nparray多维数组。
Cv2.waitKey()是OpenCV中的一个函数,它会在窗口上等待指定的毫秒数,如果期间没有按下任何键,则返回-1。如果按下了任何键,则返回按键的ASCII码值。该函数通常与cv2.imshow()一起使用,以便在窗口中显示图像并等待用户按下键盘。
⒎ImWrite()将图像写入文件目录
imwrite(filename,image);filename:文件名,它必须包含文件扩展名(例如.png、.jpg等),OpenCV使用此文件扩展名来指定文件的格式;image:要保存的图像。如果图像保存成功,该函数将返回True。
⒏编程代码
⑴命名空间及初始化
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows.Forms;
usingOpenCvSharp;
namespace_04__OpenCvSharp读取_显示和写入图像
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
…
}
}
⑵“加载”按钮
privatevoidCreat_Click(objectsender,EventArgse)//加载
{
stringimagePath =@"C:\Users\wangfeng0613\Desktop\OpencvSharp系列应用资料\图片.jpg";//使用统一的绝对路径
Matimage =Cv2.ImRead(imagePath);
Cv2.ImShow("默认图像", image);//显示默认图像
//方式1:始终将图像转换为3通道BGR彩色图像,默认方式
Matimg1 =newMat(imagePath,ImreadModes.Color);
Cv2.ImShow("方式1", img1);
//方式2:图像转换为单通道灰度图像
Matimg2 =newMat(imagePath,ImreadModes.Grayscale);
Cv2.ImShow("方式2", img2);
//方式3:按原样返回加载的图像(使用Alpha通道)
Matimg3 =newMat(imagePath,ImreadModes.Unchanged);
Cv2.ImShow("方式3", img3);
//方式4:以任何可能的颜色格式读取图像
Matimg4 =newMat(imagePath,ImreadModes.AnyColor);
Cv2.ImShow("方式4", img4);
Cv2.WaitKey(0);//等待用户按键(0表示无限等待)
Cv2.DestroyAllWindows();//程序退出前关闭所有窗口
}
⑶“读图”按钮
privatevoidRead_Click(objectsender,EventArgse)//读图
{
stringimagePath =@"C:\Users\wangfeng0613\Desktop\OpencvSharp系列应用资料\图片.jpg";//使用统一的绝对路径
Matimage =Cv2.ImRead(imagePath);
Cv2.ImShow("原图", image);
intk =Cv2.WaitKey(0) & 0xFF;//等待按键按下,获取用户按下的键盘按键,并提取键值的低8位
if(k == 27)//如果按下ESC键
Cv2.DestroyAllWindows();//关闭所有窗口
elseif(k =='s')//如果按下's'键,注意是小s,此时切换为大S键无效
{
Cv2.ImWrite("image_copy.jpg",image);//保存图像
Cv2.DestroyAllWindows();//关闭所有窗口
}
}
⑷“保存”按钮
privatevoidSave_Click(objectsender,EventArgse)//保存
{
stringimagePath =@"C:\Users\wangfeng0613\Desktop\OpencvSharp系列应用资料\图片.jpg";//使用统一的绝对路径
Matsrc =Cv2.ImRead(imagePath,ImreadModes.AnyColor);
Matoutput_image =newMat();
Cv2.CvtColor(src, output_image,ColorConversionCodes.BGR2GRAY);//转换为灰度图像
stringsavePath =Path.Combine(Application.StartupPath,"output_image.png");//保存图像(使用应用程序的当前目录)
Cv2.ImWrite(savePath, output_image);//依据轨迹保存图像
MessageBox.Show($"保存路径:{savePath}");//显示保存路径
}
⒐功能演示
运行测试,点击“加载”,软件显示下图照片,任意键关闭照片:
点击“读图”,键盘按“ESC”关闭窗口,按“s”键保存图片后关闭窗口:
点击“保存”,保存指定图片到相对位置: