OpenCV Mat :: Mul的参数

时间:2017-11-27 06:54:13

标签: java c++ opencv

最近我将C ++代码移植到Java。我发现以下C ++代码编译,但相应的Java代码说它有问题。

  • C ++代码(编译)

    void NormEveryRow(Mat &var1) {
        double normSum;
        int rowNum = var1.rows;
        for(size_t i=0; i<rowNum; ++i) {
            Mat Mi2 = var1.row(i);
            normSum = norm(Mi2, NORM_L2);
            Mi2 = Mi2.mul(1/normSum);
            var1.row(i) = Mi2;
        }
    }
    
  • Java代码(错误)

    protected static void normEveryRow(Mat var1) {
        double normSum;
        int rowNum = var1.rows();
        for(int i=0; i<rowNum; ++i) {
            Mat Mi2 = var1.row(i);
            normSum = norm(Mi2, NORM_L2);
            Mi2 = Mi2.mul(1/normSum); // it expects Mat as a parameter
            var1.row(i) = Mi2; // 'variable expected' error
        }
    }
    

根据OpenCV documentation (link here)mat.mul()接受inputArray作为参数。所以编译第一个C ++代码时我感到很惊讶。我猜C ++会自动以某种方式将double转换为inputArray - 兼容格式。

您是否可以帮助我理解(1)C ++代码编译的原因,以及(2)如何制作无错误的等效Java代码? (我认为Core.multiply(Mi2, new Scalar(1/normSum), var1.row(i));可能有用,但我不确定。)

提前致谢!

1 个答案:

答案 0 :(得分:1)

尝试

Mat Mi2 = var1.row(i);
Mat result = new Mat();
normSum = norm(Mi2, NORM_L2);
//advice: remember to avoid or not if normSum == 0.0
Scalar scalar = new Scalar(1.0/normSum);
Core.multiply(Mi2, scalar, result);
var1.row(i) = result;

还有其他重载形式的乘法。见他们here

编辑:

是的,最后一行在Java中不起作用。由于行(i)只返回位置i处原始Mat数据的别名,因此您应该使用稍微修改过的代码:

Mat Mi2 = var1.row(i);
normSum = norm(Mi2, NORM_L2);
Scalar scalar = new Scalar(1.0/normSum);
Core.multiply(Mi2, scalar, Mi2);