2012/07/17

使用Android-OpenCV

這篇文章中提到如建立Android-OpenCV環境.
接下來開始使用Android-OpenCV

1.開啟Eclipse進入Workspace "android-opencv240".
2.進入我們的第一個專案, 開啟MyFirstAndroidOpenCV.java檔案.

















3.使用OpenCV的canny()做為範例.
4.先準備原始圖











5.將此檔案放入專案目錄中的3個目錄
   \android-opencv240\MyFirstAndroidOpenCV\res\drawable-hdpi
   \android-opencv240\MyFirstAndroidOpenCV\res\drawable-ldpi
   \android-opencv240\MyFirstAndroidOpenCV\res\drawable-mdpi
  之所以會有3個目錄, 是因為Android會根據手機的螢幕密度(density)來取得圖片,
  如果不在意的話, 3個全放就萬無一失, 想再深入了解可參考此連結.

6.這篇文章主要是簡單介紹如何使用Android-OpenCV, 所以就不處理顯示的部份,
  整個程式流程就是讀檔->Canny()處理->寫檔.

7.遇到Java不認識的類別時, 就手動import.




























8.程式碼
package my.project.MyFirstAndroidOpenCV;

import java.io.FileOutputStream;
import java.io.InputStream;

import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;

public class MyFirstAndroidOpenCV extends Activity 
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // read image from resource
        InputStream is = this.getResources().openRawResource(R.drawable.foot);
        Bitmap footbm = BitmapFactory.decodeStream(is);
        
        Mat footMat = new Mat();
        //convert bitmap to opencv Mat 
        Utils.bitmapToMat(footbm, footMat);
        
        //Convert to Gray image
        Mat footGrayMat = new Mat();
        Imgproc.cvtColor(footMat, footGrayMat, Imgproc.COLOR_BGR2GRAY, 1);
        
        //Do canny
        Mat outCannyMat = new Mat();
        Imgproc.Canny(footGrayMat, outCannyMat, 80, 100, 3, false);
 
        //output to file
        OutputGrayMatToFile(outCannyMat, "Canny");
    }
    
private void OutputGrayMatToFile(Mat mGaryMat, String Filename)
{
    Mat mRgba = new Mat();
    Imgproc.cvtColor(mGaryMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);
    Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(mRgba, bmp);
  
    try 
    {
       FileOutputStream out = new FileOutputStream("/mnt/sdcard/"+Filename+".png");
        bmp.compress(Bitmap.CompressFormat.PNG, 90, out);  
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}
    
}

9. 因為有寫檔案到sdcard, 所以需要將此權限開啟, 編輯AndroidManifest.xml

    
    

    
        
            
                
                
            
        

    

10.產生的檔案會在/mnt/sdcard/canny.png

19 comments:

  1. 你好,我按照你的方式成功建立並加入OpenCV的環境以及函示庫,非常感謝您。

    但是後面程式的部分,我沒有load圖當然後面執行部分當然也沒有Write,這邊想請問一下,不知道哪裡有問題,謝謝您

    ReplyDelete
  2. 沒有load圖, 是指圖沒有讀進來? 第5步驟, 有把圖放進去嗎?
    沒有write, 這會跟手機上的作業系統設計有關,
    就是/mnt/sdcard/部分, 可能不是這個目錄.

    ReplyDelete
  3. 你好,我的問題已經解決,我Eclipse重新啟動就OK了
    至於為什麼重開會好我也不太清楚,哈哈。
    非常謝謝你,你的網誌很受用。感恩。

    ReplyDelete
  4. 你好, 我遇到了error
    06-20 13:15:44.491: E/System(851): Uncaught exception thrown by finalizer
    06-20 13:15:44.491: E/System(851): java.lang.UnsatisfiedLinkError: Native method not found: org.opencv.core.Mat.n_delete:(J)V
    06-20 13:15:44.491: E/System(851): at org.opencv.core.Mat.n_delete(Native Method)
    06-20 13:15:44.491: E/System(851): at org.opencv.core.Mat.finalize(Mat.java:2457)
    06-20 13:15:44.491: E/System(851): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187)
    06-20 13:15:44.491: E/System(851): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170)
    06-20 13:15:44.491: E/System(851): at java.lang.Thread.run(Thread.java:856)


    弄了好久 不知道怎么解决。。可以帮帮我吗?

    ReplyDelete
    Replies
    1. 有安裝 OpenCV 成功?
      http://ibuzzlog.blogspot.tw/2012/07/androidopencv.html

      這個error 是run這篇文章的code發生的嗎?

      Delete
    2. 嗯, 对的 这个error 是run这篇的code 时候发生的。
      有安装opencv 成功吧 我觉得 可以直接调用opencv的函数

      Delete
    3. 可能需知道在哪一行出現問題..

      Delete
    4. 在Mat footMat = new Mat(); 这里出的问题
      现在解决了。。用2.4.5 的opencv 不可以 我换了2.4.0的版本就可以了
      但是2.4.5的还是不明白为什么会出bug

      Delete
  5. 您好
    我使用模擬器執行時
    程式一直自動停止
    請問是發生甚麼事嗎?
    我opencv是使用2.4.6版

    ReplyDelete
    Replies
    1. 建議你先trace看看是哪行code出問題.

      Delete
  6. 請問為什麼無法在模擬器上執行?
    我用API 19
    openCV2.4.0

    ReplyDelete
    Replies
    1. [2014-07-28 10:15:43 - MyFirstAndroidOpenCV] Installation error: INSTALL_FAILED_OLDER_SDK
      [2014-07-28 10:15:43 - MyFirstAndroidOpenCV] Please check logcat output for more details.
      [2014-07-28 10:15:43 - MyFirstAndroidOpenCV] Launch canceled!

      Delete
    2. 可能是 AndroidManifest.xml 設定問題, 設定如下.

      Delete
    3. 現在是這個問題解不了
      [2014-08-10 23:47:41 - MyFirstAndroidOpenCV] Could not find MyFirstAndroidOpenCV.apk!

      Delete
    4. 發現一個問題了 我的專案裡並沒有openCV這個libs
      他是在我的專案之外變獨立的專案
      可是我明明是照著做的啊

      Delete
    5. 參考此篇, 將opencv 加入專案
      http://ibuzzlog.blogspot.tw/2012/07/androidopencv.html

      Delete
  7. 我用模擬器跑,他一直說我的APP已經停止,也沒有產生/mnt/sdcard/canny.png這個路徑和檔案,請問是怎麼回事?

    ReplyDelete
  8. 我重開一個專案把版本設定成API17(跟我手機一樣)
    現在能跑了 但是圖還是沒出來
    結果是出現hello world
    是否只能選用API8呢?還是必須要做出什麼android元件?
    但我的eclipse選擇API8
    只會做出空專案 不知道從何下手

    ReplyDelete
    Replies
    1. 應該不會出現hello world, 可能執行到其他專案

      Delete