今天给大家推荐一个.NET 开发的用于图像处理和计算机视觉的开源库OpenCvSharp4。它提供了丰富的功能和算法,可以帮助开发人员快速实现各种图像处理任务。
OpenCvSharp4用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考。该库采用LGPL发行,对商业应用友好。使用OpenCvSharp,可实现多种流行的图像处理(image processing)与计算机视觉(computer vision)算法。
.NET CLI方式
dotnet add package OpenCvSharp4.Extensions --version 4.8.0.20230708 dotnet add package OpenCvSharp4.Windows --version 4.8.0.20230708
Package Manager方式
Install-Package OpenCvSharp4.Extensions -Version 4.8.0.20230708 Install-Package OpenCvSharp4.Windows -Version 4.8.0.20230708
一个简单的例子
using OpenCvSharp; class Program { static void Main() { using var src = new Mat("lenna.png", ImreadModes.Grayscale); using var dst = new Mat(); Cv2.Canny(src, dst, 50, 200); using (new Window("src image", src)) using (new Window("dst image", dst)) { Cv2.WaitKey(); } } }
上述代码中,Mat 和 MatExpr 等类的对象具有非托管资源,这意味着它们在垃圾回收器之外进行内存管理。因此,在使用完这些对象后,需要手动调用 Dispose() 方法来释放它们。
最糟糕的是,+、-、* 等运算符每次都会创建新的对象。如果这些对象没有被释放,就会导致内存泄漏。
using 语法可以帮助我们自动释放 Mat 和 MatExpr 等对象,从而避免内存泄漏。但是,如果我们使用运算符来对这些对象进行操作,则仍然需要手动释放结果对象。
那么有没有更好的办法处理释放对象的问题呢?答案是肯定的。那就是使用ResourcesTracker。因为 ResourcesTracker 类实现了 IDisposable 接口,因此我们可以在 using 语句中使用ResourcesTracker 来处理对象的释放问题。如下代码:
using (var t = new ResourcesTracker()) { Mat mat1 = t.NewMat(new Size(100, 100), MatType.CV_8UC3, new Scalar(0)); Mat mat3 = t.T(255-t.T(mat1*0.8)); Mat[] mats1 = t.T(mat3.Split()); Mat mat4 = t.NewMat(); Cv2.Merge(new Mat[] { mats1[0], mats1[1], mats1[2] }, mat4); } using (var t = new ResourcesTracker()) { var src = t.T(new Mat(@"lenna.png", ImreadModes.Grayscale)); var dst = t.NewMat(); Cv2.Canny(src, dst, 50, 200); var blurredDst = t.T(dst.Blur(new Size(3, 3))); t.T(new Window("src image", src)); t.T(new Window("dst image", blurredDst)); Cv2.WaitKey(); }
OpenCvSharp4更多的使用方法,可以参阅示例和 Wiki 页面。所有连接在文末!
资源获取方式
源码:
https://github.com/shimat/opencvsharp
示例:
https://github.com/shimat/opencvsharp_samples/
Wiki:
https://github.com/shimat/opencvsharp/wiki