在运行时构造OpenCV元素类型

时间:2010-06-26 04:10:27

标签: c++ opencv

在OpenCV中,当我需要创建一个cv :: Mat时,我需要做一些事情

cv::Mat new_mat(width, height, CV_32FC3)

如果我只知道我需要浮点数或双精度数+在运行时是否需要1/2/3通道,会发生什么?

换句话说,给定元素类型(float)和通道数(int),我该如何构造术语:CV_32FC3?

1 个答案:

答案 0 :(得分:5)

阅读cxtypes.h的来源。它包含如下行:

#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))

#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))

CV_MAKETYPE定义为:

#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))

这表明以下代码:

bool isdouble;
int nchannels;
// ...
if (isdouble) typeflag = CV_64FC(nchannels);
else typeflag = CV_32FC(nchannels);

我没有测试过这个;让我知道它是否有效。另外:我讨厌opencv糟糕的类型安全性。

相关问题