【发布时间】:2017-11-27 06:54:12
【问题描述】:
最近我正在将 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) Mat 中的 mul (org.opencv.core.Mat) 不能应用于 (double) (2) 预期变量
-
在 c++ 中它能够接受一个标量(inputArray 可以转换成很多东西,如果它是需要的类型,它会在运行时检查),但是 in java 它只接受 Mat。也许function multiply 有帮助,因为它也接受一个标量,并且它是相同的操作(元素明智的乘法)。同样在 c++ 中(在 java 中不确定)你可以做 Mi2 = Mi2 * (1/normSum);或者直接,Mi2 = Mi2 / nurmSum;