一个.NET 开发的用于图像处理和计算机视觉的开源库

2023-10-27 15:05:44 浏览数 (2)

今天给大家推荐一个.NET 开发的用于图像处理和计算机视觉的开源库OpenCvSharp4。它提供了丰富的功能和算法,可以帮助开发人员快速实现各种图像处理任务。

OpenCvSharp4用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考。该库采用LGPL发行,对商业应用友好。使用OpenCvSharp,可实现多种流行的图像处理(image processing)与计算机视觉(computer vision)算法。

安装OpenCvSharp4

.NET CLI方式

代码语言:javascript复制
dotnet add package OpenCvSharp4.Extensions --version 4.8.0.20230708
dotnet add package OpenCvSharp4.Windows --version 4.8.0.20230708

Package Manager方式

代码语言:javascript复制
Install-Package OpenCvSharp4.Extensions -Version 4.8.0.20230708
Install-Package OpenCvSharp4.Windows -Version 4.8.0.20230708

注意:OpenCvSharp4 和 OpenCvSharp4.runtime.win 不用安装,只要安装 OpenCvSharp4 .Windosw 即可。OpenCvSharp4.Windows 已经把这两个都打包进去了。

开始使用

一个简单的例子

代码语言:javascript复制
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 来处理对象的释放问题。如下代码:

代码语言:javascript复制
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

0 人点赞