有没有办法防止opencv矩阵除法中的舍入
Posted
技术标签:
【中文标题】有没有办法防止opencv矩阵除法中的舍入【英文标题】:Is there a way to prevent rounding in opencv matrix divison 【发布时间】:2015-06-14 19:22:01 【问题描述】:我有一个整数矩阵,我想对其进行整数除法。但是 opencv 总是对结果进行四舍五入。 我知道我可以手动划分每个元素,但我想知道是否有更好的方法?
Mat c = (Mat_ <int> (1,3) << 80,71,64 );
cout << c/8 << endl;
// result
//[10, 9, 8]
// desired result
//[10, 8, 8]
【问题讨论】:
您的两个解决方案都有舍入 - 第一个默认为“四舍五入”或“向上舍入”,第二个默认为“向下舍入”或“舍入为零”。当然,我们不能仅从一个示例中判断舍入模式。 我想像用一个整数除以另一个整数一样截断。 截断(-7.7 => -7
和 +7.7 =>+7
)相当于“四舍五入”
我想要的正是整数除法,我认为这相当于将floor
应用于它。 -7.7 => -8
和 +7.7 => 7
【参考方案1】:
类似于@GPPK 的可选方法,您可以通过以下方式破解它:
Mat tmp, dst;
c.convertTo(tmp, CV_64F);
tmp = tmp / 8 - 0.5; // simulate to prevent rounding by -0.5
tmp.convertTo(dst, CV_32S);
cout << dst;
【讨论】:
非常有帮助。我想知道是否比迭代所有元素更快? @sudomakeinstall2 老实说,我对此不太确定。如果 OpenCV 对 Mat 类型转换做了一些优化,会更快。无论如何,您可以定时找出它。 :P 请记住,CV_32F 只有 22 位精度。对于超过 800 万的数字,这种舍入方法无法可靠地工作。 @MSalters 更改为CV_64F
。谢谢。 :P【参考方案2】:
问题在于使用ints
,ints
不能有小数点,所以我不确定你如何期望不进行四舍五入。
您在这里确实有两个选择,如果不使用其中一个选项,我认为您无法做到这一点:
-
你有一个数学上正确的
int
矩阵除法[10, 9, 8]
您可以启动自己的除法函数以获得所需的结果。
选项 2:
伪代码:
Create a double matrix
perform the division to get the output [10.0, 8.875, 8.0]
strip away any numbers after a decimal point [10.0, 8.0, 8.0]
(optional) write these values back to a int matrix
(result) [10, 8, 8]
【讨论】:
正如我在问题中所说,我不想使用for
。
我认为您无法以其他任何方式做到这一点,否则我会发布它。我已经更新了我的问题以上是关于有没有办法防止opencv矩阵除法中的舍入的主要内容,如果未能解决你的问题,请参考以下文章