据此 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可以随意纠正我。谢谢!!答案 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 是一个二维矩阵,因此您可以随心所欲。