Opencv Mat乘法常数运算保护溢出吗?
Mat m(12,14,CV_8UC1);
float C=12.01;
//...do something with m
m= m*C;
。乘法的结果能大于255吗?
我也找不到操作符*定义在opencv github repo
由于您的图像类型为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
,它将被转换为正确的类型,并且从float
转换到uchar
的值总是在[0,255]中。
由于转换使用了saturate_cast,因此超过255的值将始终被饱和为255。
您需要使用CV_32FC1
或CV_64FC1
矩阵来获得"正确"的值。