2014-01-16 125 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

就像我說的,我檢查過。沒有找到解決方案。 –