【问题标题】:How can I convert Otaliastudios Frame object into OpenCV Mat object?如何将 Otaliastudios Frame 对象转换为 OpenCV Mat 对象?
【发布时间】:2019-09-12 00:02:55
【问题描述】:

我正在使用来自 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

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

【问题讨论】:

    标签: android opencv


    【解决方案1】:

    你需要知道你的手机摄像头框架的源格式。

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

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

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

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

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

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

    然后你就有了你的垫子。如果您还需要转换为 RGB 格式,请查看此page 的底部。

    希望这会对你有所帮助。

    【讨论】:

    • 我看到了这个答案,但“getFrameHeight() + getFrameHeight() / 2”似乎有点可疑。你能解释一下这背后的原因吗?
    • 我在帖子中添加了更详细的解释。
    猜你喜欢
    • 2017-07-15
    • 2015-01-21
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2017-06-18
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多