第一個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變量)

 

 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效果分別如下:

本次實例結束。希望大家動手操作,這樣才能學習到東西。

各位,如果需要我的源碼,請留言,謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM