在 OpenCV 中,如果 cv::Mat (CV_8U)
除以一个数字( int
),结果将四舍五入到最接近的数字,例如:
cv::Mat temp(1, 1, CV_8UC1, cv::Scalar(5));
temp /= 3;
std::cout <<"OpenCV Integer Division:" << temp;
std::cout << "\nNormal Integer Division:" << 5 / 3;
结果是:很明显,即使
cv::Mat
的类型是 CV_8U
,OpenCV 也不使用整数除法。我的问题是:
我目前的解决方案是:
for (size_t r = 0; r < temp.rows; r++){
auto row_ptr = temp.ptr<uchar>(r);
for (size_t c = 0; c < temp.cols; c++){
row_ptr[c] /= 3;
}
}
最佳答案
首先:Division 的重载运算符通过将矩阵的元素转换为 double 来执行操作。它最初使用乘法运算符为:Mat/a =Mat * (1/a)。
其次:有一种非常简单的方法可以通过一个小的 for 循环来做到这一点:
for(int i=0;i<temp.total();i++)
((unsigned char*)temp.data)[i]/=3;
关于c++ - 使用整数除法将 cv::Mat 除以一个数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39101475/