Miki's answerから開発して、
OpenCV 3 の定義は modules/core/include/opencv2/core/ traits.hppに移動しました。
/** @brief A helper class for cv::DataType
The class is specialized for each fundamental numerical data type supported by OpenCV. It provides
DataDepth<T>::value constant.
*/
template<typename _Tp> class DataDepth
{
public:
enum
{
value = DataType<_Tp>::depth,
fmt = DataType<_Tp>::fmt
};
};
template<int _depth> class TypeDepth
{
enum { depth = CV_USRTYPE1 };
typedef void value_type;
};
template<> class TypeDepth<CV_8U>
{
enum { depth = CV_8U };
typedef uchar value_type;
};
template<> class TypeDepth<CV_8S>
{
enum { depth = CV_8S };
typedef schar value_type;
};
template<> class TypeDepth<CV_16U>
{
enum { depth = CV_16U };
typedef ushort value_type;
};
template<> class TypeDepth<CV_16S>
{
enum { depth = CV_16S };
typedef short value_type;
};
template<> class TypeDepth<CV_32S>
{
enum { depth = CV_32S };
typedef int value_type;
};
template<> class TypeDepth<CV_32F>
{
enum { depth = CV_32F };
typedef float value_type;
};
template<> class TypeDepth<CV_64F>
{
enum { depth = CV_64F };
typedef double value_type;
};
ほとんどの場合/コンパイラでは、 C ++ の正確なデータ型を使用しても問題ありません。C++ で明確に定義されCV_8U
ているように、シングル バイト データ型 ( ->uint8_t
およびCV_8U
-> int8_t
)に問題はありません。float (32bit) と double (64bit)についても同じです。ただし、他のデータ型が正しいデータ型を使用していることを完全に確認するには (メソッドを使用する場合など)、次の例を使用する必要があります。at<>
typedef TypeDepth<CV_WHATEVER_YOU_USED_TO_CREATE_YOUR_MAT>::value_type access_type;
myMat.at<access_type>(y,x) = 0;
余談ですが、正確なデータ型を単純に使用するのではなく、このようなあいまいなアプローチを取ることにしたことに驚いています。
したがって、最後の質問に関して:
たとえば、どのタイプから期待する必要がありCV_32S
ますか?
OpenCV 3 での最も正確な答えは次のとおりだと思います。
TypeDepth<CV_32S>::value_type