如何生成cv :: Mat类型的代码?

时间:2015-06-19 13:39:24

标签: c++ opencv

我一直在使用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()) ?

1 个答案:

答案 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的原生类型。