20

多次元の 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 にメソッドが表示されませんでした

4

3 に答える 3

36

OpenCV C++ API の多くの欠陥の 1 つを発見しました。

OpenCV バージョン 2.4.6.1 のソース コードを見ると、が次のように定義されているcv::Mat::sizetype のメンバー オブジェクトであることがわかります。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マニュアルからの引用Sizeは、

"画像または四角形のサイズを指定するためのテンプレート クラスです。このクラスには、幅と高さという 2 つのメンバーが含まれています。"

つまり、Sizeは 2D 行列にのみ適しています。

幸いなことに、 i 番目の次元に沿って行列のサイズを取得するために使用できるためcv::Mat::MSize::operator [](int 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

于 2013-09-18T21:58:03.440 に答える
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;
}
于 2015-01-14T11:15:47.523 に答える