【发布时间】:2010-06-26 04:10:26
【问题描述】:
在 OpenCV 中,当我需要创建一个 cv::Mat 时,我需要按照以下方式做一些事情
cv::Mat new_mat(width, height, CV_32FC3)
如果我只知道我需要元素是浮点数还是双精度 + 在运行时是否需要 1/2/3 个通道,会发生什么?
换句话说,给定元素类型(float)和通道数(int),我该如何构造术语:CV_32FC3?
【问题讨论】:
在 OpenCV 中,当我需要创建一个 cv::Mat 时,我需要按照以下方式做一些事情
cv::Mat new_mat(width, height, CV_32FC3)
如果我只知道我需要元素是浮点数还是双精度 + 在运行时是否需要 1/2/3 个通道,会发生什么?
换句话说,给定元素类型(float)和通道数(int),我该如何构造术语:CV_32FC3?
【问题讨论】:
阅读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 糟糕的类型安全性。
【讨论】: