Android OpenCV imread 标志致命异常,imread 在没有标志的情况下工作正常,像素输出与 MATLAB 不匹配
Android OpenCV imread flags fatal exception, imread works fine with no flags, pixel output doesn't match MATLAB
我似乎不明白为什么我的代码不能运行。也就是说,我似乎只能让一些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,它没有解决,因此测试点从未形成,导致数组越界错误
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中为每个目标设置编译器/链接器标志
- 错误:"imread"未在此范围内声明
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 在轮班操作后使用携带标志
- 如何找出引入AVX标志的内容
- imread() 仍然返回空垫子,尽管在 openCV 4.0.0 中寻址正确
- I2C 文件描述符上的 I2C 总线可写/可读标志
- C ++是否有C ++ 17 OSX 10.13.6的标志
- 每次使用带有LOCK_EX标志的LOCK_NB时,相同的程序/进程都会获取锁
- CMake 3.5 中的链接器标志位置
- 如何使用 gnu gcc 标志 -mpc32、-mpc64 和 -mpc80?
- 在 CMake 中添加全局编译标志
- -Wlifetime 标志的目的是什么?
- Visual Studio 19-17 库兼容性根据 GL 标志
- 标志 |= f == s[i],这个语句会做什么?
- Visual Studio 中是否有来自代码块的编译器标志的类似物?
- 如何在 clang 的自动会议中检查支持编译标志
- Inference pytorch C++ with alexnet and cv::imread image
- Android OpenCV imread 标志致命异常,imread 在没有标志的情况下工作正常,像素输出与 MATLAB 不匹配