使用整数除法将cv :: Mat除以数字

时间:2016-08-23 12:39:19

标签: c++ opencv

在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 Integer Division: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;
    }
}

2 个答案:

答案 0 :(得分:1)

首先:Division的重载运算符通过将matrix的元素转换为double来执行操作。它最初使用乘法运算符:Mat / a = Mat *(1 / a)。 其次:通过一个小的for循环来实现这个目的非常简单:

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

答案 1 :(得分:0)

我用来解决它的解决方案是:(取决于@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;
        }
    }
}