第一个C# Winform实例

第一个C# Winform实例前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入。VS版本VS20171:打开VS建立一个WInform项目。拉入两个控件,gr

大家好,又见面了,我是你们的朋友全栈君。

 

前面我们准备好了相关的库,现在开始搭建环境,本人自动化行业,就用Windorm开发吧,例子仅仅做引导,希望大家能深入。VS版本VS2017

1:打开VS建立一个WInform 项目。拉入两个控件,groupbox,picturebox放到左侧,右侧也拉入一个groupbox,里面放入两个button.一个用来选择图片,一个用来测试二值化的效果。UI效果如下:

<span role="heading" aria-level="2">第一个C# Winform实例

2:本人系统win10,64位。所以用OpencvSharp的64位库。先在项目里添加引用:(net461版本);然后在类里添加 using OpenCvSharp;最后根据个人项目平台,选择新建X64或者X86,用anycpu 容易出问题。好了,经过上面的准备,OpencvSharp相关库所有的东西都可以调用了。

<span role="heading" aria-level="2">第一个C# Winform实例

 

<span role="heading" aria-level="2">第一个C# Winform实例

 

 <span role="heading" aria-level="2">第一个C# Winform实例

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, 1);
            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, 1);
                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.代码敲完。剩下我们测试一下效果:运行前,需要将对应的下面两个dll :OpenCvSharpExtern.dll和opencv_videoio_ffmpeg411.dll这2个运行时复制到可执行目录即可,根据运行平台,有X86和X64 两种,需要注意一下。

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

<span role="heading" aria-level="2">第一个C# Winform实例

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

<span role="heading" aria-level="2">第一个C# Winform实例

<span role="heading" aria-level="2">第一个C# Winform实例

<span role="heading" aria-level="2">第一个C# Winform实例

<span role="heading" aria-level="2">第一个C# Winform实例

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

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155402.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SPSS作业-卡方检验-列联表[通俗易懂]

    SPSS作业-卡方检验-列联表[通俗易懂]作业要求:某厂生产三种类型啤酒:淡啤酒、普通啤酒、黑啤酒。根据下列资料检验男性与女性饮酒者啤酒偏好是否相同。 作业数据: 淡啤 普啤 黑啤 合计 男性 20 40 20 80 女性 30

    2022年5月16日
    35
  • icem不同的划分网格,但是质量差不多

    icem不同的划分网格,但是质量差不多

    2022年5月9日
    52
  • PP图和QQ图

    一.QQ图分位数图示法(QuantileQuantilePlot,简称Q-Q图)统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们的两个分位数放在一起比较。首先选好分位数间隔。图上的点(x,y)反映出其中一个第二个分布(y坐标)的分位数和与之对应的第一分布(x坐标)的相同分位数。因此,这条线是一条以分位数间隔为参数的曲线。如果两个分布相似,则该Q-Q图…

    2022年4月5日
    74
  • Jenkins的详细安装及使用

    Jenkins的详细安装及使用操作环境:Windows一、环境准备1安装JDK&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;本文采用jdk-8u111-windows-x64.exe;2配置tomcat&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbs

    2022年5月28日
    69
  • 什么是虚拟IP_虚拟机IP

    什么是虚拟IP_虚拟机IP【导读】虚拟ip和真实ip区别,下面就是191路由网整理的网络知识百科,来看看吧!大家好,我是191路由器网小编,上述问题将由我为大家讲解。虚拟ip和真实ip区别是真实IP是网络运营商提供的所以不能自己变更,虚拟IP是自己设置的可以变更。虚拟IP,就是一个未分配给真实主机的IP。也就是说对外提供服务器的主机除了有一个真实IP外还有一个虚拟IP,使用这两个IP中的任意一个都可以连接到这台主机。互联网…

    2022年10月20日
    1
  • Java 八大基本数据类型

    Java 八大基本数据类型1.bit就是位,也叫比特位,是计算机表示数据最小的单位2.byte就是字节3.1byte=8bit,00011100,一般用两个16进制来显示,所以我们经常看到1个字节显示为1c4.1byte就是1Bbyte[]bs={(byte)0xff,0x0F,0x1F,0x2F,0x3F,0x4F,0x5F,0x6F};for(inti=0;i&lt;bs.le…

    2022年7月8日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号