c++ - ffmpeg - 比较 2 个 AVFrames 数据

标签 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的数据是否完全相同?

最佳答案

我认为您对“正确工作”的定义定义不明确。基本上,问题是:您在比较什么以及您认为有何不同?

首先,您的函数:它仅比较 Y 数据的 8 位平面,即这只适用于 8 位平面数据格式。您的 AVFrame 的格式是什么? (检查AVFrame->format!)如果不是AV_PIX_FMT_YUV420PAV_PIX_FMT_YUV422PAV_PIX_FMT_YUV444P之类的东西,这个函数行不通。

第二,算法:如果所有像素都变暗一个值,则该函数的差值将是 100%,但图像看起来仍然大致相同。那么,对于这种情况,100.0% 的值是您想要的吗?为什么不使用更普遍接受的图像相似度度量,例如 MSE或相关表达式 PSNR ?还有替代指标,例如SSIM .

如果您不喜欢其中任何一个,并且想要使用您的代码,当您说它“无法正常工作”时,您能定义一下您的意思吗?您使用了什么输入以及实际和预期的输出是什么?

关于c++ - ffmpeg - 比较 2 个 AVFrames 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37272437/

相关文章:

c++ - 抽象工厂模式客户端代码

c - 将数组传递给函数形参

c - 带有条件变量的简单生成器监控程序

C# Process StandardInput 和 StandardOutput 与 FFmpeg 卡住

c++ - 学生管理系统C++

c++ - Dijkstra 算法实现的性能

c++ - 如何更新 code::blocks 以使用 TDM-GCC?

c - 打印包含 void* 的链表元素

objective-c - Mac 将音频和视频文件合并在一起

image-processing - Python 和 ffmpeg 创建不同的 tiff 堆栈