【问题标题】:Converting Native C++ code to Java将本机 C++ 代码转换为 Java
【发布时间】:2018-04-25 18:18:57
【问题描述】:

我正在将本机 C++ 函数转换为 Java,但在某个时候卡住了。

这是对我造成问题的本机代码。

for(int x=0; x < inputMat.cols; x++)
{
    for(int y=0; y < inputMat.rows; y++)
    {
        for(int c=0; c < 4; c++)
        {
            grayMat.at<cv::Vec4b>(y,x)[c] = (grayMat.at<cv::Vec4b>(y,x)[c] == 255 ? 255 : std::min(255,grayMat.at<cv::Vec4b>(y,x)[c]*255/(255-grayMat.at<cv::Vec4b>(y,x)[c]))); 
        }
    }
}

这是我用 Java 转换的上述代码的版本

for(int x = 0; x < inputMat.cols(); x++){
        for(int y = 0; y < inputMat.rows(); y++){

            double data[] = new double[4];
            for(int c = 0; c < 4; c++){

                data[c] = grayMat.get(y,x)[c] == 255 ? 255 Math.min(255,grayMat.get(y,x)[c]*255/(255-grayMat.get(y,x)[c]));
                grayMat.put(y,x,data[c]);

            }
        }
    }

我收到以下错误:

进程:covariance.com.imagefilter,PID:11660 java.lang.UnsupportedOperationException:提供的数据元素编号 (1) 应该是 Mat 通道数 (4) 的倍数 在 org.opencv.core.Mat.put(Mat.java:954) 在 covariance.com.imagefilter.MainActivity.cartoonMatConversion(MainActivity.java:358) 在 covariance.com.imagefilter.MainActivity.access 100 美元(MainActivity.java:47) 在 covariance.com.imagefilter.MainActivity$1.onClick(MainActivity.java:91) 在 android.view.View.performClick(View.java:6291) 在 android.view.View$PerformClick.run(View.java:24931) 在 android.os.Handler.handleCallback(Handler.java:808) 在 android.os.Handler.dispatchMessage(Handler.java:101) 在 android.os.Looper.loop(Looper.java:166) 在 android.app.ActivityThread.main(ActivityThread.java:7425) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

注意 grayMat 包含 4 种颜色 BGRA

【问题讨论】:

  • 您的 C++ 代码使用 cv::Vect4b 表示 4 字节元素的向量。我假设 B、G、R 和 A 通道的 BGRA 格式分别为 1 个字节。在您的 Java 代码中,您使用的是double[]。请改用byte[],然后在整个byte[] 数组上调用put(int row, int col, byte[] data)。
  • 将 put 移到最内层循环之外,并使用grayMat.put(y,x,data)。
  • 谢谢@AndyTurner 已解决。请将其添加为答案,以便我接受。

标签: java android c++


【解决方案1】:

问题出在您的电话中:

grayMat.put(y,x,data[c]);

一方面,它在最里面的循环中;另一方面,当需要 4 时,您只需设置一个值(如错误所示)。

将其移出循环,并传递整个数组:

for(int c = 0; c < 4; c++){
  data[c] = ...
}
grayMat.put(y,x,data);

【讨论】:

    猜你喜欢
    • 2016-04-14
    • 2014-05-27
    • 2015-09-27
    • 2014-09-16
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2011-04-24
    • 2013-07-12
    相关资源
    最近更新 更多