在运行时构建OpenCV元素类型

3
在OpenCV中,当我需要创建一个cv :: Mat时,我需要做类似以下的操作:
cv::Mat new_mat(width, height, CV_32FC3)

如果我只知道元素需要是float或double类型,以及在运行时需要1/2/3个通道,会发生什么?

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

1个回答

6

请查看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可怕的类型安全性。


我直接使用CV_MAKETYPE而不是简写。你的解决方案有效。 - Dat Chu
@Dat Chu:当你只有每个元素的类型名称时,你如何确定深度?(我正在尝试在模板方法中计算类型)。 - Renan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接