OpenCV Mat::Mul的参数 最近我把C++代码移植到java。我发现下面的C++代码编译,但是通讯java代码表示它有问题。

OpenCV Mat::Mul的参数 最近我把C++代码移植到java。我发现下面的C++代码编译,但是通讯java代码表示它有问题。,java,c++,opencv,Java,C++,Opencv,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

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
    }
}
根据,mat.mul接受inputArray作为其参数。因此,当第一个C++代码编译时,我感到惊讶。我猜想C++自动地将双线程转换成输入数组兼容格式。 <>你能帮助我理解1为什么C++代码编译,2如何制作一个没有错误的等价java代码?我认为Core.multipleymi2,新的Scalar1/normSum,var1.rowi;可能有用,但我不确定

提前谢谢

试试看

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;
乘法还有其他重载形式。看看他们

编辑:

是的,最后一行在Java中不起作用。由于rowi仅将一个别名返回到位置i处的原始Mat数据,因此应使用稍微修改的代码:

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

错误代码是怎么说的?1 Mull OrcV.C.E.Mat在Matt中不能应用于C++中的双2变量,它能够接受标量输入数组,可以在很多时候被运行,如果需要的话,它在运行时检查,但是它只接受MAT。也许有帮助,因为它也接受标量,并且是相同的操作元素乘法。在C++中,在java中不确定,你可以做Mi2= Mi2* 1 /标准和;或者直接,Mi2=Mi2/nurmSum;谢谢我可以再问一点吗?我试图缩短for循环中的代码,比如:normSum=normvar1.rowi,NORM_L2;Core.multiplyvar1.rowi,新Scalar1/normSum,var1.rowi;它似乎工作,但非常缓慢,相比于C++代码。这是一个合法的代码吗?是否存在任何使其速度变慢的缺陷?声明Mi2局部变量比调用var1.rowi好几次。这是因为javac实际上会创建一个变量来保存对var1.rowi的调用,即使您没有显式声明它们。此外,对象var1中的调用查找rowi将运行多次,而不是只运行一次。因此,第一次编写的代码应该比最后一次更好。我的想法是,更短的代码可能运行得更快,但这并不总是正确的。谢谢你的清楚解释!哦,对不起,还有一个问题。在最后一行,var1.rowi=result;,Android Studio表示“预期变量”错误。在这种情况下,是否禁止直接为var1.rowi赋值?