最近我将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));
可能有用,但我不确定。)
提前致谢!
答案 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);