无法理解,表达式 Vxy 和 Vxy_nocast 的结果
uchar init_m0[] = {10,10,30};
cv::Mat m0(3,1,CV_8UC1,init_m0,sizeof(uchar));
uchar& Vxy = m0.at<uchar>(0);
uchar& Vxy_nocast = m0.at<uchar>(1);
std::cout << m0 << std::endl;
Vxy = cv::saturate_cast<uchar>((Vxy-128)*2 + 128);
Vxy_nocast = (Vxy_nocast-128)*2 + 128;
std::cout << m0 << std::endl;
结果
[ 10;
10;
30]
[ 0;
148;
30]
最佳答案
(10-128)*2 + 128 = -108
。 cv::saturate_cast<uchar>
是对 unsigned char 的饱和转换,而 unsigned char 只能是 >= 0。正常的 uchar 转换(如果您不指定任何内容则隐式发生的情况)将通过重新解释位将负值包装为正值,-108 10010100
是 2 的二进制补码,它与 148 相同(并且它还会环绕更大的值,例如 257 到 1)。相反,饱和转换会将负值转换为 0,在该类型的最小值 0 处饱和(同样,正值将在最大值 255 处饱和)。
有关更多详细信息,请参阅 saturation arithmetic。
关于opencv - OpenCV 中的 saturate_cast 如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45897240/