65.9K
CodeProject 正在变化。 阅读更多。
Home

介绍 C# 的便携式图像 IO 库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (16投票s)

2014 年 10 月 14 日

LGPL3

4分钟阅读

viewsIcon

54677

C# 的便携式视频 IO 库

所有图像流读取器都在单个便携式库中。

目录

  1. 引言
  2. 便携式图像 IO 库
  3. NuGet 包
  4. 结论

引言

.NET Framework 缺少视频 IO API。相反,我们必须依赖各种第三方库,这些库提供依赖于平台的解决方案。当前的图像处理和计算机视觉库,如 AForge.NET、Accord.NET 或 EmguCV,带来了许多算法,但它们缺乏统一的视频、相机和图像目录读写 API。AForge.NET 和 Accord.NET 库依赖于 DirectX,而 DirectX 不便携,EmguCV 仅仅封装了 OpenCV 文件和视频捕获,但没有提供统一的 API。

DotImaging.IO 库是 DotImaging Framework 的一部分,它为 IO 视频访问提供了一个统一的 API:网络摄像头支持、各种视频格式的读/写、图像目录读取器。所有操作都是流式的,并且被抽象化,因此不依赖于实际的视频源。该库采用平台抽象方式构建。如果您使用过 System.IO.Stream 类,那么您一定对 DotImaging.IO 库很熟悉。

DotImaging.IO

下图展示了图像 IO 读写、相机捕获和目录读取的统一架构。

点击图片放大图表。
类图。 该图显示了文件、相机和目录读写的统一 API。

所有其他类继承的基类是 ImageStream<TImage>,其中 TImage 是泛型图像类型。此类包含基本的流属性,但您可能不会直接使用它。更有趣的类,您将更经常使用它们的是:ImageStreamReader<TImage>ImageStreamWriter<TImage>。这些类具有很好的属性。

  1. 类成员使用流式类族的标准名称。

    通过使用熟悉的名称,开发人员不必学习任何新东西。

  2. 它们足以满足所有基本的视频 IO 操作。

    如果您只需要不包含特定类型成员的共享 IO 操作,ImageStreamReader<TImage>ImageStreamWriter<TImage> 类足以满足所有视频 IO 操作。提供的抽象层使您可以编写不单独处理视频流源类型的程序,从而使代码干净且易于维护。

现在,这里有一些具体的示例!

读取

对于基本的流操作,只需要 ImageStreamReader 类,它是 ImageStreamReader<TImage> 类的非泛型版本。下面的列表显示了如何捕获相机和文件流,以及读取图像目录。ImageStreamReader<TImage> 类还实现了 System.IEnumerable<TImage> 接口,因此您可以在 foreach 循环中使用任何读取器,如以下示例所示。

  1. 相机
    //capture from camera
    ImageStreamReader reader = new CameraCapture(cameraIndex: 0);
    
  2. 视频
    //capture from video
    ImageStreamReader reader = new FileCapture("file name.mp4"); 
    
  3. 目录图像流
    //capture from folder(s)
    ImageStreamReader reader = new ImageDirectoryCapture("Image folder", "*.jpg", recursive: false); 
    
reader.Open(); //open reader

var singleImage = reader.ReadAs<Bgr<byte>>(); //read one image

//...or read all images
foreach(var image in reader)
{
   //do something with the image
}

//or read to a managed buffer 
Bgr<byte>[,] buffer = null;
reader.ReadTo(ref buffer);

reader.Close(); //close reader

更多选项

  • 更具体的选项已在具体类中实现,因为它们是每个 IO 源特有的。下面的列表显示了在提供的类图中可以看到的成员。它们也显示在下方。
  • 文件 - FileCapture
    (继承自 VideoCaptureBase)

  • 相机 - CameraCapture
    (继承自 VideoCaptureBase) + 相机硬件参数 - 亮度、对比度、曝光、帧率、增益、色相、饱和度

  • 图像目录读取 - ImageDirectoryCapture
    根目录信息(可递归读取)、文件信息、当前图像名称

读取器还实现了新的 async 模式,因此您可以享受异步视频读取。

Image<Bgr, byte> frame = null;
async void captureFrame()
{
   frame = await capture.ReadAsync(); //reads stream asynchronously
}

写入

该库还提供了从图像编译视频的功能。如果您使用过 System.IO.StreamWriter,您就会知道如何使用 VideoWriter 类。

Image<Bgr, byte> frame = ... //an image

ImageStreamWriter writer = new VideoWriter
                               (
                                 fileName: "output.avi", 
                                 frameSize: new Size(640, 480), 
                                 fps: 30
                               ); //create writer

writer.Open(); //open writer
writer.Write(frame); //write single image 
writer.Close(); //close writer

VideoWriter 类还可以接受编解码器名称,但如果编解码器未安装,则写入操作可能会失败。

NuGet 包

尽管实现使用了非托管库,但提供的 NuGet 包是平台抽象的 - 目前(x86 / x64 - Windows)。根据运行的操作系统的体系结构,会加载相应的非托管库,因此开发人员无需单独处理多个操作系统体系结构。下图显示了预编译的库位置。

预编译库。 非托管库已预编译,并根据操作系统体系结构按需加载。

结论

本文介绍了便携式视频 IO 库,该库为文件和相机捕获以及图像目录读取提供了统一的流式接口。该库还支持视频写入。代码包含完整的源代码以及带注释的示例。该库是 DotImaging Framework 的一部分,DotImaging Framework 是一个通用的 .NET 图像处理框架,所以别忘了看一眼 :)。

历史

  • 2014 年 10 月 15 日 - 发布第一个版本
  • 2015 年 4 月 27 日 - 更新
  • 2015 年 9 月 15 日 - 更新
© . All rights reserved.