【问题标题】:opencv Mat datatype conversion and arithmeticopencv Mat 数据类型转换和算术
【发布时间】:2011-04-17 14:52:14
【问题描述】:

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

我遇到的问题:

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

  2. 如果一个矩阵是 CV_8U 或 unsigned char 类型,那么我做加法运算...是否有可能导致溢出?还是opencv足够聪明,可以转换数据类型并执行所谓的“饱和算术”?例如

    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++ 类型转换?例如

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

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

【问题讨论】:

  • 顺便说一句...实验表明许多opencv函数会返回CV_8U类型的Mat...

标签: c++ opencv types


【解决方案1】:

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

这种“饱和”语义(不同 来自通常的 C 语言“包装” 语义,其中最低位是 拍摄,在每个图像中实现 处理函数,从简单 cv::add 到 cv::cvtColor, cv::resize, cv::filter2D 等。这不是新的 OpenCV v2.x 的功能,它就在那里 从一开始。在新 版本化这个特殊的模板操作符 引入简化 这个语义的实现 你自己的函数。

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

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

【讨论】:

  • 谢谢你的回答~我会尽量适应的
  • 抱歉,我无法提供更多帮助。我很想听听您是否找到#3 的解决方案:在编写必须适用于多种数据类型的 OpenCV 代码时,它总是很烦人。我相信这是在内部通过switch 声明完成的,所以我的希望并不高......
  • 3 年后,我们处于同一阶段。我认为 OpenCV 的 Mat 会继续存在...
猜你喜欢
  • 1970-01-01
  • 2018-09-04
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多