访问OpenCV中多维Mat的子矩阵

TSL*_*SL_ 7 matlab opencv matrix

根据这篇 文章和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));
Run Code Online (Sandbox Code Playgroud)

我放弃了使用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;
}  
Run Code Online (Sandbox Code Playgroud)

接下来的问题是定义"创建"功能的位置和方式?=>在OpenCV中跟踪这个Mat定义可能有助于我在Mat矩阵中修改/自定义我自己的特性

PS:不好意思,如果我的帖子太乱了!我是一个novic程序员,试图解决我的编程问题.如果我的方法不好或不够正确,Plz可以随意纠正我.谢谢!!

rem*_*emi 6

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

cv::Mat subMat = originalMat(cv::Rect(x,y,width,height));
Run Code Online (Sandbox Code Playgroud)

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

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

[编辑]

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

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