从android.media.Image到Mat

时间:2015-02-23 14:10:43

标签: java android opencv

我正在使用Android Camera2 API从相机中获取帧。我可以得到一个ImageReader,它使用acquireLatestImage()方法读取Image对象。

由于我需要处理获取的帧,我必须将每个Image对象转换为Mat对象。我想这是一个很常见的问题,所以我希望找到一个方便的OpenCV方法来做到这一点。但是我找不到任何东西。

您是否了解如何使用Android Camera2从相机框架获取Mat对象? 感谢

1 个答案:

答案 0 :(得分:1)

这取决于您为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转换为Mat,