图像二进制解释:未知图像格式
Image binary interpretation: unknown image format
假设我有一张某种格式的图像(它的二进制表示,例如,来自 OpenCV 的 cv::Mat 或来自 Android 的 YuvImage,未压缩),并将其数据解释为 YUV NV21 (好吧,这是 DJI SDK 提供的示例,几乎就是这样)。这是我得到的:
据此,我假设原始格式不是 NV21。 YUV2? RGB888? RGB32?其他一些东西?
如何猜测二进制数据的原始格式是什么?
如果有帮助,帧取自 DJI 无人机流。
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;
}
嗯,最后,我们发现了图像处理中的一些不一致之处。
Android 的 YuvImage 希望你用 NV21 来喂它,所以我有一个从 I420 到 NV21 的有效转换方法。当我更改视频源(同一供应商,不同型号)时,我希望它具有相同的格式,但实际上是 NV12。
Reinterpret-casting NV12 as I420 然后将其转换为 NV21 就是这里发生的事情。
假设我有一张某种格式的图像(它的二进制表示,例如,来自 OpenCV 的 cv::Mat 或来自 Android 的 YuvImage,未压缩),并将其数据解释为 YUV NV21 (好吧,这是 DJI SDK 提供的示例,几乎就是这样)。这是我得到的:
据此,我假设原始格式不是 NV21。 YUV2? RGB888? RGB32?其他一些东西?
如何猜测二进制数据的原始格式是什么?
如果有帮助,帧取自 DJI 无人机流。
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;
}
嗯,最后,我们发现了图像处理中的一些不一致之处。
Android 的 YuvImage 希望你用 NV21 来喂它,所以我有一个从 I420 到 NV21 的有效转换方法。当我更改视频源(同一供应商,不同型号)时,我希望它具有相同的格式,但实际上是 NV12。
Reinterpret-casting NV12 as I420 然后将其转换为 NV21 就是这里发生的事情。