我正在创建一个多维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;
我相信得到的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
中没有看到任何方法答案 0 :(得分:28)
您刚刚发现自己是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;
};
因此cv::Mat::size()
实际上是指cv::Mat::MSize::operator ()()
,其返回类型Size
定义为
typedef Size_<int> Size2i;
typedef Size2i Size;
引自OpenCV manual,Size
是
“用于指定图像或矩形大小的模板类。该类包括两个名为width和height的成员。”
换句话说,Size
仅适用于2D矩阵。
幸运的是,所有希望都没有像you can use cv::Mat::MSize::operator [](int i)
to get the size of the matrix along its i-th dimension那样失去。
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;
temp.dims = 3 temp.size = [10 x 10 x 9] temp.channels = 1
答案 1 :(得分: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;
输出结果为:
4 3,4,3,6,
答案 2 :(得分:1)
std::vector<size_t> getMatDims(const cv::Mat& m)
{
std::vector<size_t> dims(m.dims);
std::partial_sum(&m.step[0],&m.step[0]+m.dims,dims.begin(),[](size_t a,size_t b){ return a/b; });
return dims;
}