opencv Mat数据类型转换和算术

时间:2011-04-17 14:52:15

标签: c++ opencv types

我是opencv库的新手,并且自2.x以后仍然对C ++ Mat类感到困惑。

我遇到的问题:

  1. 类的非模板版本Mat是运行时类型,但是没有可以显示Mat对象的符号名称的函数,只有cv::Mat::type(),它返回整数。

  2. 如果矩阵是CV_8U或无符号字符类型,那么我会做加法运算......是否有可能导致溢出?或opencv是否足够智能转换数据类型并执行所谓的“饱和算术”? e.g。

    unsigned char a = 255; unsigned char b = a+a; // == 255

    a + a的操作:

    unsigned char b = (unsigned char) clipTo_0_255((float)a + (float)a));

  3. 如果我想避免微妙的cv::Mat::at<_Tp>,大多数解决方案建议使用class Mat_<_Tp>的派生模板版本。但_Tp必须是C ++原型,我不知道原始类型和CvMat类型系统之间的映射...(也许它很简单......)

  4. opencv数据类型转换是否相当于C / C ++类型转换? e.g。

    float a = 1.5; int b = (int) a; // == 1

    int a = 2; float b = static_cast<int>(a); // == 2.0

1 个答案:

答案 0 :(得分:1)

对于#2和#4,您应该阅读OpenCV page on saturation arithmetic。特别是:

  

这种“饱和”语义(不同   从通常的C语言“包装”   语义,最低位是   拍摄,在每个图像中实现   处理功能,从简单   cv::addcv::cvtColorcv::resize,   cv::filter2D等。这不是新的   OpenCV v2.x的功能,就在那里   从一开始。在新的   版本此特殊模板运算符   介绍是为了简化   在语义中实现这种语义   你自己的职能。

遗憾的是,我对类型系统的问题没有任何出色的解决方案。因为所有OpenCV库函数都使用非模板cv::Mat类,所以我个人已经放弃使用cv::Mat<T>类,直到API的其余部分更新为止。

虽然类型系统相当笨拙,但随着您习惯使用它会变得更加容易。