访问OpenCV中多维Mat的子矩阵

时间:2012-09-11 12:26:59

标签: matlab opencv matrix

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

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

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

Edit01: 此外,对于多维Mat,属性cols和行不足以表征矩阵的3个大小。有些情况下维度大于3.如何存储这些属性?

Edit02:

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

我放弃了使用OpenCV Mat进行子矩阵访问的想法。也许,它在OpenCV中不受支持。但是从这个示例代码中,构造函数从'sz'接收第三维。 Mat第三维的哪个属性被传递给?可能在这种情况下,行= 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:对不起,如果我的帖子写得太乱了!!我是一个novic程序员,试图解决我的编程问题。如果我的方法不好或不够正确,Plz可以随意纠正我。谢谢!!

2 个答案:

答案 0 :(得分:6)

您可以使用函数rowRange,colRange甚至

轻松访问2D cv :: Mat的子矩阵
cv::Mat subMat = originalMat(cv::Rect(x,y,width,height));

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

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

[编辑]

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

我担心你必须做一些工作来为dim> 2提取子矩阵,直接处理行数据。但是你可以使用Mat :: step中存储的信息来告诉你数组的布局。这在official documentation

中有解释

答案 1 :(得分:0)

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

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

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