OpenCvSharp读取、显示和写入图像

⒈目的

通过本案例,掌握在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。

⒏编程代码

⑴命名空间及初始化

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using OpenCvSharp;

namespace _04__OpenCvSharp读取_显示和写入图像

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

...

}

}

⑵"加载"按钮

private void Creat_Click(object sender, EventArgs e)//加载

{

string imagePath = @"C:\Users\wangfeng0613\Desktop\OpencvSharp系列应用资料\图片.jpg";// 使用统一的绝对路径

Mat image = Cv2.ImRead(imagePath);

Cv2.ImShow("默认图像", image);//显示默认图像

//方式1:始终将图像转换为3通道BGR彩色图像,默认方式

Mat img1 = new Mat(imagePath, ImreadModes.Color);

Cv2.ImShow("方式1", img1);

//方式2:图像转换为单通道灰度图像

Mat img2 = new Mat(imagePath, ImreadModes.Grayscale);

Cv2.ImShow("方式2", img2);

//方式3:按原样返回加载的图像(使用Alpha通道)

Mat img3 = new Mat(imagePath, ImreadModes.Unchanged);

Cv2.ImShow("方式3", img3);

//方式4:以任何可能的颜色格式读取图像

Mat img4 = new Mat(imagePath, ImreadModes.AnyColor);

Cv2.ImShow("方式4", img4);

Cv2.WaitKey(0);// 等待用户按键(0表示无限等待)

Cv2.DestroyAllWindows();// 程序退出前关闭所有窗口

}

⑶"读图"按钮

private void Read_Click(object sender, EventArgs e)//读图

{

string imagePath = @"C:\Users\wangfeng0613\Desktop\OpencvSharp系列应用资料\图片.jpg";// 使用统一的绝对路径

Mat image = Cv2.ImRead(imagePath);

Cv2.ImShow("原图", image);

int k = Cv2.WaitKey(0) & 0xFF; //等待按键按下,获取用户按下的键盘按键,并提取键值的低8位

if (k == 27) //如果按下ESC键

Cv2.DestroyAllWindows();//关闭所有窗口

else if (k == 's')//如果按下's'键,注意是小s,此时切换为大S键无效

{

Cv2.ImWrite("image_copy.jpg",image); //保存图像

Cv2.DestroyAllWindows();//关闭所有窗口

}

}

⑷"保存"按钮

private void Save_Click(object sender, EventArgs e)//保存

{

string imagePath = @"C:\Users\wangfeng0613\Desktop\OpencvSharp系列应用资料\图片.jpg";// 使用统一的绝对路径

Mat src = Cv2.ImRead(imagePath, ImreadModes.AnyColor);

Mat output_image = new Mat();

Cv2.CvtColor(src, output_image, ColorConversionCodes.BGR2GRAY);//转换为灰度图像

string savePath = Path.Combine(Application.StartupPath, "output_image.png");// 保存图像(使用应用程序的当前目录)

Cv2.ImWrite(savePath, output_image);//依据轨迹保存图像

MessageBox.Show($"保存路径:{savePath}");//显示保存路径

}

⒐功能演示

运行测试,点击"加载",软件显示下图照片,任意键关闭照片:

点击"读图",键盘按"ESC"关闭窗口,按"s"键保存图片后关闭窗口:

点击"保存",保存指定图片到相对位置:

相关推荐
weixin_4684668520 小时前
从“看懂”到“做到”:视觉-语言-动作模型如何让机器人真正执行指令
人工智能·ai·机器人·大语言模型·前沿科技
云智慧AIOps社区1 天前
智能巡检机器人应用场景解析:机房巡检、园区安防、管廊巡视与展厅导览
人工智能·机器人·具身智能·智能巡检机器人·企业级智能巡检机器人·机房巡检机器人·导览机器人
GlobalInfo1 天前
重磅发布 | 2026年船体清洁机器人行业研究报告:市场规模、发展前景与十五五战略地图
大数据·人工智能·机器人
疯子的梦想@1 天前
Prometheus 接入 Alertmanager 与钉钉机器人,附中文模板和完整踩坑记录
机器人·钉钉·prometheus
feasibility.1 天前
世界模型WSM技术解读:SLAM内化为具身智能的状态记忆,纯RGB机器人导航反超RGB-D
人工智能·机器人·aigc·slam·导航·具身智能·世界模型
zhangrelay1 天前
Arduino-MEGA-ESP单片机理论课笔记-01入门-02硬件-03开发环境-2026
笔记·单片机·嵌入式硬件·学习·机器人
小lo想吃棒棒糖1 天前
把 启元机器人Q1 的训练搬到昇腾 910B:从 MuJoCo 到 PPO 的一次完整迁移
人工智能·python·机器人·昇腾·具身智能
szxinmai主板定制专家1 天前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x
大江东去浪淘尽千古风流人物1 天前
【RoboDojo】仿真与真实双轨机器人操纵基准:测试流程与防作弊机制深度解析
机器人·vla·评测基准·机器人操纵·robodojo·sim-to-real
脆性薄片搬运谢工2 天前
移栽电控箱放在机架上还是单独落地,产线布局哪个更合理?
机器人·脆性薄片搬运专机·桁架机械手·桁架机器人·特种桁架搬运专机