前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用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的图片显示。

  1. public class SharpWindows
  2. {
  3.  
  4. [DllImport("user32.dll", SetLastError = true)]
  5. private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  6. [DllImport("user32.dll", SetLastError = true)]
  7. private static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
  8. private PictureBox pictureBox;
  9. private Control Parentform;
  10. public Window Opencvwin;
  11. public SharpWindows(PictureBox _pictureBox,string winname)
  12. {
  13. pictureBox = _pictureBox;
  14. Cv2.NamedWindow(winname);
  15. Opencvwin = new Window(winname, WindowMode.FullScreen);
  16. Cv2.SetWindowProperty(Opencvwin.Name, WindowProperty.Fullscreen, );
  17. IntPtr Childwin = FindWindow(null, winname);
  18. SetParent(Childwin, _pictureBox.Handle);
  19. Parentform = Control.FromHandle(_pictureBox.Handle);
  20.  
  21. }
  22. public void Showimg(Mat img)
  23. {
  24. try
  25. {
  26. int width = Parentform.Width;
  27. int height = Parentform.Height;
  28. Cv2.ResizeWindow(Opencvwin.Name, width, height);
  29. Cv2.MoveWindow(Opencvwin.Name, Parentform.Left, Parentform.Top);
  30. Cv2.SetWindowProperty(Opencvwin.Name, WindowProperty.Fullscreen, );
  31. Opencvwin.ShowImage(img);
  32.  
  33. }
  34. catch(Exception ex)
  35. {
  36. throw (ex);
  37.  
  38. }
  39.  
  40. }
  41. }

4.在winform主UI里面初始化一个OpencvSharp的显示窗口:(同时创建一个Mat变量)

  1. SharpWindows Imgwindow;
  2. Mat rawimg;
  3. public OpencvSharpWindow()
  4. {
  5. InitializeComponent();
  6. Imgwindow = new SharpWindows(this.pictureBox1, "MainUIwindow");
  7. }

5.两个button点击事件:

  1. private void button_Openpic_Click(object sender, EventArgs e)
  2. {
  3. try
  4. {
  5. var filename= OpenfileDlg();
  6. if(filename!=null&& filename!="")
  7. {
  8. Mat img = Cv2.ImRead(filename);
  9. Imgwindow.Showimg(img);
  10. rawimg = img.Clone();
  11. img.Dispose();
  12. }
  13.  
  14. }
  15. catch(Exception ex )
  16. {
  17. throw (ex);
  18.  
  19. }
  20. }
  21. private static string OpenfileDlg(string Defaultpath = null)
  22. {
  23. OpenFileDialog ofd = new OpenFileDialog();
  24. ofd.Title = "请选择要打开的文件";
  25. //多选
  26. ofd.Multiselect = true;
  27. //初始目录
  28. ofd.InitialDirectory = Defaultpath;
  29. //设定文件类型
  30. // ofd.Filter = "*.bmp | *.jpg";
  31.  
  32. ofd.ShowDialog();
  33.  
  34. //获得在打开文件对话框中选择的文件的路径
  35. string path = ofd.FileName;
  36. return path;
  37. }
  38.  
  39. private void button_Test_Click(object sender, EventArgs e)
  40. {
  41. try
  42. {
  43. if(rawimg!=null)
  44. {
  45. //转灰度
  46. Mat grayimg;
  47. if (rawimg.Channels()==3)
  48. {
  49. grayimg = rawimg.CvtColor(ColorConversionCodes.BGR2GRAY);
  50.  
  51. }
  52. else
  53. {
  54. grayimg = rawimg.Clone();
  55. }
  56. Imgwindow.Showimg(grayimg);
  57. //bin
  58. double dvalue = 0;
  59. double.TryParse(textBox_ThreshValue.Text, out dvalue);
  60. if(dvalue==0)
  61. {
  62. dvalue = 10;
  63. }
  64.  
  65. Mat binimg = grayimg.Threshold(dvalue, 255, ThresholdTypes.Binary);
  66. Imgwindow.Showimg(binimg);
  67. grayimg.Dispose();
  68. binimg.Dispose();
  69.  
  70. }
  71.  
  72. }
  73. catch(Exception ex)
  74. {
  75. throw (ex);
  76. }
  77.  
  78. }

6.代码敲完。剩下我们测试一下效果:

点击打开图片按钮,选择需要显示的图片,我网上下载了一张,UI那里就有显示了,还是很直观方便的。

接着我们测试一下简单的二值化效果。在text文本框里分别填入50,100,200,220效果分别如下:

