8

根据这篇 文章和 OpenCV 文档,我可以初始化和访问多维 Mat 的每个元素。

实际上,我首先在 MATLAB 中编码,现在需要转换为 OpenCV。MATLAB 矩阵支持子矩阵访问,例如:a(:,:,3) 或 b(:,:,3:5)

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

Edit01:此外,对于多维 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:如果我的帖子写的太乱了请见谅!!我是一个新手程序员,试图解决我的编程问题。如果我的方法不够好或不够正确,请随时纠正我。谢谢!!

4

2 回答 2

7

您可以使用函数 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 中的信息来告诉您数组的布局。这在官方文档中有解释。

于 2012-09-11T13:18:10.463 回答
0

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

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

subMat 是一个二维矩阵,所以你可以做你想做的事。

于 2021-03-05T10:35:55.770 回答