我正在学习开发Android应用程序,我正在尝试将OpenCV合并到应用程序中。我决定制作一个显示图像的简单应用程序。代码如下:
package com.example.first;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Canvas;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.webkit.WebView.FindListener;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity{
Mat m=Highgui.imread("C:/Users/Administrator/Desktop/circle1.png");
}
在检查logcat时,显示以下错误:
E / AndroidRuntime(1310):致命异常:主
E / AndroidRuntime(1310):java.lang.UnsatisfiedLinkError:Native方法 找不到:org.opencv.highgui.Highgui.imread_1 :( Ljava / lang / String;)
E / AndroidRuntime(1310):at org.opencv.highgui.Highgui.imread_1(原生) 方法)
E / AndroidRuntime(1310):at org.opencv.highgui.Highgui.imread(Highgui.java:359) E / AndroidRuntime(1310):at com.example.run.MainActivity。(MainActivity.java:26)E / AndroidRuntime(1310):at java.lang.Class.newInstanceImpl(Native 方法)
E / AndroidRuntime(1310):at java.lang.Class.newInstance(Class.java:1130) E / AndroidRuntime(1310):at android.app.Instrumentation.newActivity(Instrumentation.java:1061) E / AndroidRuntime(1310):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128) E / AndroidRuntime(1310):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) E / AndroidRuntime(1310):at android.app.ActivityThread.access $ 600(ActivityThread.java:141) E / AndroidRuntime(1310):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1256) E / AndroidRuntime(1310):at android.os.Handler.dispatchMessage(Handler.java:99) E / AndroidRuntime(1310):在android.os.Looper.loop(Looper.java:137) E / AndroidRuntime(1310):at android.app.ActivityThread.main(ActivityThread.java:5103) E / AndroidRuntime(1310):at java.lang.reflect.Method.invokeNative(Native Method) E / AndroidRuntime(1310):at java.lang.reflect.Method.invoke(Method.java:525) E / AndroidRuntime(1310):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:737) E / AndroidRuntime(1310):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)E / AndroidRuntime(1310):at dalvik.system.NativeStart.main(Native 方法)
此代码有什么问题?
答案 0 :(得分:4)
如果您对Android上的opencv相对较新,我强烈建议您从opencv android SDK附带的示例开始,称为图像处理。只有一个java文件ImageManipulationsActivity.java,但它有所有典型的opencv操作的样本,如Canny等。它还向您展示了如何执行opencv的异步加载。如果你可以在你的设备上工作,那么你就处于良好的起点。
请注意,Android上的opencv需要opencv管理器并使用本机库,因此尝试在模拟器上运行可能不会那么成功;我建议在开发时测试你的设备。
正如其他人所说,您需要将图像文件复制到设备上才能阅读。我使用Eclipse DDMS文件资源管理器并将文件放在mnt / sdcard中。然后我使用以下函数加载(它可以用更多的错误检查,但这应该说明这个想法):
public Mat loadImageFromFile(String fileName) {
Mat rgbLoadedImage = null;
File root = Environment.getExternalStorageDirectory();
File file = new File(root, fileName);
// this should be in BGR format according to the
// documentation.
Mat image = Highgui.imread(file.getAbsolutePath());
if (image.width() > 0) {
rgbLoadedImage = new Mat(image.size(), image.type());
Imgproc.cvtColor(image, rgbLoadedImage, Imgproc.COLOR_BGR2RGB);
if (DEBUG)
Log.d(TAG, "loadedImage: " + "chans: " + image.channels()
+ ", (" + image.width() + ", " + image.height() + ")");
image.release();
image = null;
}
return rgbLoadedImage;
}
你会看到它以BGR格式出现,所以我转换为RGB用于我的目的。
让你的Mat然后在Android上显示我认为以前的问题已经涵盖了。
答案 1 :(得分:1)
“C:/Users/Administrator/Desktop/circle1.png”是Windows路径,而不是Android路径
答案 2 :(得分:0)
请在将代码盲目输入您的ide之前,然后用结果唠叨SO,
查看opencv android docs,demos / tutorials
在OpenCVLoader.initAsync()完成之前你不能使用任何opencv功能(加载opecv所以)
你甚至没有打电话,所以回去阅读文档。