如何将Otaliastudios Frame对象转换为OpenCV Mat对象?

时间:2019-04-22 20:04:51

标签: android opencv

我正在使用otaliastudios库中的com.otaliastudios.cameraview.CameraView组件。我需要将某些框架转换为Mat对象,以使用OpenCV处理。如何将Otaliastudios Frame对象转换为OpenCV Mat对象?

编辑:我正在使用的框架类位于:github.com/natario1/CameraView/blob/master/cameraview/src/main/java/com/otaliastudios/cameraview/Frame.java

我怎么知道这是哪种图像格式?有区别吗?

1 个答案:

答案 0 :(得分:2)

您需要了解手机摄像头框架的来源格式。

Frame对象包含一个byte []数据字段。此字段可能与相机位于同一ImageFormat中。两种最常见的格式是NV21和YUV_420_888。

YUV格式由一个亮度分量Y和另一个称为色度(U-V)的分量组成。

通常,这两种成分之间的关​​系(以及实际位/字节大小)是通过减少色度成分的方法来定义的,因为人眼对亮度的变化比对颜色的变化更敏感(请参阅Chroma Subsampling)。减少量由一组数字表示,例如4:2:0。

在这种情况下,与色度有关的部分是亮度的一半。 因此,一帧的字节大小可能具有等于宽度X高度字节的亮度的一部分和等于宽度X(高度/ 2)字节的色度的一部分。这意味着字节大小在很大程度上取决于您要获取的图像格式,因此您必须修改垫子大小并根据此选择CvType。

您必须分配一个与框架大小相同的垫子并将数据放入其中(来自this answer):

mYuv = new Mat(getFrameHeight() + getFrameHeight() / 2, 
    getFrameWidth(), CvType.CV_8UC1);

....

mYuv.put(0, 0, data);

然后您有了Mat。如果您还需要转换为RGB格式,请检查此page的底部。

希望这会对您有所帮助。