将本机C 代码转换为Java

Converting Native C++ code to Java

本文关键字:Java 转换 代码 本机      更新时间:2023-10-16

我正在将本机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( at android.view.view.performClick(view.java:6291( at android.view.view $ persilClick.run(view.java:24931( 在Android.os.handler.handlecallback(Handler.java:808( 在Android.os.handler.dispatchMessage(Handler.java:101( at android.os.looper.loop(looper.java:166( at android.app.activitythread.main(activityThread.java:7425( 在java.lang.reflect.method.invoke(本机方法(上 在com.android.internal.os.os.zygote $ methodAndargScaller.run(zygote.java:245( 在com.android.internal.os.os.zygoteinit.main(zygoteinit.java:921(

注意GrayMat包含4种颜色Bgra

问题在您的呼叫中:

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

一件事就在最内向的循环内;对于另一个,当需要4时,您只设置一个值(如错误所说(。

将其移到循环外,然后传递整个数组:

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