用整数除法将cv::Mat除以一个数字

Dividing cv::Mat by a number using integer division

本文关键字:数字 一个 除法 整数 cv Mat      更新时间:2023-10-16

在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;

结果是:

OpenCV整数除法:2

正整数除法:1

很明显,即使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;
    }
}

首先:除法的重载操作符将矩阵中的元素转换为双精度数。它最初使用乘法运算符为:Mat/a =Mat * (1/a)。其次:有一个非常简单的方法可以做到这一点,通过一个小的for循环:

   for(int i=0;i<temp.total();i++)
        ((unsigned char*)temp.data)[i]/=3;

我用来解决它的解决方案是:(取决于@Afshine的答案和@Miki的评论):

if (frame.isContinuous()){
    for(int i = 0; i < frame.total(); i++){
       frame.data[i]/=3;
    }
}
else{
    for (size_t r = 0; r < frame.rows; r++){
        auto row_ptr = frame.ptr<uchar>(r);
        for (size_t c = 0; c < 3 * frame.cols; c++){
            row_ptr[c] /= 3;
        }
    }
}
相关文章: