2012-03-15 144 views
9

我有一個應用程序,它可以進行相機預覽,對每一幀執行一些基本的圖像處理功能(例如邊緣檢測,顏色變化,圖像扭曲等),並將修改後的幀顯示在屏幕上「即時的」。類似於Android Market中的「Paper Camera」應用程序。Android:實時圖像處理

我的方法的總結:

1:創建一個的FrameLayout兩個重疊的次數:

甲SurfaceView傳遞給Camera.setPreviewDisplay()。 (傳遞null會阻止在某些設備上啓動攝像頭預覽 - 在Android 4.0之前,opencv會使用它來執行此操作)。

一個名爲「LiveView」的類,它擴展了View並實現了Camera.PreviewCallBack。該視圖從相機接收幀,並在修改後顯示幀(例如邊緣檢測)。該視圖位於SurfaceView的頂部。

2:我請Camera.setPreviewCallbackWithBuffer(),使得幀被髮送到我的實時查看

3:)的實時查看的在onPreviewFrame(我走捕獲的幀(字節[])從YUV轉換爲RGB,並執行圖像處理功能,並調用postInvalidate()(的YUV2RGB轉換和圖像處理是在本機代碼執行)

4:在實時查看的的OnDraw()方法,創建一個從修改的RGB幀(byte [])中獲取位圖,並將該位圖繪製到畫布。

此作品(5fps的和在各種設備之間10fps的),但我想聽聽別人怎麼接觸過這個問題,如何可以改善。特別是:

  • 我會通過擴展GLSurfaceView而不是View來創建LiveView類來獲得任何性能嗎?
  • 這聽起來非常低效,因爲每個框架都要更新兩個曲面。有其他選擇嗎?
  • 要更有效地做到這一點,我應該在本機級別訪問攝像機嗎? - 我相信OpenCV採用這種方法?

非常感謝

回答

4

我也做了這樣的事情。我所做的是擴展相機視圖。我不認爲相機視圖每幀更新,但檢索。只有您更改的視圖才需要更新。 OpenCv確實比本地相機做得更好。進口org.opencv.highgui.VideoCapture後,您可以使用直接訪問攝像機:

VideoCapture camera; 
camera.retrieve(mGrayMat, Highgui.CV_CAP_ANDROID_GREY_FRAME); 

到mGrayMat轉換爲mRgbaMat:(org.opencv.imgproc.Imgproc)

Imgproc.cvtColor(mGrayMat, mRgbaMat, Imgproc.COLOR_GRAY2BGRA, 4);