【问题标题】:access sub-matrix of a multidimensional Mat in OpenCV在 OpenCV 中访问多维 Mat 的子矩阵
【发布时间】:2012-09-04 09:11:03
【问题描述】:

据此 post 和 OpenCV 文档,我可以初始化和访问多维 Mat 的每个元素。

其实我一开始是用 MATLAB 编码的,现在需要转成 OpenCV。 MATLAB 矩阵支持子矩阵访问,例如:a(:,:,3) 或 b(:,:,3:5)

这可以在 OpenCV 中完成吗?据我所知,这可以用 2D Mat 来完成。更多的 2D 怎么样?

编辑01: 此外,对于多维 Mat,属性 cols 和 rows 不足以表征矩阵的 3 种大小。有维度大于3的情况,这些属性如何存储?

编辑02:

// create a 100x100x100 8-bit array
int sz[] = {100, 100, 100};
Mat bigCube(3, sz, CV_8U, Scalar::all(0));

我放弃了使用 OpenCV Mat 访问子矩阵的想法。也许,OpenCV 不支持它。但是从这个示例代码中,构造函数接收来自“sz”的第 3 个维度。这个第 3 维传递给 Mat 的哪个属性?可能在这种情况下,rows = 100,cols = 100,其他?? = 100 我迷失了 OPenCV 文档

Edit03:从 OpenCV 源跟踪 Mat 类 我从 mat.hpp 中找到 Edit02 中构造函数的定义:

inline Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s)
    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0),
    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
{
    create(_dims, _sz, _type);
    *this = _s;
}  

下一个问题是这里的“创建”函数是在哪里以及如何定义的? => 在 OpenCV 中跟踪这个 Mat 定义可能有助于我在 Mat 矩阵中修改/自定义我自己的特征

PS:如果我的帖子写的太乱了,请见谅!!我是一个新手程序员,试图解决我的编程问题。如果我的方法不够好或不够正确,请随时纠正我。谢谢!!

【问题讨论】:

  • 我有 core.hpp 来查看构造函数的所有声明,包括多维 Mat 的声明。但是我找不到定义的位置,我的意思是构造函数的编码,以查看第三维的属性。源代码在哪里??
  • 那会在那里:/modules/core/src/matrix.cpp。我正在编辑我对您的原始问题的回答如下
  • 你最终写了这段代码吗?我将不得不做同样的事情......
  • @ShawnLe 你能接受雷米的回答吗?

标签: matlab opencv matrix


【解决方案1】:

您可以使用函数 rowRange、colRange 甚至是函数轻松访问 2D cv::Mat 的子矩阵

cv::Mat subMat = originalMat(cv::Rect(x,y,width,height));

此外,您可以在矩阵构造函数中定义的矩阵中的通道数可以用作第三维(但我认为它仅限于 256 或 512)。

还有模板化的 cv::Mat_ 类,您可以根据自己的目的进行调整

[编辑]

我已经检查了 >2 维矩阵的构造函数。当您运行它时,Mat 的 rows 和 cols 字段设置为 -1。实际矩阵大小作为 int 数组存储在 Mat::size 中。 对于维度 >2 的矩阵,您不能使用 cv::Rect 或 rowRange/colRange 来使用子矩阵构造函数。

恐怕您必须做一些工作来提取 dim>2 的子矩阵,直接使用行数据。但是您可以使用存储在 Mat::step 中的信息来告诉您数组的布局。这在official documentation 中有解释。

【讨论】:

  • ..所以你的意思是,我应该编写单独的函数来进行这种矩阵访问??或者例如通过编写 myMat 将它们添加到 Mat 类?这是个很傻的问题,但作为一个业余程序员,我真的很想知道事情是如何以专业的方式完成的
  • 专业人士只是尝试做事 :) 在您的情况下,编写一个访问 N 维数据的函数可能很有用。我不会费心写一个新课程。
  • 我不想关闭这篇文章,因为我想通过编写自己的类/函数来完成它,并将它们像练习一样发布在这里。所以请原谅:)
【解决方案2】:

您可以通过以下方式创建子矩阵:

cv::Mat subMat(100,100,CV_8U, bigCube.ptr(0));

subMat 是一个二维矩阵,因此您可以随心所欲。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多