OpenCV矩阵元素除法给出全零结果

Posted

技术标签:

【中文标题】OpenCV矩阵元素除法给出全零结果【英文标题】:OpenCV matrix element-wise division gives all-zero result 【发布时间】:2021-08-24 03:32:32 【问题描述】:

我在 ios C++ 代码上使用 cocoapod 的 OpenCV。运行我的应用程序时,我发现它运行异常。最后,经过深挖,可以给出如下可重现的样本:

    
        Mat a = (Mat_<uchar>(10, 20, 30, 40, 50, 60, 70, 80)).reshape(1, 1);
        Mat b = (Mat_<uchar>(4, 5, 6, 7, 8, 9, 10, 11)).reshape(1, 1);
        Mat c;
        divide(a, b, c);
        std::cout << "hello naive " << "a=" << a << endl << "b=" << b << endl << "a/b=" << (a / b) << "c=" << c << endl;
    
    
        Mat a = (Mat_<uchar>(10, 20, 30, 40, 50, 60, 70)).reshape(1, 1);
        Mat b = (Mat_<uchar>(4, 5, 6, 7, 8, 9, 10)).reshape(1, 1);
        Mat c;
        divide(a, b, c);
        std::cout << "hello naive " << "a=" << a << endl << "b=" << b << endl << "a/b=" << (a / b) << "c=" << c << endl;
    

结果:

im_sta[a]: size=1 x 8, type=0, empty=0, min=10.000000, max=80.000000, miu=[45], sigma=[22.9]
im_sta[b]: size=1 x 8, type=0, empty=0, min=4.000000, max=11.000000, miu=[7.5], sigma=[2.29]
im_sta[a / b]: size=1 x 8, type=0, empty=0, min=0.000000, max=0.000000, miu=[0], sigma=[0]
hello naive a=[ 10,  20,  30,  40,  50,  60,  70,  80]
b=[  4,   5,   6,   7,   8,   9,  10,  11]
a/b=[  0,   0,   0,   0,   0,   0,   0,   0]c=[  0,   0,   0,   0,   0,   0,   0,   0]
im_sta[a]: size=1 x 7, type=0, empty=0, min=10.000000, max=70.000000, miu=[40], sigma=[20]
im_sta[b]: size=1 x 7, type=0, empty=0, min=4.000000, max=10.000000, miu=[7], sigma=[2]
im_sta[a / b]: size=1 x 7, type=0, empty=0, min=2.000000, max=7.000000, miu=[5.29], sigma=[1.67]
hello naive a=[ 10,  20,  30,  40,  50,  60,  70]
b=[  4,   5,   6,   7,   8,   9,  10]
a/b=[  2,   4,   5,   6,   6,   7,   7]c=[  2,   4,   5,   6,   6,   7,   7]

(其中 im_sta 是我打印的一些额外统计信息以获取更多详细信息,您也可以忽略它)。

如您所见,在某些情况下(似乎当 >=8 个元素时),该除法会导致全零!

我该如何解决?谢谢!

【问题讨论】:

【参考方案1】:

我稍后会找到答案。因此,我将其作为自我 QA 发布在这里,以帮助与我有同样问题的人。

解决方案:将 OpenCV 从 4.1 升级到 4.3!那么就OK了!

实际上,如下图所示,OpenCV >=4.2.0 仅在 3 个月前作为 cocoapod 提供(即使现在它已经是 4.5.0)......所以这是一个全新的修复,如果你不想自己从源代码编译opencv...(当我开始我的项目时(当然是3个月前之前)只有4.1.0)

【讨论】:

以上是关于OpenCV矩阵元素除法给出全零结果的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法防止opencv矩阵除法中的舍入

在opencv中划分两个矩阵

标量的opencv矩阵除法产生非常大/小的数字

OpenCV逐元素矩阵乘法

使用openCV copyTo函数时用255初始化矩阵?

OpenCV的基本矩阵操作与示例