本次实例结束。希望大家动手操作,这样才能学习到东西。

各位,如果需要我的源码,请留言,谢谢!

第一个C# Winform实例的更多相关文章

  1. 一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(下)

    接着上一篇:一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(上) 直接贴代码了: using System; using System. ...

  2. 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例

    14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...

  3. HOOK API (一)——HOOK基础+一个鼠标钩子实例

    HOOK API (一)——HOOK基础+一个鼠标钩子实例 0x00 起因 最近在做毕业设计,有一个功能是需要实现对剪切板的监控和进程的防终止保护.原本想从内核层实现,但没有头绪.最后决定从调用层入手 ...

  4. puppet一个完整的实例

    一个具体实例来简单说明puppet的具体结构 创建第一个配置 puppet的组成清单这主要包含这几个部分 资源,文件,模板,节点,类,定义 puppet中有个模块的定义,这个比较重要,基本是puppe ...

  5. 给easyui datebox时间框控件扩展一个清空的实例

    给easyui datebox扩展一个清空的实例 步骤一:拓展插件 /** * 给时间框控件扩展一个清除的按钮 */ $.fn.datebox.defaults.cleanText = '清空'; ( ...

  6. iOS 9音频应用播放音频之第一个ios9音频实例2

    iOS 9音频应用播放音频之第一个ios9音频实例2 ios9音频应用关联 iOS9音频应用中对于在主视图上添加的视图或控件,在使用它们时必须要与插座变量进行关联.ios9插座变量其实就是为主视图中的 ...

  7. iOS 9音频应用播放音频之第一个ios9音频实例

    iOS 9音频应用播放音频之第一个ios9音频实例 第一个ios9音频实例 为了让开发者可以对上面的内容有更加深入的了解,本节将实现播放音频的第一个实例.在此实例中会涉及到项目的创建.界面设计.关联以 ...

  8. 第一个AngularJS表达式实例

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. C语言入门教程: 一个简单的实例

    对于学习要保持敬畏! 语言不只是一种工具,还是一种资源,因此,善待它,掌握它!   我们知道,对于未知通常都会充满好奇和畏惧,既想了解它,又害怕神秘面纱隐藏的不确定性.对于一门编程语言同样如此,我将以 ...

随机推荐

  1. NSTimer 的简易使用方法

      一.使用方式 1.声明NSTimer方法   static CGFloat sIntervalTime = 15.f; //定时刷新时间间隔 @property (nonatomic, stron ...

  2. 【图文】[新手]C++ 动态库导出函数名“乱码”及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef ...

  3. javaweb各种框架组合案例(二):maven+spring+springMVC+mybatis

    1.mybatis是比较新的半自动orm框架,效率也比较高,优点是sql语句的定制,管理与维护,包括优化,缺点是对开发人员的sql功底要求较高,如果比较复杂的查询,表与表之间的关系映射到对象与对象之间 ...

  4. shell多线程之进程间通信(2)

    工作中往往遇到这种情况,有许多任务,依次执行比较浪费时间,由于任务之间有依赖关系,简单的并发执行又不行. 就如同下面这种情况,任务new和dvidUser是可以并发执行的,fact任务依赖于new任务 ...

  5. Android项目开发之--------地铁时光机(一,搭建主框架)

    一:先看一下框架搭建后的效果图      , 二:框架结构 (1)底部导航栏采用的是: MainActivity(主框架), MsgFragment(首页), HistoryFragment(历史清单 ...

  6. 04-MySQL中的数据类型

    1 整体说明MYsql的数据类型#1. 数字:    整型:tinyint  int  bigint    小数:        float :在位数比较短的情况下不精准        double ...

  7. rm、shutdown、磁盘挂载、vi使用方法

    1. 系统管理文件 1.1 rm 文件与目录有关命令 删除命令 (慎用)    --- 数据是否备份了 rm === remove rm /oldboy/oldboy.txt  --- 删除文件 rm ...

  8. 推荐一个高效,易用功能强大的可视化API管理平台

    项目管理 提供基本的项目分组,项目管理,接口管理功能 接口管理 友好的接口文档,基于websocket的多人协作接口编辑功能和类postman测试工具,让多人协作成倍提升开发效率 MockServer ...

  9. valet环境PHPstorm+xdebug调试

    1.安装xdebug 2.配置xdebug zend_extension="/usr/local/Cellar/php@7.2/7.2.18/pecl/20170718/xdebug.so& ...

  10. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...