图像二进制解释:未知图像格式

问题描述 投票:0回答:2

假设我有某种格式的图像(它的二进制表示形式,例如来自OpenCV的cv :: Mat或来自Android的YuvImage,未压缩),并将其数据解释为YUV NV21(好吧,在示例中提供了该图像)由DJI SDK提供)。这是我所拥有的:

Broken frame

据此,我认为原始格式不是NV21。 YUV2? RGB888? RGB32?还有其他东西吗?

人们将如何猜测二进制数据的原始格式?

如果有帮助,帧将从DJI无人机流中获取。

image opencv image-processing rgb dji-sdk
2个回答
0
投票

YUV图像输出使用一个Android库,根据所使用的设备,该库会产生不同的YUV格式。

就我而言,根据我使用的两个设备中的哪个,我需要切换两个颜色通道(NV12到NV21)的字节。

真正帮助我了解使用以下YUV播放器的格式的真正原因是:https://github.com/Tee0125/yuvplayer

在播放器中,您可以主动更改数据的解释方式,只需测试不同的设置,直到找到正确的设置。

尽管我不知道是否需要它,但我将提供用于切换频道的方法。

/**
 * Changes a NV12 yuv Frame to the NV21 format. Basically the two color channels are switched.
 *
 * @param yuvFrameNV12 The YUV Frame in the NV12 format.
 * @param width The width of the frame.
 * @param height The height of the frame.
 * @return The YUV Frame in the NV21 format.
 */
private static byte[] convertNV12toNV21(byte[] yuvFrameNV12, int width, int height) {
    final int length = yuvFrameNV12.length;
    for (int i1 = 0; i1 < length; i1 += 2) {
        if (i1 >= width * height) { //start after the luminance bytes
            byte tmp = yuvFrameNV12[i1];
            yuvFrameNV12[i1] = yuvFrameNV12[i1+1];
            yuvFrameNV12[i1+1] = tmp;
        }
    }
    return yuvFrameNV12;
}

0
投票

最后,我们发现图像处理中存在一些不一致之处。

Android的YuvImage希望您使用NV21进行输入,因此我有一种有效的从I420到NV21的转换方法。当我更改视频源(相同厂商,不同型号)时,我希望它具有相同的格式,但实际上,它是NV12。

重新解释广播 NV12作为I420,然后将其转换为NV21就是这里发生的情况。

© www.soinside.com 2019 - 2024. All rights reserved.