Image 图像二值化解释:未知图像格式

Image 图像二值化解释:未知图像格式,image,opencv,image-processing,rgb,dji-sdk,Image,Opencv,Image Processing,Rgb,Dji Sdk,假设我得到了某种格式的图像(它的二进制表示形式,比如说,OpenCV中的cv::Mat或Android中的YuvImage,未压缩),并将其数据解释为YUV NV21(好的,这是DJI SDK提供的示例,基本上是这样)。以下是我得到的: 由此,我假设原始格式不是NV21。YUV2?RGB888?RGB32?还有别的吗 人们如何猜测二进制数据的原始格式 如果这有帮助的话,该帧取自DJI无人机流。YUV图像输出使用Android库,根据所使用的设备产生不同的YUV格式 在我的例子中,根据我使用的两

假设我得到了某种格式的图像(它的二进制表示形式,比如说,OpenCV中的cv::Mat或Android中的YuvImage,未压缩),并将其数据解释为YUV NV21(好的,这是DJI SDK提供的示例,基本上是这样)。以下是我得到的:

由此,我假设原始格式不是NV21。YUV2?RGB888?RGB32?还有别的吗

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


如果这有帮助的话,该帧取自DJI无人机流。

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

在我的例子中,根据我使用的两个设备中的哪一个,我需要切换两个颜色通道(NV12到NV21)的字节

是什么真正帮助我理解了我使用以下YUV播放器的格式:

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

虽然我不知道您是否需要它,但我会提供切换频道的方法

/**
 * 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;
}
/**
*将NV12 yuv帧更改为NV21格式。基本上两个颜色通道是切换的。
*
*@param yuvFrameNV12以NV12格式显示YUV帧。
*@param width帧的宽度。
*@param height框架的高度。
*@返回NV21格式的YUV帧。
*/
专用静态字节[]convertNV12toNV21(字节[]yuvFrameNV12,int-width,int-height){
最终整数长度=yuvFrameNV12.length;
对于(int i1=0;i1=宽度*高度){//在亮度字节后开始
字节tmp=yuvFrameNV12[i1];
yuvFrameNV12[i1]=yuvFrameNV12[i1+1];
yuvFrameNV12[i1+1]=tmp;
}
}
返回yuvFrameNV12;
}

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

Android的YuvImage希望您为它提供NV21,所以我有一个从I420到NV21的有效转换方法。当我改变一个视频源(同一个供应商,不同的型号)时,我希望它的格式相同,但事实上,它是NV12


将NV12重新解释为I420,然后将其转换为NV21就是这里发生的事情

建议:将数据解释为灰度,并将结果发布为图像。添加有关帧大小(字节)和预期分辨率的信息。当读取为灰度时,保持原始宽度,并将图像高度设置为以字节/宽度为单位的大小。(以NV21为例,灰度高度为原始高度*1.5)发现问题,自己回答了这个问题。无论如何,谢谢你的评论:)你的见解有助于理解发生了什么。谢谢你的回复。最后,我发现了问题,自己回答了这个问题。尽管如此,您的一些信息还是非常有用(yuvplayer),因此,请进行投票