第一个C# Winform实例
前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入。VS版本VS2017
1:打开VS建立一个WInform 项目。拉入两个控件,groupbox,picturebox放到左侧,右侧也拉入一个groupbox,里面放入两个button.一个用来选择图片,一个用来测试二值化的效果。UI效果如下:
2:本人系统win10,64位。所以用OpencvSharp的64位库。先在项目里添加引用:(net461版本);然后在类里添加 using OpenCvSharp;最后根据个人项目平台,选择新建X64或者X86,用anycpu 容易出问题。好了,经过上面的准备,OpencvSharp相关库所有的东西都可以调用了。
3:图像少不了显示,我们新建一个类,用来管理OpencvSharp的图片显示。
- public class SharpWindows
- {
- [DllImport("user32.dll", SetLastError = true)]
- private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
- [DllImport("user32.dll", SetLastError = true)]
- private static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
- private PictureBox pictureBox;
- private Control Parentform;
- public Window Opencvwin;
- public SharpWindows(PictureBox _pictureBox,string winname)
- {
- pictureBox = _pictureBox;
- Cv2.NamedWindow(winname);
- Opencvwin = new Window(winname, WindowMode.FullScreen);
- Cv2.SetWindowProperty(Opencvwin.Name, WindowProperty.Fullscreen, );
- IntPtr Childwin = FindWindow(null, winname);
- SetParent(Childwin, _pictureBox.Handle);
- Parentform = Control.FromHandle(_pictureBox.Handle);
- }
- public void Showimg(Mat img)
- {
- try
- {
- int width = Parentform.Width;
- int height = Parentform.Height;
- Cv2.ResizeWindow(Opencvwin.Name, width, height);
- Cv2.MoveWindow(Opencvwin.Name, Parentform.Left, Parentform.Top);
- Cv2.SetWindowProperty(Opencvwin.Name, WindowProperty.Fullscreen, );
- Opencvwin.ShowImage(img);
- }
- catch(Exception ex)
- {
- throw (ex);
- }
- }
- }
4.在winform主UI里面初始化一个OpencvSharp的显示窗口:(同时创建一个Mat变量)
- SharpWindows Imgwindow;
- Mat rawimg;
- public OpencvSharpWindow()
- {
- InitializeComponent();
- Imgwindow = new SharpWindows(this.pictureBox1, "MainUIwindow");
- }
5.两个button点击事件:
- private void button_Openpic_Click(object sender, EventArgs e)
- {
- try
- {
- var filename= OpenfileDlg();
- if(filename!=null&& filename!="")
- {
- Mat img = Cv2.ImRead(filename);
- Imgwindow.Showimg(img);
- rawimg = img.Clone();
- img.Dispose();
- }
- }
- catch(Exception ex )
- {
- throw (ex);
- }
- }
- private static string OpenfileDlg(string Defaultpath = null)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- ofd.Title = "请选择要打开的文件";
- //多选
- ofd.Multiselect = true;
- //初始目录
- ofd.InitialDirectory = Defaultpath;
- //设定文件类型
- // ofd.Filter = "*.bmp | *.jpg";
- ofd.ShowDialog();
- //获得在打开文件对话框中选择的文件的路径
- string path = ofd.FileName;
- return path;
- }
- private void button_Test_Click(object sender, EventArgs e)
- {
- try
- {
- if(rawimg!=null)
- {
- //转灰度
- Mat grayimg;
- if (rawimg.Channels()==3)
- {
- grayimg = rawimg.CvtColor(ColorConversionCodes.BGR2GRAY);
- }
- else
- {
- grayimg = rawimg.Clone();
- }
- Imgwindow.Showimg(grayimg);
- //bin
- double dvalue = 0;
- double.TryParse(textBox_ThreshValue.Text, out dvalue);
- if(dvalue==0)
- {
- dvalue = 10;
- }
- Mat binimg = grayimg.Threshold(dvalue, 255, ThresholdTypes.Binary);
- Imgwindow.Showimg(binimg);
- grayimg.Dispose();
- binimg.Dispose();
- }
- }
- catch(Exception ex)
- {
- throw (ex);
- }
- }
6.代码敲完。剩下我们测试一下效果:
点击打开图片按钮,选择需要显示的图片,我网上下载了一张,UI那里就有显示了,还是很直观方便的。
接着我们测试一下简单的二值化效果。在text文本框里分别填入50,100,200,220效果分别如下:
本次实例结束。希望大家动手操作,这样才能学习到东西。
各位,如果需要我的源码,请留言,谢谢!
第一个C# Winform实例的更多相关文章
- 一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(下)
接着上一篇:一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(上) 直接贴代码了: using System; using System. ...
- 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...
- HOOK API (一)——HOOK基础+一个鼠标钩子实例
HOOK API (一)——HOOK基础+一个鼠标钩子实例 0x00 起因 最近在做毕业设计,有一个功能是需要实现对剪切板的监控和进程的防终止保护.原本想从内核层实现,但没有头绪.最后决定从调用层入手 ...
- puppet一个完整的实例
一个具体实例来简单说明puppet的具体结构 创建第一个配置 puppet的组成清单这主要包含这几个部分 资源,文件,模板,节点,类,定义 puppet中有个模块的定义,这个比较重要,基本是puppe ...
- 给easyui datebox时间框控件扩展一个清空的实例
给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; ( ...
- iOS 9音频应用播放音频之第一个ios9音频实例2
iOS 9音频应用播放音频之第一个ios9音频实例2 ios9音频应用关联 iOS9音频应用中对于在主视图上添加的视图或控件,在使用它们时必须要与插座变量进行关联.ios9插座变量其实就是为主视图中的 ...
- iOS 9音频应用播放音频之第一个ios9音频实例
iOS 9音频应用播放音频之第一个ios9音频实例 第一个ios9音频实例 为了让开发者可以对上面的内容有更加深入的了解,本节将实现播放音频的第一个实例.在此实例中会涉及到项目的创建.界面设计.关联以 ...
- 第一个AngularJS表达式实例
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- C语言入门教程: 一个简单的实例
对于学习要保持敬畏! 语言不只是一种工具,还是一种资源,因此,善待它,掌握它! 我们知道,对于未知通常都会充满好奇和畏惧,既想了解它,又害怕神秘面纱隐藏的不确定性.对于一门编程语言同样如此,我将以 ...
随机推荐
- NSTimer 的简易使用方法
一.使用方式 1.声明NSTimer方法 static CGFloat sIntervalTime = 15.f; //定时刷新时间间隔 @property (nonatomic, stron ...
- 【图文】[新手]C++ 动态库导出函数名“乱码”及解决
刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef ...
- javaweb各种框架组合案例(二):maven+spring+springMVC+mybatis
1.mybatis是比较新的半自动orm框架,效率也比较高,优点是sql语句的定制,管理与维护,包括优化,缺点是对开发人员的sql功底要求较高,如果比较复杂的查询,表与表之间的关系映射到对象与对象之间 ...
- shell多线程之进程间通信(2)
工作中往往遇到这种情况,有许多任务,依次执行比较浪费时间,由于任务之间有依赖关系,简单的并发执行又不行. 就如同下面这种情况,任务new和dvidUser是可以并发执行的,fact任务依赖于new任务 ...
- Android项目开发之--------地铁时光机(一,搭建主框架)
一:先看一下框架搭建后的效果图 , 二:框架结构 (1)底部导航栏采用的是: MainActivity(主框架), MsgFragment(首页), HistoryFragment(历史清单 ...
- 04-MySQL中的数据类型
1 整体说明MYsql的数据类型#1. 数字: 整型:tinyint int bigint 小数: float :在位数比较短的情况下不精准 double ...
- rm、shutdown、磁盘挂载、vi使用方法
1. 系统管理文件 1.1 rm 文件与目录有关命令 删除命令 (慎用) --- 数据是否备份了 rm === remove rm /oldboy/oldboy.txt --- 删除文件 rm ...
- 推荐一个高效,易用功能强大的可视化API管理平台
项目管理 提供基本的项目分组,项目管理,接口管理功能 接口管理 友好的接口文档,基于websocket的多人协作接口编辑功能和类postman测试工具,让多人协作成倍提升开发效率 MockServer ...
- valet环境PHPstorm+xdebug调试
1.安装xdebug 2.配置xdebug zend_extension="/usr/local/Cellar/php@7.2/7.2.18/pecl/20170718/xdebug.so& ...
- Spring Boot2(六):使用Spring Boot整合AOP面向切面编程
一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop aop全称Aspec ...