告別EmguCV!OpenCvSharp3 初探

johnychen發表於2021-09-09

最近接了個小畢設,要求用winform呼叫OpenCV識別一些簡單的物件。網上關於呼叫DLL的文看的我一頭霧水,而且也知道有類似OpenCV的C#介面的計算機視覺庫,也就直接去了解這方面了。EmguCV應該是比較早且之前比較出名的C#版OpenCV,目前專案有507個stars。然而另一個日本人編寫的類庫已經有1200+的stars,並且在Visual Studio中下載量也已經超過了OpenCvSharp。下面就以OpenCvSharp為大家傳授點人生經驗(啊蛤)。


圖片描述

作者github

INTRO

這是專案的,裡面有詳細的介紹和Document。

圖片描述

專案Feature


專案Features如上。比較好的一點就是能夠很方便地跟.Net平臺的資料結構進行轉換。而且相對EmguCV而言,實現的演算法更多,風格也跟C++ API更相似。


對於商用來說,EmguCV使用的是GPL協議,OpenCvSharp則是跟OpenCV一樣的BSD協議(網上有人說是LGPL?但github上的README列出來的是BSD)。這方面的話對於學習者來說沒啥區別,但對於正兒八經的開發者來說還是需要考慮的,BSD則是更有吸引力的協議。

至於安裝也是十分簡單,只需要在VS上就能完成。我這裡使用的是2017 community,僅供參考。

圖片描述

開啟NuGet包管理器

圖片描述

等待安裝完成就好

可以看到,下載量足足有20w,而且已經超過了EmguCV了。

Demo

這裡使用Winform做個帶介面的小程式,拖個按鈕就好。也可以使用空專案。

private void btnOpen_Click(object sender, EventArgs e){    //選擇圖片
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.RestoreDirectory = true;    string imgName = "";    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        imgName = openFileDialog.FileName;
    }
    Console.WriteLine("檔名為" + imgName);    //讀取並進行邊緣檢測
    Mat srcImg = new Mat(imgName, ImreadModes.Color);
    Cv2.ImShow("input", srcImg);

    Mat dstImg = new Mat();
    Cv2.Canny(srcImg, dstImg, 50, 200);
    Cv2.ImShow("output", dstImg);
}

圖片描述

國際慣例,lenna女神拿出來

圖片描述

Canny邊緣檢測

其他

由於一年多沒用C#和Winform,所以語法方面忘得差不多了。嘮叨一下專案中遇到的坑。

在C艹中,ROI是可以這樣定義的。image是事先定義的Mat。

Mat imageROI = image(Rect(500, 250, logo.cols, logo.rows));

而在C井中,要這樣定義

Mat dstImg = new Mat(srcImg, new Rect(x, y, width, height));

當時想用C++的Style來定義,搞了半天發現根本就沒實現。。。當時就在吐槽,後來發現C#是不能對括號進行過載的 = =!真是尷尬。C#這方面的話還是要用熟練,搞機器視覺這行還是很有用的。



作者:Jacob楊幫幫
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4301/viewspace-2819327/,如需轉載,請註明出處,否則將追究法律責任。