前面我們准備好了相關的庫,現在開始搭建環境,本人自動化行業,就用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效果分別如下:




本次實例結束。希望大家動手操作,這樣才能學習到東西。
各位,如果需要我的源碼,請留言,謝謝!
