Opencv Mat乘以常数运算保护溢出?

时间:2015-07-21 13:40:04

标签: opencv integer-overflow

Opencv Mat乘以恒定运算是否受溢出保护?

Mat m(12,14,CV_8UC1);
float C=12.01;
//...do something with m
m= m*C;

即。乘法的结果可能超过255?

此外,我在opencv github repo

中找不到operator *定义

1 个答案:

答案 0 :(得分:2)

由于您的图片类型为CV_8UC1,因此结果将始终为[0,255]。

实际操作在matop.cpp

MatExpr operator * (const Mat& a, double s)
{
    MatExpr e;
    MatOp_AddEx::makeExpr(e, a, Mat(), s, 0);
    return e;
}

返回MatExpr后,它会转换为正确的类型,从floatuchar的转换会始终显示[0,255]中的值。

由于转换使用saturate_cast,因此超过255的值将始终饱和为255。

您需要使用CV_32FC1CV_64FC1矩阵来获得"正确的"值。