2014-01-16 97 views
0

我正在学习开发android应用程序,我正试图将OpenCV合并到应用程序中。我决定制作一个简单的应用程序来显示图像。下面的代码给出:使用OpenCV在Android上显示图像

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): FATAL EXCEPTION: main

E/AndroidRuntime(1310): java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.highgui.Highgui.imread_1:(Ljava/lang/String;)

E/AndroidRuntime(1310): at org.opencv.highgui.Highgui.imread_1(Native Method)

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 Method)

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): at 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 Method)

什么是错的代码?

+0

你是否能够让世界各地的应用程序显示图像? (说,stackoverflow徽标?) – 18446744073709551615

+0

@ 18446744073709551615在activity_main.xml文件中,当我在图形布局中查看它时,我可以看到图像,但是当我在模拟器上运行它时,它不显示图像。 –

+0

如果您无法编写显示图像的应用程序,则这是与opencv无关的另一个问题。 (如果遇到别人遇到的问题,欢迎在Google上搜索示例或询问。)一旦设法显示图像,您必须将Mat转换为Android可以自行理解的内容(例如,制作一个位图可绘制,或者将Mat保存为png)并显示它。 – 18446744073709551615

回答

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,我的目的。

让你的垫子然后在Android上显示我认为已经包含在以前的问题。

+0

很好的答案,但只是为了记录,android不需要OpenCV管理器。你可以在你的apk中包含你的设备的所有opencv本地库,然后告诉你的程序使用initDebug()来查看。但我已经读过,使用带有initAsync()的OpenCV管理器是首选方式。 – medloh

1

“C:/Users/Administrator/Desktop/circle1.png” 是Windows路径,而不是一个Android路径

+0

那么我应该做的编辑是什么?将图像复制到res文件夹中,然后尝试给它的路径?试过了,它不工作。 OMG! –

+1

预计您将使用'adb push'并将文件首先提交给(虚拟或真实)设备。当你设法做到这一点时,你会知道路径。 – 18446744073709551615

0

请,盲目输入代码到IDE中,然后对结果SO唠叨,

看看OpenCV的android docsdemos/tutorials

你不能使用任何OpenCV的功能,OpenCVLoader.initAsync()之前完成(加载opecv这样的)

你甚至没有调用它,所以回去阅读文档。

+0

就是这样。我做了,没有找到任何可能的帮助。冷静下来,并帮助配偶,如果你不能,那么不要评论/回答和浪费时间。什么也没有。 –

+0

就像我说的,我检查过。没有找到解决方案。 –