在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也不会使用整数除法。
我的问题是:
我目前的解决方案是:
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;
}
}
答案 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;
}
}
}