ffmpeg - 比较2个AVFrame数据

时间:2016-05-17 09:37:36

标签: c++ c ffmpeg

我有2个AVFrame指针

float compareFrame(AVFrame* firstFrame, AVFrame* secondFrame)
{
    int i,j;
    const size_t image_size = height * width;
    size_t diffbytes = 0;

    for (i=0; i < height; i++)
    {
        for (j=0; j < width; j++) {
            size_t coord = firstFrame->linesize[0]*i + j;
            diffbytes += !!(firstFrame->data[0][coord] ^ secondFrame->data[0][coord]);
        }
    }
    const float percent_diff = (diffbytes / (float)image_size)*100.0;
    return percent_diff;
}

但是在比较2个相同的AVFrame时似乎不正确。如何确定两个AVFrame具有完全相同的数据?

1 个答案:

答案 0 :(得分:0)

我认为你对'#34;正确工作&#34;的定义定义不明确。基本上,问题是:你在比较什么,你认为有什么不同?

首先,您的功能:它只比较Y数据的8位平面,即这仅适用于8位平面数据格式。您AVFrame的格式是什么? (查看AVFrame->format!)如果不是AV_PIX_FMT_YUV420PAV_PIX_FMT_YUV422PAV_PIX_FMT_YUV444P,则此功能无法正常工作。

其次,算法:如果所有像素的值都变暗,则此函数的差值将为100%,但图像看起来大致相同。那么,这个场景的价值是100.0%吗?为什么不使用更普遍接受的图像相似度量标准,例如MSE或相关表达式PSNR?还有替代指标,例如SSIM

如果你不喜欢这些,并且想要使用你的代码,那么当你说它没有&#34;工作正常时,你能说出你的意思吗?&#34 ;?您使用了什么输入以及实际和预期输出是什么?