最近接了个小毕设,要求用winform调用OpenCV识别一些简单的物件。网上关于调用DLL的文看的我一头雾水,而且也知道有类似OpenCV的C#接口的计算机视觉库,也就直接去了解这方面了。EmguCV应该是比较早且之前比较出名的C#版OpenCV,目前项目有507个stars。然而另一个日本人编写的类库已经有1200+的stars,并且在Visual Studio中下载量也已经超过了OpenCvSharp。下面就以OpenCvSharp为大家传授点人生经验(啊蛤)。
作者github
INTRO
这是项目的链接,里面有详细的介绍和Document。
项目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#这方面的话还是要用熟练,搞机器视觉这行还是很有用的。
网友评论