因此,operator/
和cv::divide
应该实际上是相同的,除了运算符将返回一个矩阵表达式,其评估延迟。最后,还可以看到operator/
将会呼叫cv::divide
。 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
注意(当你从文档说明),还要注意(四舍五入),并而(抢七连)。
代码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;
}
THX!divide()与/运算符有什么不同? –
维基百科:“数字2,147,483,647是计算中32位有符号整数的最大值”。因此,如果您划分两个32F元素,并且目标32S的结果为溢出,则会发生意外行为。但是,对于输入32S矩阵,您是安全的。 您需要重载cv :: Mat的运算符/方法来实现其他行为。 – baci
我不知道如何划分不同于标准/运营商。也许他们转换为float并使用SSE指令,或者他们可能在内部使用/操作符,也许你可以在openCV源代码中找到这些部分;) – Micka