【发布时间】: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 已解决。请将其添加为答案,以便我接受。