【发布时间】:2021-12-12 15:11:44
【问题描述】:
我在 OpenCV 中的 Matrix 类中遇到了关于将浮点数转换为 uint8_t 的奇怪行为。 似乎带有 Matrix 类的 OpenCV 通过执行 ceil 而不是截断小数来将 float 转换为 uint8_t。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
int main() {
cv::Mat m1(1, 1, CV_8UC1);
cv::Mat m2(1, 1, CV_8UC1);
cv::Mat m3(1, 1, CV_8UC1);
m1.at<uint8_t>(0, 0) = 121;
m2.at<uint8_t>(0, 0) = 105;
m3.at<uint8_t>(0, 0) = 82;
cv::Mat x = m1 * 0.5 + m2 * 0.25 + m3 * 0.25;
printf("%d \n", x.at<uint8_t>(0, 0));
uint8_t r = 121 * 0.5 + 105 * 0.25 + 82 * 0.25;
printf("%d \n\n", r);
return 0;
}
输出:
108
107
您知道为什么会出现这种附加以及如何纠正这种行为吗?
谢谢,
【问题讨论】:
-
“矩阵表达式”根据 OpenCV 语义进行评估,这显然意味着整数矩阵乘以浮点标量,再次得到一个 int 矩阵,而不是浮点矩阵。 -- 乘积将是 (60.5, 26.25, 20.5) 作为浮点数,但它们可能单独四舍五入为整数,即 (61, 26, 21) 和 108。 -- 事实上你可以
at<uint8_t>该矩阵和 not 得到垃圾意味着中间结果和最终结果是 uint8,而不是 float -
感谢克里斯托夫的回答。是的,矩阵保持为 int,预计 int 转换会截断小数,因此 60.5、26.25、20.5 浮点值应该是 (60, 26, 20) 给出 106。谢谢。
标签: c++ opencv floating-point integer