2015-10-20 71 views
1

我試圖在相機預覽幀上應用人臉檢測。我正在使用OpenGL和OpenCV在運行時處理這些相機幀。使用OpenGL的Android相機幀處理

@Override 
    public void onDrawFrame(GL10 unused) { 
     if (VERBOSE) { 
      Log.d(TAG, "onDrawFrame tex=" + mTextureId); 
     } 

     mSurfaceTexture.updateTexImage(); 
     mSurfaceTexture.getTransformMatrix(mSTMatrix); 

     // TODO: need to implement 
     //JniCppManager.processFrame(); 

     drawFrame(mTextureId, mSTMatrix); 
} 

我想實現processFrame()的C++實現。我如何從轉換矩陣中獲取C++中的Mat對象?任何人都可以向我提供一些解決方案的指針。

+0

來自'getTransformMatrix()'的值是一個4x4矩陣,表示爲按列主序排列的16元素線性數組。 OpenCV'Mat'類當然可以表示這一點,但是您是否試圖獲取(通常是平凡的)轉換矩陣或像素數據本身並不清楚。 – fadden

+0

感謝Fadden的迴應。我最終的目標是覆蓋基於圖像識別的靜態圖像。例如在特定的地標上覆蓋鬍鬚。我認爲我需要像素數據。 – muneikh

回答

3

你的管道是目前:

  • 相機(產生幀)
  • 表面紋理(接收幀,轉換爲GLES 「外部」 紋理)
  • [缺少的東西]
  • 陣列的RGB字節傳遞給C++

你需要爲[缺少的東西]做什麼是將像素渲染到屏幕外的pbuffer和rea回到glReadPixels()。您可以使用Java或原生代碼編寫代碼;對於前者,您希望將它們讀入「直接」ByteBuffer中,以便您可以輕鬆地從本機代碼訪問像素。 GLES使用的EGL上下文保存在線程本地存儲中,因此在GLSurfaceView渲染線程上運行的本機代碼將能夠訪問它。

一個例子可以在大片ExtractMpegFramesTest中找到,主要區別在於它從視頻而不是相機抓取幀。

對於API 19+,如果您可以使用YV12或NV21而不是RGB處理幀,則可以將相機送入ImageReader,並且無需複製/轉換即可訪問數據。

+0

謝謝法登,你的回答非常有幫助! – muneikh