I'm using OpenCV version 3.4.5. I tried to understand the behavior of cv::Mat in OpenCV. I multiple some 8bit matrices and add them up. The result seems inconsistent.
Does OpenCV cast the float point result immediately back to 8bit after each multiplication, or after each addition, or maybe some "Fused Multiply Add" happened here ?
#include <iostream>
#include <opencv2/opencv.hpp>
int main() {
for (int value = 1; value < 10; value++) {
cv::Mat im(1, 1, CV_8U, value);
cv::Mat result[10];
result[0] = im*0.1f;
result[1] = im*0.1f + im*0.1f;
result[2] = im*0.1f + im*0.1f + im*0.1f;
result[3] = im*0.1f + im*0.1f + im*0.1f + im*0.1f;
result[4] = im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f;
result[5] = im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f;
result[6] = im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f;
result[7] = im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f;
result[8] = im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f;
result[9] = im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f;
std::cout << "base value: " << value << std::endl;
for (int i = 0; i < 10; i++) {
std::cout << i + 1 << ": " << int(result[i].at<uint8_t>(0, 0)) << "\t";
}
std::cout << std::endl;
}
return 0;
}
The outputs are:
base value: 1
1: 0 2: 0 3: 0 4: 0 5: 0 6: 0 7: 0 8: 0 9: 0 10: 0
base value: 2
1: 0 2: 0 3: 0 4: 0 5: 0 6: 0 7: 0 8: 0 9: 0 10: 0
base value: 3
1: 0 2: 1 3: 1 4: 1 5: 1 6: 1 7: 1 8: 1 9: 1 10: 1
base value: 4
1: 0 2: 1 3: 1 4: 1 5: 1 6: 1 7: 1 8: 1 9: 1 10: 1
base value: 5
1: 0 2: 1 3: 2 4: 2 5: 2 6: 2 7: 2 8: 2 9: 2 10: 2
base value: 6
1: 1 2: 1 3: 2 4: 3 5: 4 6: 5 7: 6 8: 7 9: 8 10: 9
base value: 7
1: 1 2: 1 3: 2 4: 3 5: 4 6: 5 7: 6 8: 7 9: 8 10: 9
base value: 8
1: 1 2: 2 3: 3 4: 4 5: 5 6: 6 7: 7 8: 8 9: 9 10: 10
base value: 9
1: 1 2: 2 3: 3 4: 4 5: 5 6: 6 7: 7 8: 8 9: 9 10: 10