用整数除法将cv::Mat除以一个数字
Dividing cv::Mat by a number using integer division
在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;
}
}
}
相关文章:
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何获取一个数字的前3位
- 我想做一个彼此不同但重复出现的数字
- 如何检查一个c++字符串中有多少相同的字符/数字
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- CIN 仅在输入非数字值时跳过下一个 CIN
- 以C++输出一个数字三角形
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- 一个C++程序,用于在输入位数时输出具有特定位数的 .txt 文件中的所有数字
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 找到 x^n 的所有组合,并检查它们的总和是否等于一个不包括相同数字的数字
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 将数字提高到一个巨大的指数
- 反转一个数字程序不起作用,为什么?
- 使用带有一个参数函数的递归找到数字的平方
- 为什么当我输入一个大数字时,输出会一遍又一遍地重复?
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作