2015-02-23 90 views
3

我正在使用Android Camera2 API從相機中獲取幀。我可以通過acquireLatestImage()方法獲得一個讀取Image對象的ImageReader。從android.media.Image到墊

由於我需要處理獲取的幀,我必須將每個圖像對象轉換爲Mat對象。我想這是一個相當普遍的問題,所以我期望找到一個方便的OpenCV方法來做到這一點。但我沒有找到任何。

您是否有關於如何使用Android Camera2從相機框中獲取Mat對象的想法? 謝謝

+0

如果有可能android.media.Image首先轉換爲位圖,然後有[這](http://docs.opencv.org/java/org/ opencv/android/Utils.html),但有可能這樣做會顯着影響處理時間。 – Franz 2015-05-09 14:06:55

+0

另外,看看這個[示例]中的android.media.Image是如何檢索字節數組的(https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java /com/example/android/camera2basic/Camera2BasicFragment.java#L790)。 OpenCV的JavaCameraView的源代碼也顯示瞭如何通過這個[方法]將字節數組轉換爲mat(https://github.com/Itseez/opencv/blob/master/modules/java/generator/src/java/android %2BJavaCameraView.java#L285)。請注意,這是全部的理論,我不確定這是否會奏效。 – Franz 2015-05-09 14:17:55

回答

0

這取決於你爲你的ImageReader類設置了什麼ImageFormat。下面的代碼假定它使用JPEG格式。

Image image = reader.acquireLatestImage(); 

Mat buf = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC1); 

ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
byte[] bytes = new byte[buffer.remaining()]; 
buffer.get(bytes); 
buf.put(0, 0, bytes); 

// Do note that Highgui has been replaced by Imgcodecs for OpenCV 3.0 and above 
Mat mat = Highgui.imdecode(buf, IMREAD_COLOR); 

image.close(); 

請注意,imdecode非常慢。我不完全確定,但我認爲YUV_420_888轉換爲Mat對象會更快,但我還沒有想出如何自己做。我看到這個post嘗試YUV轉換到墊子上,