二、显示图片、提取边缘特征并保存(C# + OpenCV)

实现功能:
1,打开照片,并显示
2,对选择的照片进行Canny边缘检测
3,保存边缘检测之后的结果

一、布局

打开在视图下打开工具箱
在这里插入图片描述
选择一个PictureBox,仨Button
在这里插入图片描述

在这里插入图片描述
对Button改个名字
在这里插入图片描述
仨Button,分别对应三个功能的实现
最终的页面如下所示
在这里插入图片描述

二、引入命名空间

using System;
using System.Drawing;
using System.Windows.Forms;using OpenCvSharp;
using OpenCvSharp.Extensions;

在这里插入图片描述
要有这三个哈,没有就去浏览里面搜索下载安装就行
在这里插入图片描述

三、选择照片功能

定义全局变量picture用于存放读取的图片的位置

OpenFileDialog file = new OpenFileDialog();
new一个OpenFileDialog 类对象file,用于打开选择图片
OpenFileDialog 类官网API

if (file.FileName != string.Empty)
此时file.FileName就是图片的路径,是一个字符串数据

pictureBox1.Load(file.FileName);
pictureBox1就是布局里面的PictureBox控件名称
参数是图片的路径,这里传入用户选择的图片路径file.FileName
此时就可以将用户选择的照片显示在PictureBox控件上

string picture = ""; // 全局变量存放读取图片的路径
private void button1_Click(object sender, EventArgs e)
{OpenFileDialog file = new OpenFileDialog();file.InitialDirectory = ".";file.Filter = "所有文件(*.*)|*.*";file.ShowDialog();if (file.FileName != string.Empty){try{picture = file.FileName;this.pictureBox1.Load(file.FileName);}catch (Exception ex){MessageBox.Show(ex.Message);}}  
}

四、Canny边缘检测功能

OpenCV处理的图片都是Mat形式
Mat img1 = new Mat(picture, ImreadModes.Color);
读取用户选择的图片
参数一:图片的路径,picture
参数二:读取图片的形式,ImreadModes.Color三颜色通道的彩色图

Mat gray = new Mat();存放处理图片之后的灰度图
Mat canny = new Mat();存放Canny边缘检测之后的结果图片

Cv2.CvtColor(img1,gray, ColorConversionCodes.RGB2GRAY);
img1转换为灰度图,输出结果为gray
参数一:输入图像,img1
参数二:输出图像,gray
参数三:转换的操作,ColorConversionCodes.BGR2GRAY,BGR转灰度图

Cv2.Canny(gray, canny, 100, 200);
gray图像进行Canny边缘检测,输出结果为canny,minVal 为100,maxVal 为200
当然Canny算子还有其他参数,读者可自行拓展学习
参数一:输入图像,gray
参数二:输出图像,canny
参数三:第一个阈值,100
参数四:第二个阈值,200

Bitmap bitmap = canny.ToBitmap();
graycanny都是Mat类型的数据,要想在PictureBox控件上展示,必须转换为Bitmap类型数据

pictureBox1.Image = bitmap;
此时bitmapBitmap类型数据,可以进行在控件上展示

private void button2_Click(object sender, EventArgs e)
{Mat img1 = new Mat(picture, ImreadModes.Color);Mat gray = new Mat();Mat canny = new Mat();Cv2.CvtColor(img1,gray, ColorConversionCodes.BGR2GRAY);Cv2.Canny(gray, canny, 100, 200);Bitmap bitmap = canny.ToBitmap();pictureBox1.Image = bitmap;
}

五、保存图片功能

SaveFileDialog save = new SaveFileDialog();
new一个SaveFileDialog 类对象save ,用于选择保存图片的位置
SaveFileDialog 类官网API

pictureBox1.Image.Save(save.FileName);
将PictureBox控件显示的通过Canny算子进行边缘检测之后的照片结果进行保存

private void button3_Click(object sender, EventArgs e)
{SaveFileDialog save = new SaveFileDialog();save.InitialDirectory = ".";save.Filter = "所有文件(*.*)|*.*";save.ShowDialog();if(save.FileName != string.Empty){try{this.pictureBox1.Image.Save(save.FileName);}catch (Exception ex){MessageBox.Show(ex.Message);}}
}

六、完整代码

复制的时候记得考虑实际的namespace
namespace opencv_test1跟你的项目名称一致哈

using System;
using System.Drawing;
using System.Windows.Forms;using OpenCvSharp;
using OpenCvSharp.Extensions;namespace opencv_test1
{public partial class Form1 : Form{string picture = "";public Form1(){InitializeComponent();          }private void Form1_Load(object sender, EventArgs e){}private void button1_Click(object sender, EventArgs e){OpenFileDialog file = new OpenFileDialog();file.InitialDirectory = ".";file.Filter = "所有文件(*.*)|*.*";file.ShowDialog();if (file.FileName != string.Empty){try{picture = file.FileName;this.pictureBox1.Load(picture);}catch (Exception ex){MessageBox.Show(ex.Message);}}  }private void button2_Click(object sender, EventArgs e){Mat img1 = new Mat(picture, ImreadModes.Color);Mat gray = new Mat();Mat canny = new Mat();Cv2.CvtColor(img1,gray, ColorConversionCodes.BGR2GRAY);Cv2.Canny(gray, canny, 100, 200);Bitmap bitmap = canny.ToBitmap();pictureBox1.Image = bitmap;}private void button3_Click(object sender, EventArgs e){SaveFileDialog save = new SaveFileDialog();save.InitialDirectory = ".";save.Filter = "所有文件(*.*)|*.*";save.ShowDialog();if (save.FileName != string.Empty){try{this.pictureBox1.Image.Save(save.FileName);}catch (Exception ex){MessageBox.Show(ex.Message);}}}}
}

七、效果展示

运行效果
在这里插入图片描述
选择照片
在这里插入图片描述
在这里插入图片描述
Canny边缘检测
在这里插入图片描述
保存照片
在这里插入图片描述
保存效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/302761.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-7.mysql约束

约束用于确保数据库中的数据满足特定的商业规则。 MySQL约束包含五种:not null、unique、primary key、foreign key、check 7.1 primary key 主键 字段名 字段类型 primary key 用于唯一的标识表的行数据,当定义主键约束后,该列不能重复。 pr…

安装包分析3

接上文,在主函数我们看到下载的函数InstallFunc,在这个下载的函数中,根据指引我们可以看见 下载所需要的函数 也就是 这段函数是一个安装程序的主要功能函数。它的作用是从文件中读取数据,并根据这些数据执行安装相关的操作。以下…

【MySQL】C# 连接MySQL

C# 连接MySQL 1. 添加MySQL引用 安装完MySQL之后,在安装的默认目录 C:\Program Files (x86)\MySQL\Connector NET 8.0 中查找MySQLData.dll文件。 在Visual Studio 中为项目中添加引用。 2. 引入命名空间 using MySql.Data.MySqlClient;3. 构建连接 private …

AI服务平台replicate

Replicate是一个提供优秀AI模型和工具的平台,旨在帮助用户实现各种人工智能任务。该平台汇集了来自各个领域的顶尖模型,涵盖了文本到图像生成、语言模型、图像编辑、超分辨率等多个领域。用户可以通过Replicate平台快速获取和应用先进的模型,…

设计模式学习笔记 - 设计模式与范式 -行为型:8.状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

概述 本章学习状态模式。在实际的开发中,状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。从这一点上看,它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机,而状态机常用在游戏、工…

机器学习模型——GBDT和Xgboost

GBDT基本概念: GBDT(Gradient Boosting Decision Tree,简称GBDT)梯度提升决策树,是Gradient Boost 框架下使用较多的一种模型,且在GBDT中,其基学习器是分类回归树也就是CART,且使用…

【LeetCode: 2529. 正整数和负整数的最大计数 + 模拟 + 计数】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【c 语言】结构体的定义格式及变量初始化

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

【计算机考研】408算法大题怎么练?

先说结论:基础阶段学好各个数据结构与,重点是数组、链表、树、图。然后强化阶段突破算法提 在基础阶段,并不需要过于专门地练习算法。相反,基础阶段的重点应该放在对各种数据结构原理的深入理解上。在我个人的经验中,…

网络协议——VRRP(虚拟路由冗余协议)原理与配置

1. VRRP概述 单网关出现故障后下联业务中断,配置两个及以上的网关时由于IP地址冲突,导致通讯时断时续甚至通信中断。VRRP组播类的网络层协议 2. 协议版本 VRRP v2: 支持认证,仅适用于IPv4网络 VRRP v3: 不支持认证, 适用于IPv4和IPv6两种网…

数据结构—图

图的基本概念 图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:G(V,E),其中,G 表示一个图,V 表示顶点的集合,E 表示边的集合。 顶点 图中的数据元素,我们称之为顶点,图至少有…

Redis 八种常用数据类型常用命令和应用场景

5 种基础数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。 3 种特殊数据类型:HyperLogLog&#xff0…

C语言自定义类型:联合与枚举的奇幻之旅

** 前言 ** 在C语言的世界中,数据类型犹如魔术师手中的魔法道具,各有其神奇之处。今天,我们就来揭开其中两种自定义类型——联合(union)和枚举(enum)的神秘面纱,带你一起探索它们背…

《荒野大镖客》游戏提示emp.dll文件丢失如何解决?

emp.dll它作为一种动态链接库(DLL)文件,在Windows操作系统中扮演着重要角色。当打开一个程序时,操作系统会将程序的代码和数据加载到内存中,并创建一个进程来运行该程序。在这个过程中,emp.dll负责将这些代…

Hot100【十一】:合并区间

// 先排个序 // 这里巧用链表&#xff0c;可以快速的获取到last&#xff0c;通过last数组的第二个元素和当前数组的第一个元素对比&#xff0c;如果当前数组的第一个元素<last数组的第二个元素, 就需要合并 class Solution { public int[][] merge(int[][] intervals) { // …

实现几何对象按照一定距离向外缓冲

1、首先&#xff0c;确保你已经引入了Turf.js库。你可以通过在HTML文件中添加以下代码来引入 <script src"https://cdn.jsdelivr.net/npm/turf/turf6.5.0/turf.min.js"></script>2、使用turf.buffer实现几何对象按照设定距离扩充 let originalCoordinat…

Linux系统安装内网穿透实现固定公网地址访问本地MinIO服务

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&am…

2024/4/1—力扣—主要元素

代码实现&#xff1a; 思路&#xff1a;摩尔投票算法 int majorityElement(int *nums, int numsSize) {int candidate -1;int count 0;for (int i 0; i < numsSize; i) {if (count 0) {candidate nums[i];}if (nums[i] candidate) {count;} else {count--;}}count 0;…

【资源分享】这个网站我愿称之为年度学术最伟大的发现

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

嵌入式学习51-单片机4

知识零碎&#xff1a; nop空指令 CRC校验 为了保证51单片与温度传感18b20 之间的高电平 采用一个上拉电阻改变电平的高低 温度寄存器原理