在 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 也不使用整数除法。
我的问题是:
  • 为什么?不应该将整数划分为整数。为什么 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/

    10-15 12:48