OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
cv::DataType< _Tp > 类模板引用

OpenCV 原始数据类型的“trait”类。更多...

#include <opencv2/core/traits.hpp>

cv::DataType< _Tp > 的协作图

详细说明

template<typename _Tp>
class cv::DataType< _Tp >

OpenCV 原始数据类型的模板“trait”类。

注意
已弃用。此功能已被“单一用途”的 trait 取代:traits::Type 和 traits::Depth

原始 OpenCV 数据类型包括 unsigned char、bool、signed char、unsigned short、signed short、int、float、double,或包含上述类型值的元组(元组中的所有值具有相同的类型)。列表中的任何原始类型都可以通过 CV_<位深度>{U|S|F}(<通道数>) 形式的标识符定义,例如:uchar CV_8UC1,3 元素浮点元组 CV_32FC3,依此类推。一个能够存储此类原始数据类型单个实例的通用 OpenCV 结构是Vec。此类类型的多个实例可以存储在 std::vector、MatMat_SparseMatSparseMat_,或任何其他能够存储Vec 实例的容器中。

DataType 主要用于在不向相应类添加任何字段或方法(实际上无法向原始 C/C++ 数据类型添加任何内容)的情况下描述此类原始数据类型。此技术在 C++ 中称为类 trait。使用的不是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 是另一个辅助 trait 类
enum { depth = DataDepth<_Tp>::value, channels=2,
fmt=(channels-1)*256+DataDepth<_Tp>::fmt,
type=CV_MAKETYPE(depth, channels) };
};
...
@ value
定义 traits.hpp:289
@ fmt
定义 traits.hpp:290
OpenCV 原始数据类型的模板“trait”类。
定义 traits.hpp:113
#define CV_8U
定义于 interface.h:73
unsigned char uchar
定义于 interface.h:51
#define CV_MAKETYPE(depth, cn)
定义于 interface.h:85

此类的主要目的是将编译时类型信息转换为 OpenCV 兼容的数据类型标识符,例如

// 分配一个 30x40 的浮点矩阵
// 下面的语句将打印 6, 2,即 depth == CV_64F, channels == 2
cout << B.depth() << ", " << B.channels() << endl;
派生自 Mat 的模板矩阵类。
定义于 mat.hpp:2296
n 维密集数组类
定义于 mat.hpp:840
int depth() const
返回矩阵元素的深度。
int channels() const
返回矩阵通道数。

因此,此类 trait 用于告知 OpenCV 您正在使用哪种数据类型,即使该类型不是 OpenCV 的原生类型。例如,上面的矩阵 B 初始化能够编译,是因为 OpenCV 定义了适当的特化模板类 DataType<complex<_Tp> >。此机制对于泛型算法的实现也很有用(并且 OpenCV 也是这样使用的)。

注意
已删除默认值,以避免因使用不受支持的类型而令开发者感到困惑(参见 #7599)

该类的文档由以下文件生成: