我一直在使用c风格的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()) ?
正如我在评论中所说,CV_MAKETYPE
没有被弃用,并且 afaik 它是生成这些"类型代码"的标准方法。
然而(只是为了好玩),通过使用 TMP,可以实现另一种更C++的生成任意代码(仍在编译时)的方法......
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
:
数据类型类基本上用于提供...基元数据类型,无需向相应的类(实际上不可能添加任何东西到基元 C/C++ 数据类型)。这种技术在C++被称为阶级特征。使用的不是数据类型本身,而是它的专用版本...此类的主要用途是转换编译时类型与 OpenCV 兼容的数据类型标识符的信息...
所以,这样的特征用于告诉 OpenCV 您正在使用哪种数据类型,即使这样的类型不是OpenCV的原生类型。