Android OpenCV imread标志致命异常,imread工作正常没有标志,像素输出不匹配MATLAB

时间:2014-07-14 05:14:29

标签: java android c++ matlab opencv

我似乎无法弄清楚为什么我的代码无法运行。也就是说,我似乎只能使一些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系统。例如,我将在MATLAB上获得162,在Android上获得160.

问题可能是由不同的索引转换方式引起的,但我猜它是计算jpg的bitdepth并将每个程序的值转换为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时,在these instructions之后加载到原始深度:

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提供相同的输出。

1 个答案:

答案 0 :(得分:0)

找到问题的答案。它与索引出界问题有关!我没有调用Highgui.IMREAD_ANYDEPTH而是IMREAD_ANYDEPTH,它没有解决,因此测试点从未形成导致数组输出边界错误