第一个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, 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变量)

 

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

 5.两个button点击事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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那里就有显示了,还是很直观方便的。

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

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

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

 

posted on   半路敲代码  阅读(5898)  评论(17编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示