我如何获得多维cv :: Mat的大小?(Mat或MatND)

Pet*_*ete 17 c++ opencv mat

我正在创建一个多维MAT对象,并希望得到对象的大小 - 例如,

const int sz[] = {10,10,9};
Mat temp(3,sz,CV_64F);
std::cout << "temp.dims = " << temp.dims << " temp.size = " << temp.size() << " temp.channels = " << temp.channels() << std::endl;
Run Code Online (Sandbox Code Playgroud)

我相信得到的MAT是10x10x9,我想确认一下,但是COUT声明给出了:

temp.dims = 3 temp.size = [10 x 10] temp.channels = 1

我希望看到:

temp.dims = 3 temp.size = [10 x 10 x 9] temp.channels = 1

要么:

temp.dims = 3 temp.size = [10 x 10] temp.channels = 9

如何获得此Mat对象的维度?我在Mat :: Mat或MatND中没有看到任何方法

bru*_*tra 32

您刚刚发现自己是OpenCV C++ API的众多缺陷之一.

如果你看一下OpenCV的源代码版本2.4.6.1,你会发现它cv::Mat::size是一个类型的成员对象,cv::Mat::MSize定义为

struct CV_EXPORTS MSize
{
    MSize(int* _p);
    Size operator()() const;
    const int& operator[](int i) const;
    int& operator[](int i);
    operator const int*() const;
    bool operator == (const MSize& sz) const;
    bool operator != (const MSize& sz) const;

    int* p;
};
Run Code Online (Sandbox Code Playgroud)

因此cv::Mat::size()实际上指的是cv::Mat::MSize::operator ()(),其返回类型Size被定义为

typedef Size_<int> Size2i;
typedef Size2i Size;
Run Code Online (Sandbox Code Playgroud)

引用OpenCV手册,Size是一个

"用于指定图像或矩形大小的模板类.该类包括两个名为width和height的成员."

换句话说,Size仅适用于2D矩阵.

幸运的是,所有希望都不会丢失,因为您可以使用它cv::Mat::MSize::operator [](int i)来获得矩阵沿其第i维的大小.

const int sz[] = {10,10,9}; 
cv::Mat temp(3,sz,CV_64F); 
std::cout << "temp.dims = " << temp.dims << "temp.size = [";
for(int i = 0; i < temp.dims; ++i) {
    if(i) std::cout << " X ";
    std::cout << temp.size[i];
}
std::cout << "] temp.channels = " << temp.channels() << std::endl;
Run Code Online (Sandbox Code Playgroud)

temp.dims = 3 temp.size = [10 x 10 x 9] temp.channels = 1

  • 多么详尽的答案!谢谢!事实证明,我发现现在使用Vector <Mat>来存储每个切片更容易(我没有做太多的交叉切片索引).接受并投票. (3认同)
  • @Pete`cv :: Mat _ <>`继承`cv :: Mat`,因此可以隐式转换为它,因此它可以在大多数情况下无缝地替换`cv :: Mat`.它的主要好处是静态类型,从某种意义上说,编译器需要处理基础数据类型的检查(不要超过预期,可能会添加).这意味着不再像断言这样的无意义来检查矩阵的基础数据类型,动态函数重载技术,并且列表继续.任何已经使用过OpenCV的人都可以证明这些是最容易出错的警告. (2认同)

Sam*_*eer 14

OpenCV 2.4.9处理多维尺寸就好了.该struct cv::Mat::MSize罐存储和返回多个维度.数据成员cv::Mat::size属于该类型cv::Mat::MSize.此代码将为您枚举尺寸:

const int sz[] = {3, 4, 3, 6};
cv::Mat bigm(4, sz, CV_8UC1);
cout << bigm.dims << '\t';
for (int i=0; i<bigm.dims; ++i)
  cout << bigm.size[i] << ',';
cout << endl;
Run Code Online (Sandbox Code Playgroud)

输出是:

4       3,4,3,6,
Run Code Online (Sandbox Code Playgroud)