Opencv Mat乘以恒定运算是否受溢出保护?
Mat m(12,14,CV_8UC1);
float C=12.01;
//...do something with m
m= m*C;
即。乘法的结果可能超过255?
此外,我在opencv github repo
中找不到operator *定义答案 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
后,它会转换为正确的类型,从float
到uchar
的转换会始终显示[0,255]中的值。
由于转换使用saturate_cast,因此超过255的值将始终饱和为255。
您需要使用CV_32FC1
或CV_64FC1
矩阵来获得"正确的"值。