Android OpenCV imread flags - фатальное исключение, imread работает нормально без флагов, вывод пикселей не соответствует MATLAB

0

Я не могу понять, почему мой код не запускается. А именно, я могу только заставить некоторые функции OpenCV работать, и только частично.

Незначительный фон: я переводил код обработки изображений MATLAB на Android, и моя цель - использовать только java-параметры OpenCV и избегать использования собственного кода JNI или c++.

Я установил его и установил библиотеки в свойствах проекта, а также установил менеджер 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, чтобы посмотреть на пиксель (2000, 1000) как на Android OpenCV, так и на MATLAB, однако, тестируя несколько пикселей, я вижу, что значения RGB отключены примерно на 2 между MATLAB и Android. Например, я получу 162 на MATLAB и 160 на Android.

Проблема может быть вызвана различными способами перевода индексов, но я предполагаю, что он вычисляет битдип для 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] + " ");

Есть тогда 2 проблемы, первое затмение не распознает константу библиотеки для IMREAD_ANYDEPTH, которая нечетна, как и этот оператор импорта:

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 для целей проекта.

  • 0
    попробуйте Highgui.IMREAD_ANYDEPTH
  • 0
    Хм, я попробовал это, и с Highgui.IMREAD_ANYDEPTH переменная разрешается, но у меня все тот же сбой, хотя спасибо за идею!
Показать ещё 1 комментарий
Теги:
opencv

1 ответ

0

Нашел ответ на вопрос. Это связано с проблемой индекса за пределами границ! Я не вызывал Highgui.IMREAD_ANYDEPTH, а скорее IMREAD_ANYDEPTH, который не разрешался, поэтому тестовая точка никогда не формировалась, вызывая ошибку ограничения границ массива

Ещё вопросы

Сообщество Overcoder
Наверх
Меню