我一直在使用c-style api来生成opencv类型的代码。例如:
cv::Mat(h, w, CV_8UC2);
CV_8UC2是types_c.h中定义的宏(不建议使用?):
#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
c ++ api中是否存在类似的类型代码生成函数,类似于
Mat m(w,h, cv::Type(Vec<unsigned char, 2>).typecode()) ?
答案 0 :(得分:2)
正如我在评论中所说,CV_MAKETYPE
并未弃用,而且它是生成这些“类型代码”的标准方式。
然而(只是为了好玩),另一种更多的C ++ - ish,生成任意代码的方式(仍然在编译时)可以通过使用TMP来实现...
template <int depth,
int cn>
struct make_type
{
enum {
// (yes, it is exactly the same expression used by CV_MAKETYPE)
value = ((depth) & CV_MAT_DEPTH_MASK) + (((cn)-1) << CV_CN_SHIFT)
};
};
// You can check that it works exactly the same as good, old `CV_MAKETYPE`
cout << make_type<CV_8U,2>::value << " "<< CV_MAKETYPE(CV_8U,2) << endl;
......但不要这样做。虽然tmp既有趣又令人惊叹,CV_MAKETYPE
是在这种情况下做事的正确方法。
编辑:OpenCV有自己的类型特征实用程序。在core/traits.hpp
,我们可以找到课程DataType
:
DataType类主要用于提供...的描述 原始数据类型,不添加任何字段或方法 相应的类(实际上不可能添加任何东西 原始的C / C ++数据类型)。这种技术在C ++中称为 阶级特征。它不是DataType本身使用的 专业版 ... 此类的主要目的是转换编译时类型 信息与OpenCV兼容的数据类型标识符 ......
所以,等等 traits用于告诉OpenCV您正在使用哪种数据类型, 即使这样的类型不是OpenCV的原生类型。