所以,operator/ 和 cv::divide 实际上应该是相同的,只是运算符将返回一个矩阵表达式,其评估被延迟。最后,operator/ 也将调用cv::divide,可以看出 e。 G。对于一个简单的案例here。特别是结果应该相等。
不过,结果可能令人惊讶。使用两个整数矩阵进行除法,结果就像在浮点运算中完成,然后是round to nearest integer 更喜欢偶数(另请参阅nearbyint())。例如,使用两个 6x6 整数矩阵,您将得到
0/0 == 0 1/0 == 0 2/0 == 0 3/0 == 0 4/0 == 0 5/0 == 0
0/1 == 0 1/1 == 1 2/1 == 2 3/1 == 3 4/1 == 4 5/1 == 5
0/2 == 0 1/2 == 0 2/2 == 1 3/2 == 2 4/2 == 2 5/2 == 2
0/3 == 0 1/3 == 0 2/3 == 1 3/3 == 1 4/3 == 1 5/3 == 2
0/4 == 0 1/4 == 0 2/4 == 0 3/4 == 1 4/4 == 1 5/4 == 1
0/5 == 0 1/5 == 0 2/5 == 0 3/5 == 1 4/5 == 1 5/5 == 1
注意(如您在文档中所述),但还要注意(四舍五入)和 而(平局)。
注意: 两个浮点类型矩阵没有定义任何特殊行为,而是在被零除的情况下计算为 -inf、nan 或 inf。当您将两个浮点矩阵相除但请求整数结果时,这甚至成立。在这种情况下,-inf、nan 和 inf 将转换为最小值,这可能是一个错误(或者只是 OpenCV 没有定义)。
整数除法代码div.cpp(用g++ -std=c++11 div.cpp -o div -lopencv_core编译):
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdint>
int main() {
cv::Mat i1(6,6,CV_32S);
cv::Mat i2(6,6,CV_32S);
for (int y = 0; y < i1.rows; ++y) {
for (int x = 0; x < i1.cols; ++x) {
i1.at<int32_t>(y, x) = x;
i2.at<int32_t>(y, x) = y;
}
}
cv::Mat q;
cv::divide(i1, i2, q);
// q = i1 / i2;
for (int y = 0; y < q.rows; ++y) {
for (int x = 0; x < q.cols; ++x)
std::cout << x << "/" << y << " == " << q.at<int32_t>(y, x) << "\t";
std::cout << std::endl;
}
return 0;
}