Android OpenCV imread 标志致命异常,imread 在没有标志的情况下工作正常,像素输出与 MATLAB 不匹配

Android OpenCV imread flags fatal exception, imread works fine with no flags, pixel output doesn't match MATLAB

本文关键字:imread 标志 像素 工作 不匹配 MATLAB 情况下 输出 OpenCV 异常 Android      更新时间:2023-10-16

我似乎不明白为什么我的代码不能运行。也就是说,我似乎只能让一些OpenCV函数工作,只是部分。

小背景:我正在翻译一些MATLAB图像处理代码到Android,我的目标是只使用java OpenCV选项,避免任何JNI或c++本地代码。

我已经安装了它并在项目属性中设置了库,还从play商店安装了OpenCV管理器在手机上,甚至将本机二进制文件放在项目的libs文件夹中以防万一,并且我有这个语句导致它部分工作:

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i("Load openCV", "OpenCV loaded successfully");
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

我正在做一些测试,并使用imread在Android OpenCV和MATLAB中查看像素(2000,1000),但是测试几个像素,我看到RGB值在MATLAB和Android之间相差约2。例如,我将在MATLAB上得到162,在Android上得到160。

这个问题可能是由翻译索引的不同方式引起的,但我猜它是计算jpg的位深度,并将每个程序的值转换为0-255值,从MATLAB到Android OpenCV都不同。

这是工作良好的原始代码(尽管可能将我的图像翻译为8位):

Mat A;
A = Highgui.imread(photoPath);
double[] testPoint = A.get(2000, 1000);
data1.setText(testPoint[0] + " " + testPoint[1] + " " + testPoint[2] + " ");

然而,当我在加载Mat a上放置一个标志,以便在原始深度加载时,遵循以下说明:

Mat A;
A = Highgui.imread(photoPath, IMREAD_ANYDEPTH);
double[] testPoint = A.get(2000, 1000);
data1.setText(testPoint[0] + " " + testPoint[1] + " " + testPoint[2] + " ");

然后有两个问题,首先eclipse不识别IMREAD_ANYDEPTH的库常量,这很奇怪,因为有这个import语句:

import org.opencv.highgui.Highgui;

所以我用它的值(2)来填充它,只是为了强迫它为测试工作。同样,我已经安装并关联了库。其次,在将其设置为2之后,我得到如下错误(我的logcat输出只是导致错误的操作),并且活动终止:

07-13 23:34:54.044: W/Adreno-EGL(14982): <qeglDrvAPI_eglCreateContext:2347>: EGL_BAD_CONFIG
07-13 23:34:54.044: E/OpenCV_for_Tegra(14982): Cannot create OpenGL context
07-13 23:34:54.565: D/AndroidRuntime(14982): Shutting down VM
07-13 23:34:54.565: W/dalvikvm(14982): threadid=1: thread exiting with uncaught exception (group=0x41609ba8)
07-13 23:34:54.565: E/AndroidRuntime(14982): FATAL EXCEPTION: main
07-13 23:34:54.565: E/AndroidRuntime(14982): Process: com.garynfox.pathogenanalyzer, PID: 14982
07-13 23:34:54.565: E/AndroidRuntime(14982): java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
07-13 23:34:54.565: E/AndroidRuntime(14982):    at com.garynfox.pathogenanalyzer.OpenCVTest$2.onFileSelected(OpenCVTest.java:109)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at ar.com.daidalos.afiledialog.FileChooserDialog$1.onFileSelected(FileChooserDialog.java:104)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at ar.com.daidalos.afiledialog.FileChooserCore.notifyListeners(FileChooserCore.java:327)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at ar.com.daidalos.afiledialog.FileChooserCore.access$3(FileChooserCore.java:274)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at ar.com.daidalos.afiledialog.FileChooserCore$3.onClick(FileChooserCore.java:218)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at ar.com.daidalos.afiledialog.view.FileItem$1.onClick(FileItem.java:219)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at android.view.View.performClick(View.java:4438)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at android.view.View$PerformClick.run(View.java:18422)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at android.os.Handler.handleCallback(Handler.java:733)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at android.os.Handler.dispatchMessage(Handler.java:95)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at android.os.Looper.loop(Looper.java:136)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at android.app.ActivityThread.main(ActivityThread.java:5017)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at java.lang.reflect.Method.invokeNative(Native Method)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at java.lang.reflect.Method.invoke(Method.java:515)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-13 23:34:54.565: E/AndroidRuntime(14982):    at dalvik.system.NativeStart.main(Native Method)
07-13 23:35:02.614: I/Adreno-EGL(15067): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
07-13 23:35:02.684: D/OpenGLRenderer(15067): Enabling debug mode 0

现在,由于某种原因,它没有标志也能很好地工作。为什么会这样呢?如果需要,我很乐意提供更多信息。同样,我的目标是不惜一切代价避免任何c++/JNI本机代码,因为我真的不知道如何正确使用该工具。我的旗子怎么了?我设置/导入失败了吗?谢谢!我需要确保此代码为项目目的向MATLAB提供相同的输出。

找到了问题的答案。它与索引越界问题有关!我没有给海吉打电话。IMREAD_ANYDEPTH,而不是IMREAD_ANYDEPTH,它没有解决,因此测试点从未形成,导致数组越界错误