如何生成 cv::Mat 类型代码
How to generate a cv::Mat type code?
我一直在使用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的原生类型。
相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 类没有命名C++代码中的类型错误
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 扩展C++生成的代码的模板参数类型名称
- 有没有办法通过使用十进制 ASCII 代码自动类型扣除来获取字符?
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 用于C++代码的 API 监视器类型定义 (XML)
- 避免使用 std::any 编写相同的重复类型检查代码
- turbo 为什么我的C++代码中出现错误类型名称预期"错误?
- 具有相同数据类型代码的相同逻辑代码在 Java 中传递,但不在 C++ 中传递?
- 如何在数组类型的模板代码中计算std::size_t
- 将-Wtype限制与类型泛型代码一起使用
- 将fwrite转换为C++类型代码以写入二进制文件
- 当没有浮点数据类型时,为什么此代码会出现浮点异常
- Cython:如何从C级类型获取'actual Python type'(类型代码/dtype)
- 如何生成 cv::Mat 类型代码