我是opencv库的新手,仍然对2.x以来的c++ Mat类感到困惑。
我面临的问题:
-
类Mat的非模板版本是运行时类型的,但是没有函数可以显示Mat对象的符号名称,只有一个
cv::Mat::type()
,返回整数。 -
如果矩阵是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));
-
如果我想避免微妙的
cv::Mat::at<_Tp>
,大多数解决方案建议使用class Mat_<_Tp>
的派生模板版本。但是_Tp必须是c++基本类型,我不知道基本类型和CvMat类型系统之间的映射…(也许这是直接的…) -
opencv数据类型转换是否等同于C/c++类型转换?例如
float a = 1.5; int b = (int) a; // == 1
int a = 2; float b = static_cast<int>(a); // == 2.0
对于#2和#4,你应该阅读OpenCV页面上的饱和算法。特别是:
这个"饱和"的语义(不同)源自常用的C语言"包装"语义,最低位在哪里在每个图像中实现处理功能,从简单
cv::add
到cv::cvtColor
,cv::resize
,cv::filter2D
等等。这不是什么新鲜事OpenCV v2特性。X,它在那里从一开始。在新的版本这个特殊的模板操作符是为了简化实现此语义你自己的功能。
很遗憾,我没有任何很好的解决方案来解决你的问题。因为所有OpenCV库函数都使用非模板化的cv::Mat
类,所以我个人已经放弃使用cv::Mat<T>
类,直到API的其余部分更新。
虽然类型系统相当笨拙,但随着您逐渐习惯它,使用起来会容易得多。