使用OpenCV在Android上显示图像

时间:2014-01-16 09:31:22

标签: java android opencv

我正在学习开发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   方法)

此代码有什么问题?

3 个答案:

答案 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 docsdemos / tutorials

在OpenCVLoader.initAsync()完成之前你不能使用任何opencv功能(加载opecv所以)

你甚至没有打电话,所以回去阅读文档。