簡體   English   中英

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

[英]How do i get the size of a multi-dimensional cv::Mat? (Mat, or MatND)

我正在創建一個多維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中沒有看到任何方法

您剛剛發現自己是OpenCV C ++ API的眾多缺陷之一。

如果你看看OpenCV 2.4.6.1版的源代碼,你會發現cv::Mat::sizecv::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手冊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;

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

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,
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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM