美文网首页机器视觉OpenCv
告别EmguCV!OpenCvSharp3 初探

告别EmguCV!OpenCvSharp3 初探

作者: 饮茶先啦靓仔 | 来源:发表于2018-11-14 11:10 被阅读5次

    最近接了个小毕设,要求用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#这方面的话还是要用熟练,搞机器视觉这行还是很有用的。

    相关文章

      网友评论

        本文标题:告别EmguCV!OpenCvSharp3 初探

        本文链接:https://www.haomeiwen.com/subject/ytvdfqtx.html