接下來開始使用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
你好,我按照你的方式成功建立並加入OpenCV的環境以及函示庫,非常感謝您。
ReplyDelete但是後面程式的部分,我沒有load圖當然後面執行部分當然也沒有Write,這邊想請問一下,不知道哪裡有問題,謝謝您
沒有load圖, 是指圖沒有讀進來? 第5步驟, 有把圖放進去嗎?
ReplyDelete沒有write, 這會跟手機上的作業系統設計有關,
就是/mnt/sdcard/部分, 可能不是這個目錄.
你好,我的問題已經解決,我Eclipse重新啟動就OK了
ReplyDelete至於為什麼重開會好我也不太清楚,哈哈。
非常謝謝你,你的網誌很受用。感恩。
你好, 我遇到了error
ReplyDelete06-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)
弄了好久 不知道怎么解决。。可以帮帮我吗?
有安裝 OpenCV 成功?
Deletehttp://ibuzzlog.blogspot.tw/2012/07/androidopencv.html
這個error 是run這篇文章的code發生的嗎?
嗯, 对的 这个error 是run这篇的code 时候发生的。
Delete有安装opencv 成功吧 我觉得 可以直接调用opencv的函数
可能需知道在哪一行出現問題..
Delete在Mat footMat = new Mat(); 这里出的问题
Delete现在解决了。。用2.4.5 的opencv 不可以 我换了2.4.0的版本就可以了
但是2.4.5的还是不明白为什么会出bug
您好
ReplyDelete我使用模擬器執行時
程式一直自動停止
請問是發生甚麼事嗎?
我opencv是使用2.4.6版
建議你先trace看看是哪行code出問題.
Delete請問為什麼無法在模擬器上執行?
ReplyDelete我用API 19
openCV2.4.0
[2014-07-28 10:15:43 - MyFirstAndroidOpenCV] Installation error: INSTALL_FAILED_OLDER_SDK
Delete[2014-07-28 10:15:43 - MyFirstAndroidOpenCV] Please check logcat output for more details.
[2014-07-28 10:15:43 - MyFirstAndroidOpenCV] Launch canceled!
可能是 AndroidManifest.xml 設定問題, 設定如下.
Delete現在是這個問題解不了
Delete[2014-08-10 23:47:41 - MyFirstAndroidOpenCV] Could not find MyFirstAndroidOpenCV.apk!
發現一個問題了 我的專案裡並沒有openCV這個libs
Delete他是在我的專案之外變獨立的專案
可是我明明是照著做的啊
參考此篇, 將opencv 加入專案
Deletehttp://ibuzzlog.blogspot.tw/2012/07/androidopencv.html
我用模擬器跑,他一直說我的APP已經停止,也沒有產生/mnt/sdcard/canny.png這個路徑和檔案,請問是怎麼回事?
ReplyDelete我重開一個專案把版本設定成API17(跟我手機一樣)
ReplyDelete現在能跑了 但是圖還是沒出來
結果是出現hello world
是否只能選用API8呢?還是必須要做出什麼android元件?
但我的eclipse選擇API8
只會做出空專案 不知道從何下手
應該不會出現hello world, 可能執行到其他專案
Delete