2010-07-16 49 views
0

因此,我正在使用opencv中的类Mat来编写我正在编写的程序。 Mat看起来是这样的:需要跟踪opencv Mats的类型

class Mat { 
    public: 
     Mat(int width, int height, int type); 
     template <typename T> T getElt(int x, int y); 
     int depth(); 
     ... 
} 

在构造函数中的类型指定在Mat元素是否float S,int S,等,以及在图像中的信道数。​​返回用于存储图像元素的数据类型。

不幸的是,我必须在我的代码中调用getElt()。每当我这样做,我使用switch语句来检查Mat的深度,所以我可以用适当的模板参数调用getElt()。这样做是相当冗长的,所以我想知道是否有更好的方法来做到这一点。我可以为Mat创建一个容器,并使用模板魔法创建一个返回类型而不是值的方法吗?或者我可以使用宏来使事情更有效和合乎逻辑?

我宁可没有子类Mat,因为除了getElt()之外还有几种方法,对此我有同样的问题。

编辑:使描述更准确。

+0

如果用“错误的”模板参数调用它,会发生什么?你会得到垃圾还是结果被转换为请求的类型?如果后者,你可能总是使用双重类型? – zvrba 2010-07-16 15:12:00

+0

这是行不通的:文档说类型必须匹配实际的矩阵类型。 – amc 2010-07-16 15:17:31

回答

0

IIRC在OpenCV中MAT的“类型”对应于图像类型(即信道数)不是数据类型float/INT /炭等

如果要一个模板图像类,可以透明地与工作char/int/bool/double等 - 看看CImg

+0

感谢您的建议,但我需要使用opencv提供的其他功能,这将很难写出自己。 – amc 2010-07-16 15:25:38

+0

我这么认为!虽然CImg确实有很多功能 - 如果您需要模板图像类型,它是最好的图像库。 – 2010-07-16 15:37:54

1

您可能正在寻找Mat_<T>来代替。黑色&白色图像确实与灰度图像不一样,并且都不等于彩色图像。这些应该在编译时分开。