OpenCV 4.5.3(日本語機械翻訳)
cv::DataType< _Tp > クラステンプレート

Template "trait" class for OpenCV primitive data types. [詳解]

#include <traits.hpp>

詳解

template<typename _Tp>
クラス cv::DataType< _Tp >

OpenCV の基本的なデータ型に特化したテンプレート「trait」クラス.

覚え書き
非推奨です.これは,「単一目的」の trait に置き換えられます.traits::Typeおよびtraits::Depth

OpenCV のプリミティブなデータ型は, unsigned char, bool, signed char, unsigned short, signed short, int, float, double のうちの1つ,あるいは,これらの型の値のタプルで,タプル内のすべての値が同じ型であるものです.CV_<bit-depth>{U|S|F}C(<number_of_channels>)の形式の識別子によって,リスト内の任意のプリミティブな型を定義することができます.例えば, uchar CV_8UC1,3要素の浮動小数点タプル CV_32FC3 などです.このようなプリミティブなデータ型の1つのインスタンスを格納することができる,普遍的な OpenCV の構造体はVec. このようなデータ型の複数のインスタンスは,std::vector に格納することができます.Mat,Mat_,SparseMat,SparseMat_などのコンテナに格納することができます.Vecインスタンスを格納できるその他のコンテナに格納できます。

のクラスはスレッドセーフではありません。DataTypeクラスは基本的に、対応するクラスにフィールドやメソッドを追加することなく、そのようなプリミティブなデータ型の説明を提供するために使用されます(実際には、C/C++のプリミティブなデータ型に何かを追加することは不可能です)。この手法はC++ではクラスの特性として知られています。これはDataTypeそれ自体が使われるのではなく、次のような特殊化されたバージョンが使われます。

template<> class DataType<uchar>
{
typedef uchar value_type;
typedef int work_type;
typedef uchar channel_type;
enum { channel_type = CV_8U, channels = 1, fmt='u', type = CV_8U };
};
...
template<typename _Tp> DataType<std::complex<_Tp> >
{
typedef std::complex<_Tp> value_type;
typedef std::complex<_Tp> work_type;
typedef _Tp channel_type;
// DataDepth is another helper trait class
enum { depth = DataDepth<_Tp>::value, channels=2,
fmt=(channels-1)*256+DataDepth<_Tp>::fmt,
type=CV_MAKETYPE(depth, channels) };
};
...

このクラスの主な目的は,コンパイル時の型情報を,OpenCVと互換性のあるデータ型識別子に変換することなどです.

// allocates a 30x40 floating-point matrix
Mat A(30, 40, DataType<float>::type);
Mat B = Mat_<std::complex<double> >(3, 3);
// the statement below will print 6, 2 , that is depth == CV_64F, channels == 2
cout << B.depth() << ", " << B.channels() << endl;

つまり,このような特性は,たとえデータ型が OpenCV のネイティブなものでなくても,どのデータ型を扱っているかを OpenCV に伝えるために使用されます.例えば,上述の行列 B の初期化がコンパイルされるのは,OpenCV が適切な特殊テンプレートクラスであるDataType<この機構は,一般的なアルゴリズムの実装にも役立ちます(OpenCVではこのように使用されています).

覚え書き
サポートされていない型の使用に関して開発者を混乱させないために,デフォルト値を削除しました(#7599 参照).

このクラス詳解は次のファイルから抽出されました: