【问题标题】:What is the fundamental difference between Matrix<TDepth> and Mat in EmguCV?EmguCV 中 Matrix<TDepth> 和 Mat 的根本区别是什么?
【发布时间】:2018-11-03 19:58:37
【问题描述】:
  • 为什么在 EmguCV 中 Mat 不够用?
  • 为什么Matrix&lt;&gt; 不能从文件本身加载图像?

例如,

Mat img = new Mat(path);

是一个有效的操作。但是,

Matrix<byte> img = new Matrix<byte>(path);

或者,

Matrix<byte> img = Matrix<byte>.FromFile(path);

不是有效的操作。

【问题讨论】:

  • 这些“额外”类中的许多看起来要么像包装遗留物的东西,要么像在托管环境中工作的便利。我认为在大多数情况下,如果您想充分利用 OpenCV 本身,Mat 就足够了。通常必须直接访问单个像素有点反模式(您错过了所有优化的 OpenCV 功能)。

标签: c# opencv emgucv


【解决方案1】:

根据来自Emgu Wiki 的信息,这两种类型的根本区别在于底层数据数组是否是托管的。

Mat 是 C++ cv::Mat 类的包装器。通常,此类充当智能指针,它管理为其拥有的数据数组分配的内存(尽管它也能够观察——这种能力的一个很好的例子是能够为 @987654323 返回 Mat 标头@C# 中的实例)。这意味着 OpenCV 能够根据需要(重新)分配内存。权衡是在这种情况下,more difficult 可以在 C# 中有效地访问底层数据。

Matrix 类使用托管数组来保存数据。这意味着您可以轻松访问 C# 中的底层数据数组。

老实说,告诉您为什么无法从图像文件加载Matrix 的最佳人选是作者。我的猜测是它旨在代表图像以外的其他事物。从技术上讲,这可以像加载图像文件的能力一样添加到 Mat 包装器(C++ 等价物没有这样的功能)。

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 2016-09-30
    • 1970-01-01
    • 2019-12-04
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    相关资源
    最近更新 更多