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

How to generate a cv::Mat type code?

本文关键字:类型 代码 Mat cv 何生成      更新时间:2023-10-16

我一直在使用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的原生类型。